I2C总线死锁
死锁现象
I2C在某一个特殊时刻出现异常:SLC一直为高,SDA一直为低。
死锁示例
- 当主机进行写操作时,在写数据的ACK阶段,SDA被从机拉低作为ACK,主机突然复位,SCL被复位为高电平,这样主机检测到SDA为低,会认为I2C总线被占用,一直等待SCL和SDA信号拉高。从机不知道主机异常复位,还在等待SCL拉低,然后结束ACK信号,这样主从互相等待,就造成死锁。
- 当主机进行读操作时,从机应答后输出数据,如果此时主机异常复位而从机输出的数据正好为0,也会导致死锁。
解决办法
- 采用模拟I2C。
- 将从机电源设计为可控,当出现死锁时将从机复位。
- 从机程序添加监测功能,检测到总线长时间被拉低则释放对总线的控制。
- 主机程序添加恢复功能,当主机复位后,若检测到SDA被拉低,则控制SCL产生9个时钟脉冲。