I2C通讯协议
I2C简介
串口通信只能在两个设备之间进行,如果是三个设备相互通讯,那么每个设备需要两组串口,实际上是3组相互独立的串口通信。如果是4个设备相互通信就更加麻烦了,最突出的问题就是线路连接比较复杂。
为了解决这个难点,人们设计了一种总线通讯,总线通讯有很多种协议,例如:USB、SPI、CAN、IIC。重点介绍IIC通讯。IIC(Inter-Integrated Circuit)也可写作I2C,意思是芯片与芯片之间的通讯。是一种串行通信总线,使用多主从架构(模式)。例如我们的单片机是主机,而其他设备都是从机。
好处:节约了单片机IO口的资源,降低了PCB布线成本等。
通讯模式:多主从模式
通信设备之间的地位是平等的,分为主设备和从设备,其中主设备一个、从设备多个。主设备要主导整个通信过程,从设备根据I2C协议被动的响应主设备;
在I2C通信中,没有规定谁做主设备、谁做从设备,是通信双方自己协商的。一个设备在同一时间只能做主设备或者从设备。有的设备可以通过软件配置来决定在此次通信时做主设备还是从设备。
通信特征
串行:只有一根数据线(SDA),每次传输一个bit位;
同步:主从设备工作频率相同,主设备通过SCL时钟线给从设备提供时钟频率;
半双工、低速率
I2C总线通信协议
1、主设备发送一个起始信号;
2、主设备接着发送8bit数据,其中高7位是从设备的地址,最后一位表示此次主设备是要读数据还是写数据;
3、和主设备发送的地址匹配的从设备发出一个ack响应信号;
4、主/从设备将数据发送到SDA总线上,每次传输都是8bit数据;
5、主/从设备从SDA线上接收数据,并发送一个ACK响应信号;
6、重复发送和接收的过程,直到主设备发送停止信号,停止本次通信;
四个状态
空闲态:当SCL和SDA同时为高电平时,为空闲态。
起始状态:当主设备在I2C总线上发出起始信号,标志着开始通信。此时必须在时钟信号为高电平期间,数据信号完成由高到低的跳变。这样起始信号就发送完了。
忙态:主从设备正在通信。
停止状态:当主设备在I2C总线上发出停止信号,停止本次通信。当时钟信号为高时,数据信号需要由低到高的跳变。
数据线高低电平控制
如果某一时刻有两个设备要发送数据,例如从设备1发送了一个1(高电平)、设备2发送了一个0(低电平),最终数据线上是高电平还是低电平呢?
如下图,在芯片IO口的内部一般会有两颗MOS管,上面的MOS管导通就输出高电平、下面的MOS管导通就输出低电平。当我们把两个IO口都挂在一根总线上,如果一个芯片输出高电平,一个芯片输出低电平,那么电流就直接从电源流入到地。红色的线实际上就短路了,必定会有元器件的烧毁。
为了解决这个问题,I2C总线对于设备的IO口做了一些处理:去掉了上面的MOS管,同时在总线上加一个上拉电阻(取值通常为4.7K)与电源连接。因此总线默认为高电平状态(空闲态)。
芯片想输出低电平就导通MOS管,输出高电平只需要关闭MOS管即可(即:OD开漏输出)。
I2C时序结构
发送字节
SCL低电平时期,主机将数据位依次放到SDA线上(高位在前),然后拉高SCL,从机在高电平期间读取数据位。所以SCL高电平期间,SDA不允许有数据变化。依次循环上述过程8次,即可发送一个字节。
接收字节
SCL低电平期间,从机将数据位依次放到SDA线上(高位在前),然后拉高SCL,主机将在SCL高电平期间读取数据位,所以SCL高电平期间SDA不允许有数据变化。(主机在接收之前,需释放SDA)
发送应答
在接收完一个字节后,主机在下一个时钟发送一位数据,0代表应答、1代表非应答;
接收应答
在发送完一个字节后,主机在下一个时钟接受一位数据,判断从机是否应答。0代表应答,1代表非应答。(主机在接收之前需释放SDA)
(未完)