I2C死锁产生机理与解决方法

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

产生机理

I2C死锁产生的机理是:当Slave输出应答信号或者输出数据0时,Master发生异常复位,此时SCL会保持或被释放为高电平,但因为Slave没有复位,就会继续应答,保持SDA为低电平,直到SCL变为低电平;Master复位后,检测到SCL为高,SDA为低,则认为I2C总线被占用,然后一直等待总线被释放(SCL、SDA均为高);最终Master和Slave相互等待,形成I2C死锁现象。

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死锁及恢复方法

posted @ 2023-08-03 12:30  Wcat  阅读(1091)  评论(0编辑  收藏  举报