简介
IIC(也称I2C或I2C)总线是Philips公司开发的一种简单、双向二线制同步串行总线,是Inter-Integrated Circuit的缩写。
IIC只用两条双向线,一条SDA(Serial Data Line)和一条SCL(Serial Clock Line),两条都是开漏输出,需要通过上拉电阻接VCC。IIC是一个多主机的总线,任何连接到总线的节点都可以作为主机和从机,但同一时刻只能有一个主机。
IIC的理论理想传输距离为15M,但是由于干扰和传输速率的提高,实际上会远小于15M,一般只适合用于板极器件的通信,不适合中长距离通信。在高速模式下,IIC传输速度在标准模式下可达100Kbps,快速模式下可达400Kbps,高速模式下可达3.4Mbps,但是速度越快可靠性越低。
硬件连接
主机和从机通过上图的方式接入总线,前面说到,IIC总线的SDA和SCL均需要通过上拉电阻接VCC。IIC使用7位寻址,除去0000000的广播地址,理论上一条IIC总线可以挂载27 – 1 = 127个节点,每个节点有一个地址。
通讯过程
1)位传输
IIC怎么通过SDA和SCL两条线来传输0和1比特位呢?首先SCL线必须是由主机时钟控制的,否则就乱套了,SDA主机从机都可以控制。如果主机或从机想要发送比特位“1”,则只要在SCL为高电平时,把SDA拉到高电平(“1”)。同理,想要发送比特位“0”,则只要在SCL为高电平时,把SDA拉到低电平(“0”)。
在正常的数据传输中,当SCL为高时,要求SDA的电平稳定,否则就会认为是其他动作,如下图:
当SCL为高,但是SDA由高变为低时,定义为起始动作,表示主机要开始传输数据了;当SCL为高,但是SDA由低变为高时,定义为停止动作,表示结束数据的传输。
2)数据帧
前面说到,我们已经可以发送“0”和“1”了,那具体怎么传数据呢?
主机与从机的通信数据帧如上图,流程如下:
- 首先主机发送起始动作(S),总线上的从设备收到后就知道主机要读/写数据了。
- 然后主机发送要与其通信的从机的地址(SLAVE ADDRESS)和读写位(R/W)表示时要读还是写,从机在收到地址时与自己的地址比对,发现与自己地址相符时拉低SDA线表示ACK,其他与地址不符的从机自动退出此次通讯。
- 这时主机还需要发送要访问的寄存器地址,上图没有体现出来,但是流程跟发送从机地址是一样的,后面也要从机ACK。
- 这时候主机就开始传输数据,每传输完一个Byte从机就回复一个ACK。
- 最后传输完毕主机发送停止动作(P),然后主从机释放总线。
这里的ACK是从机对主机的响应,主机每次发完数据后会释放SDA并监听SDA的电平。如果从机正常接收到数据,则把SDA的电平拉低,主机检测到SDA电平变低了,说明数据被成功接收。如果SDA在主机监听时间范围内还是处于高电平,则说明数据接收失败。
下图是主机从从机读数据时总线上电平变化,这里需要注意的是主机需要读取数据时,需要先告诉从机和要读的寄存器地址(DUMMY WRITE),然后再一次发送起始动作和从机地址,随后开始释放SDA并监听。此时由从机控制SDA的电平,图中DATA n段就是从机控制SDA电平来向主机发数据,同样,主机每接收完一个Byte后发ACK。
下图是主机往从机写数据时总线上电平变化。