文章目录
- 一、总线结构
- 1.总线结构
- 2.仲裁
- 二、时序
- 1.start信号和stop信号
- 2.应答引号
- 3.读写时序
- (1)写时序
- (2)读时序
- 三、I2C挂死及解决方法
- 1.I2C传输特点
- 2.挂死的表现形式
- 2.挂死原因
- 3.解决方法
- 参考
一、总线结构
1.总线结构
I2C两根总线SDA与SCL均为OD门,需要接上拉电阻,实现“线与”逻辑,其中上拉电阻Rp的取值有一定要求:
1.太小会导致灌入的电流太大,使数据不稳定,甚至损坏端口
2.太大会导致SCL/SDA信号上升过缓,不满足时序要求,数据传输出错
2.仲裁
OD门,当MOS管开启时,线路被拉到地,输出逻辑0;当MOS管关闭时,线路悬浮被上拉电阻接到VDD,输出逻辑1
因此,当I2C总线上挂多个设备时,当各个设备SDA输出逻辑相同时,总线上的逻辑固定;当输出逻辑不相同时,输出逻辑为0的设备会抢到总线控制权,其实设备释放总线,发起stop信号。
二、时序
1.start信号和stop信号
(1)开始信号:SCL为高时,SDA由高变低(SDA拉低)
(2)结束信号:SCL为高时,SDA由低变高(SDA拉高)
(3)在传输数据时,SDA在SCL为低电平时改变数据,在高电平时保持不变
(4)SCL一般为master产生,当从机未准备好像主机发送数据,可通过将SCL拉低,使主机等待(位握手机制)
2.应答引号
当主机发送完8bit数据时,从机需要“告诉”主机此时自己接收情况
ACK信号:表示从机成功接收(该设计中取ACK信号为低电平)
NACK信号:表示从机未接收/接收失败(该设计中取NACK信号为高电平)
3.读写时序
(1)写时序
(2)读时序
三、I2C挂死及解决方法
1.I2C传输特点
(1)I2C总线空闲时,SCL和SDA均为高电平
(2)start信号:当SCL为高时,SDA由高到低
(3)stop信号:当SCL为高时,SDA由低到高
(4)SCL为低时,SDA才能变化;SCL为高时,SDA保持稳定
(5)I2C从设备ack响应过程:从设备将SDA拉低,等待I2C主设备将SCL拉低之后“取走”ack信号,从机再释放SDA(由低变高)
2.挂死的表现形式
表现:SCL一直为高电平,SDA一直为低电平
2.挂死原因
(1)当主设备向从设备发起I2C访问,连续发起8个脉冲后SCL拉低,从设备将SDA拉低以响应主设备,如果此时主设备异常复位,SCL变为高电平;而从设备正常工作,I2C继续响应主设备,SDA一直为低电平,那么此时对于主设备而言,检测SDA为低电平,I2C被占用,等到I2C释放,对从设备而言,SDA为低电平,等待主设备将SCL拉低后结束应答,释放SDA。与是导致:主设备等到从设备释放SDA信号,从设备等待主设备拉低SCL信号以释放应答信号造成死锁。
(2)当主设备进行读操作时,I2C从设备应答后输出数据。如果此时主设备异常复位,而从设备正好输出数据0,也会导致I2C进入死锁状态
3.解决方法
(1)选择带复位的I2C从设备
(2)I2C程序中,检测到SDA低电平超过一定时间后,在SCL总线上产生9个时钟脉冲,第9bit为ack信号,使I2C从死锁中恢复出来
(3)对I2C设备设计看门狗功能
参考
I2C死锁及解决方法I2C总线的简单理解