I2C 死锁及恢复方法

本文探讨了I2C通信中常见的死锁现象及其原因,包括从设备在回复ACK或数据位时主设备异常复位。解决死锁的方法包括主设备主动复位从设备、推送9个Clock取走ACK、使用I2C缓冲器以及在软件设计中考虑死锁恢复机制。同时,文中提到在实际场景中,由于DMA异常复位导致的I2C死锁问题,通过检测并重新初始化i2c硬件来解决。
摘要由CSDN通过智能技术生成

I2C 是常用的串行通信协议,常见于主控和一些外设的通信中,比如主控和外部 EEPROM、传感器等的通信都会用到 I2C 通信。

在实际使用过程中,I2C 比较容易出现的一个问题就是死锁,今天就来介绍一下 I2C 死锁产生的原因以及如何解决死锁问题。

I2C 由串行数据线 SDA 和串行时钟线 SCL 组成,SDA 和 SCL 在空闲时都处于高电平状态。SCL 由主设备来产生,SDA 上既可以传输主设备发给从设备的数据,也可以传输从设备发给主设备的数据。从设备在接收完一个字节的数据后,需要在第九个 clock 回复给主设备一个 ACK 信号,此时从设备会把 SDA 拉低,等待主设备控制 SCL 从高到低取走 ACK 位。

死锁的产生常见的有两种情况:

  1. 从设备在回复 ACK 时主设备异常复位。
  2. 从设备在回复数据位是 0 的时候主设备异常复位。

两种情况的相同点都是主设备异常复位时 SDA 处于被从设备拉低状态,而主设备复位后 SCL 处于高电平状态(空闲状态)。此时从设备会等待主设备拉低 SCL 取走 ACK 或者数据位,而主设备会等待从设备释放 SDA 线。主设备和从设备互相等待,隔空对望,进入死锁状态。

解决死锁问题的几种常见方法:

  1. 主设备在检测到 SDA 被拉低超过一段时间后,主动
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

嵌入式Linux系统开发

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值