I2C 是常用的串行通信协议,常见于主控和一些外设的通信中,比如主控和外部 EEPROM、传感器等的通信都会用到 I2C 通信。
在实际使用过程中,I2C 比较容易出现的一个问题就是死锁
,今天就来介绍一下 I2C 死锁产生的原因以及如何解决死锁问题。
I2C 由串行数据线 SDA 和串行时钟线 SCL 组成,SDA 和 SCL 在空闲时都处于高电平状态。SCL 由主设备来产生,SDA 上既可以传输主设备发给从设备的数据,也可以传输从设备发给主设备的数据。从设备在接收完一个字节的数据后,需要在第九个 clock 回复给主设备一个 ACK 信号,此时从设备会把 SDA 拉低,等待主设备控制 SCL 从高到低取走 ACK 位。
死锁的产生常见的有两种情况:
- 从设备在回复 ACK 时主设备异常复位。
- 从设备在回复数据位是 0 的时候主设备异常复位。
两种情况的相同点都是主设备异常复位时 SDA 处于被从设备拉低状态,而主设备复位后 SCL 处于高电平状态(空闲状态)。此时从设备会等待主设备拉低 SCL 取走 ACK 或者数据位,而主设备会等待从设备释放 SDA 线。主设备和从设备互相等待,隔空对望,进入死锁状态。
解决死锁问题的几种常见方法:
- 主设备在检测到 SDA 被拉低超过一段时间后,主动