I2C死锁产生机理及解决办法-Anlogic-安路社区-FPGA CPLD-ChipDebug

I2C死锁产生机理及解决办法

在I2C实际使用过程中,最容易出现的一个问题就是死锁 ,其主要表现为:SCL持续为高,SDA持续为低。

 

产生机理

I2C死锁产生的机理是:

当Slave输出应答信号或者输出数据0时,Master发生异常复位,此时SCL会保持或被释放为高电平,但因为Slave没有复位,就会继续应答,保持SDA为低电平,直到SCL变为低电平;

Master复位后,检测到SCL为高,SDA为低,则认为I2C总线被占用,然后一直等待总线被释放(SCL、SDA均为高);最终Master和Slave相互等待,形成I2C死锁现象。

图片[1]-I2C死锁产生机理及解决办法-Anlogic-安路社区-FPGA CPLD-ChipDebug

I2C时序

 

 

I2C死锁问题无法从根本上避免,除了Master异常复位导致I2C死锁,Slave在正常通信过程中也有可能异常拉低SDA导致死锁。

 

解决方法

I2C死锁问题的解决方法主要有两种:

1、 Master检测到SDA被拉低超过一段时间后,主动复位Slave,使其释放SDA;但这种方法需要Slave有复位引脚,且Master可以控制Slave的复位引脚使之复位。

2、 Master检测到SDA被拉低超过一段时间后,推送9个Clock到SCL总线上(当死锁发生在Slave发送的第1位数据上时,最多需要9个时钟周期才能结束通讯),使Slave释放SDA为高电平。

 

参考资料

 

1. I2C总线协议和死锁原因,南山扫地僧

2. I2C死锁及恢复方法,日拱一卒不期而至,知乎

请登录后发表评论

    没有回复内容