IIC总线基础知识
一、简介
IIC(Inter-Integrated Circuit)是一个多主从的串行总线,又叫I2C,是由飞利浦公司发明的通讯总线,属于半双工同步传输类型总线。它仅使用两条线就能完成多机通讯,一条SCL时钟线,另外一条双向数据线SDA。
二、原理
1、开漏输出&上拉电阻
-
IIC协议支持多个主设备与多个从设备在一条总线上, 如果不用开漏输出, 而用推挽输出, 会出现主设备之间短路的情况。
-
开漏输出还能实现线与,用于切换不同主设备。
-
需要上拉电阻是因为开漏输出只有低电平与高阻态两种状态,而IIC需要有输出高电平的能力。
下图为开漏输出电源短路示意图
2、空闲状态
空闲状态: IIC总线的SDA和SCL两条信号线同时处于高电平时,规定为总线的空闲状态。在空闲状态期间,输出场效应管均处在截止状态,即释放总线,由两条信号线各自的上拉电阻把电平拉高。
3、起始信号&停止信号
起始信号: 当 SCL 线是高电平时 SDA 线从高电平向低电平切换,表示通信的开始。
停止信号: 当 SCL线 是高电平时 SDA 线由低电平向高电平切换,表示通信的停止。
下图为起始信号(S)和停止信号(P)的示意。
4、应答信号&非应答信号
应答信号(ACK): 主机发送8bit数据后,会再产生一个时钟。此时主机释放SDA,上拉电阻使SDA电平为高,从机拉低SDA信号。
非应答信号(NACK): 主机发送8bit数据后,会再产生一个时钟。此时主机释放SDA,上拉电阻使SDA电平为高,从机不拉低SDA信号。
发送器每发送一个字节,就在时钟脉冲9期间释放数据线,由接收器反馈一个应答信号。应答信号为低电平时,规定为有效应答(ACK简称应答位),表示接收器已经成功地接受了该字节;应答信号为高电平时,规定为非应答位(NACK),一般表示接收器接收该字节没有成功。
如果接收器是主控器,则在主控器收到最后一个字节后,发送一个NACK信号,通知被控发送器结束数据发送,并释放SDA线,以便主控接收器发送一个停止信号P。
下图为应答信号(ACK)和非应答信号(NACK)的示意。
5、时钟同步&仲裁
在单主设备中,不需要时钟同步和仲裁。而在多设备时,多个主设备可以同时在空闲的总线上开始发送数据,这时就需要仲裁决定哪一个来控制总线并完成它的数据传输,有时候也需要时钟同步来协同设备间的工作。而这正是通过时钟同步和仲裁来完成的。
时钟同步: 有的时候,主机的速度快于从机的速度,或者从机需要处理其他事情而不能及时地从主机接收数据或者向主机发送数据。如果从设备希望主设备降低传输速率,可以通过将SCL主动拉低,延长SCL低电平时间的方法来通知主设备。当主设备下一次传输时发现SCL电平被拉低时,就进入等待,直到从设备完成操作并释放SCL线。这就要使用时钟同步来完成。
- 时钟同步是通过连接到SCL总线的IIC接口“线与”实现。
- SCL线上的低电平时间是由时钟低电平最长的器件决定,SCL的高电平则是由高电平时间最短的期间决定。
- 时钟同步解决了IIC总线设备间的速度同步。
下图为时钟同步的示意。