IIC总线协议简介
- IIC是一种串行,半双工总线,用于近距离,低速的芯片间的通信。
- IIC总线有两根双向的信号线,一根数据线SDA用于收发数据,一根时钟线SCL用于通信双方时钟的同步。
- IIC总线是一种多主机总线,连接的器件分为主机和从机,主机可以进行发起和结束一次通信,从机只能接收。
- 每个连接到IIC总线上的期间都有唯一的地址,且为7bit。
- 多主机同时启用总线,IIC具有冲突检测和仲裁的功能防止出现错误。
- IIC总线的设备的SCL和SDA均要配置成开漏输出模式
- SCL和SDA各要添加一个上拉电阻,组织4.7千欧左右
编辑
IIC总线通信过程(宏观)
1)主机发送起始信号启用总线
2)主机发送一个字节数据指明从机地址和后续字节传送方向:主机发送的一个字节中,[7:1]位表示被寻址的从机地址,第0位表示发送方向,为0时表示主机发从机收,为1时则相反。
3)被寻址的从机发送应答信号回应主机
4)发送器发送一个字节数据
5)接收器发送回应信号回应发送器
6)不断循环 4、5
7)主机发起停止信号,释放总线
IIC总线信号实现
起始信号和停止信号
起始信号: 在 SCL 为高电平时, SDA 由高变低
停止信号: 在 SCL 为高电平时, SDA 由低变高
备注:起始信号和停止信号只能由主机发出,当起始信号产生,总线就处于占用状态,停止信号后总线则处于空闲状态。
字节传送和应答信号
IIC总线通信发送的每个字节是8位,且和串口相反,是先发送高位在发送低位,并且接收器每接收1个字节数据后都要发送应答信号来回应,也就是说,每一帧通信都是9位。
同步信号
IIC总线进行数据传送时,为了保证主机和从机同步,发送数据的规定如下,
当时钟线SCL为低电平时,发送器向数据线上发送一位数据,且在此期间数据线上的信号允许变化;时钟线SCL高电平时,接收器从数据线上读取一位数据,此期间数据线上的信号不允许变化。
总结就是,SCL这条线就是告诉发送器和接收器什么时候发送数据,什么时候接收数据。
典型IIC时序
- 主机向从机发送数据
- 从机向主机发送数据
- 主机先向从机发送数据,然后从机在向主机发送数据
备注:阴影部分代表主机向从机发数据,无阴影部分表示数据由从机发送给主机;
此外A表示应答,A非表示不应答,S表示起始信号,P表示停止信号。
从时序3中我们会发现,主机向从机发送数据后,为了切换收发数据方向,直接再次发送起始位而没有先发送停止位在发送起始位,这个是因为如果先发送停止位的话,那这个期间很可能总线的使用权被其他主机抢占,就导致无法正常切换完成整个时序,所以这种方式是被允许的。