IIC协议介绍
GaoSheng Lv4

IIC由飞利浦公司开发,对硬件的依赖小(如果代码使用的软件IIC,移植起来非常方便),半双工,高位先行,带数据应答。支持总线挂载多设备(一主多从、多主多从)

抗干扰能力弱,低速,短距离
(异步时序的好处就是省一根时钟线,节省资源。但对时间要求严格)

同步时序对时间要求不严格,对硬件电路依赖小。 但多一根时钟线

标准模式:100Kbit

High-Speed 模式:3.4Mbit/s

主机拥有对SCL线的完全控制,空闲时主机可以发起对SDA的控制

只有在从机发送数据和从机应答时,主机才会移交SDA的控制权给从机

从机的权利较小,对于SCL时钟,在任何时候都只能被动的读取。从机不允许主动发起对SDA的控制

在SCL的高电平(下降沿)采集SDA上面的数据

保证SDA只能在SCL为低的时候发生数据位的反转

设备的主机和从机都要设置成开漏输出模式

image

起始条件和终止条件

接收一个字节:

SCL低电平期间,从机将数据位一次放到SDA线(高位先行),然后释放SCL,主机将在SCL高电平期间读取数据位,所以SCL高电平期间SDA不允许有数据变化,依次循环上述过程8次。即可接收一个字节(主机在接收这前,需要释放SDA)

image

应答机制:数据0表示应答,数据1表示非应答。简单来说是一个低电平

IIC总线上的所有数据都是以8位字节传送的。发送器每发送一个字节,就在第9个时钟脉冲期间释放数据线,由接收器反馈一个应答信号。应答信号为低电平时,规定为有效应答(ACK简称为应答位),表示接收器已经成功接收到了该字节

ACK就是响应信号,每个字节后面都应该有响应信号,表示Slave成功响应了Marter,在Master产生的第九个时钟,Master放开SDA的控制权,Slave拉低了SDA,并持续整个时钟的高电平,因此ACK是属于Slave的动作。

仲裁:时钟同步采用线与

时钟拉长是一种SLK持续为低的总线状态

image

不是每个IIC设备都有这个功能,大部分的slave设备都不具备这个功能

一个设备可能能够快速的接受数据,但是其存储数据需要时间,因此在接受数据并发送ACK之后,拉低SCL,表明占用总线直到其做好接收下一字节数据的准备

从字节的角度理解,多个Master一起,高速的SCL会被低速的SCL降速,这个过程跟时钟同步相同。

image

IIC锁死:

IIC总线写操作的过程中,主机在产生启动信号控制SCL产生8个时钟脉冲,然后拉低SCL信号为低电平,在这个时候,从机输出应答信号,将SDA拉成低电平。

如果这个时候主机异常复位,SCL就会被释放为高电平,此时,如果从机复位,就会继续IIC应答,将SDA一直拉成低电平,直到SCL变为低电平,才会结束应答信号。而对于主机来说,复位后一直在检测SCL和SDA的信号,如果发现SDA信号为低电平,则会认为IIC总线被占用,会一直等待SCL和SDA变为高电平。

这样,主机等待从机释放SDA信号,而同时从机又在等待主机将SCL信号拉低以释放应答信号,两者相互等待,IIC总线进入一种死锁

同样,当IIC进行读操作时,从机应答后输出数据,如果在这个时刻主机异常复位而此时从机输出的数据刚好为0,SCL会变成高电平,但是从机一直等待主机拿数据,也会导致IIC总线进入死锁状态

SCK的占空比可以低一点,因为只能在时钟线低的时候变化SDA

I2C从地址要左移1位?

这是i2c协议决定的,i2c地址实际为7位。剩下的一位用来判断是读还是写。

本站由 提供部署服务