I2C协议
I2C协议
1.什么是I2C协议?
I2C总线是PHLIPS公司在20世纪80年代推出的一种串行总线。具有引脚少,硬件实现简单,可扩展性强的优点,I2C支持多主控,总线上的任意一个设备能够进行发送/接收数据的设备都可以占领总线。当然,任意时间点上只能存在一个主控。
2.I2C接线图
I2C通讯只有两根线一根是SCL,一根是SDA,SCL为同步时钟线用于传递时钟信号,SDA为数据线用于传递数据,因此只有一根线用于实际数据的收发,因此I2C也是一种半双工通讯协议。
3.I2C通讯特点
起始信号和结束信号都是由主机发出的,起始信号一旦发出,总线就处于被占用状态,在结束信号一旦发出后,总线就处于空闲状态。
1.起始信号
在SCL时钟线为高电平期间,数据线由高电平往低电平转变为起始信号。
2.结束信号
在SCL时钟线为高电平期间,数据线由低电平往高电平转变为结束信号。
起始信号后
3.注意事项
(1) 接收器件接收到一个完整的数据字节后,可能需要完成一些其他工作,如处理内部接收中断服务函数等,这就无法立即接收下一字节的数据,这时接收器件可将SCL线拉成低电平,从而使得主机处于等待状态。直至接收器件准备好接收下一字节数据时再释放SCL线使之为高电平。
(2) 连接到I2C总线上的器件,若具有I2C总线控制器那么很硬件会自动检测到起始、结束信号,而对于不具备I2C总线控制器的器件(单片机)来说,需要在每个时钟周期内保证对数据线SDA采样两次,捕获是否接收到起始/结束信号。
4.通信过程
(1)起始信号后,总线上所有的从机开始等待主机紧接下来的从机地址广播。因为总线上每个设备的地址都是唯一的,当主机广播的地址与某个设备地址相同时,该设备就被选中,并向主机发出应答(ACK)或者非应答(NACK),主机只有在接收到应答信号后继续发送/接收数据,没选中的设备将会忽略之后的数据信号。根据I2C协议,从机地址可以是7位或者10位。
(2)I2C总线上传输的数据包括上述的地址信号,又包括真正的数据信号。在起始信号后需传送一个从机地址(7位),第8位是数据的传输方向(接收/发送),“0”表示主机发送数据,“1”表示主机接收数据。每次数据的传输总是由主机产生结束信号以结束传输,但若主机希望继续占用总线进行新的数据传输时,则可以不产生结束信号,而是再次发送起始信号对另一从机地址寻址。
(3)若配置为写数据方向,主机开始向从机传输数据,数据包大小为8位,主机每发送完1字节数据都有等到从机的应答信号(ACK),多字节数据发送时重复此过程。传输结束后,主机向从机发送一个停止信号表不再传输数据。
(4)若配置为读方向,从机开始向主机返回数据,数据包大小还是8位。同理,从机每发送完一字节数据都要等到主机的应答信号(ACK),重复此过程可以返回多个数据。当主机希望停止接收数据时就向返回一个非应答信号(NACK),数据传输将结束。
(5) 实际I2C通讯采用的是读写复合的格式。传输过程中主机需要发出2次起始信号:第一次传输主机通过从机地址找到从机设备,发送一段数据,这个数据是从设备内部寄存器或者存储器地址;第二次传输是对该地址进行读/写。主机要读取从机数据时,主机会释放对SDA总线的控制,由从机控制SDA总线,主机负责接收信号;主机要向从机设备写数据时,SDA由主机控制,从机负责接收信号。
4.小结
I2C是嵌入式开发中最常用地协议之一,经常使用在控制板和显示屏进行通讯,以及主机和从机进行通讯中。
原文链接:https://blog.csdn.net/qq_29344757/article/details/76520378