F
现场调试过 I2C 的人都被咬过:总线 SDA 被从机拉死,主控怎么都发不出 STOP。这篇讲清成因分类,再把常见恢复手段按可靠性排一遍。
一、锁死为什么发生
1. 传输中途复位:主控复位/掉电后,从机(尤其带页缓冲的 EEPROM、扩展器)状态机停在"发一半字节",其开漏输出保持低——总线的"第 9 个时钟"永远等不到;
2. 从机电源先掉后升时序错乱;
3. 强干扰下 SCL/SDA 毛刺被从机误认为 START/数据位;
4. 多主仲裁失败后的边界 bug(部分老器件行为不完全符合规范)。
后果:SDA 恒低 → 任何 START 都发不出 →"不重启就永远锁着"。
二、恢复手段可靠性排序
1. 9 时钟法(推荐,几乎零成本):硬件设计时把 SCL 留一个 GPIO 推挽能力(或经模拟开关切换),总线发现 SDA 低时切 GPIO 模式,手动打最多 9 个时钟:从机的移位寄存器会输出完整字节并释放 SDA,随后发 STOP。STM32/Linux i2c-gpio 都有现成恢复例程;
2. 从机电源独立可控:给敏感从机(多路复用器、带电机状态的器件)加 MOS 开关或使能脚,锁死时对从机断电重启而主控和其他设备不掉电;
3. 总线开关/缓冲器故障隔离:PCA9548 类多路开关可以在不中断主设备的前提下把锁死支路断开;带 RESET 脚的缓冲器(PCA9517 类)可直接复位芯片状态机;
4. 上电顺序管理:从机上电晚于总线空闲的判断,避免复位窗口内误时序;
5. 软件看门狗监测:读寄存器超时连续 N 次才触发恢复,避免"看门狗乱复位"掩盖真故障;
6. 最后的核选项:整机看门狗重启——能用但已经输了,因为它把锁死从"30 秒恢复"变成"业务中断+日志缺失"。
三、预防性设计条目(抄进 checklist)
□ 每个 I2C 总线的 SCL 可被主控单独拉出时钟(GPIO 复用);
□ 上拉电压与从机电源域一致,或经缓冲器隔离电平(混合电压总线的经典锁死源);
□ 关键从机(复用器)用带 RESET 的型号并接主控;
□ 总线长度/容性核算:>3.3 nF 上拉电阻变小时上升沿变慢,误码诱发锁死;
□ 带 ESD/D 滤波时注意电容不能大到破坏建立时间。
四、冷知识
某些从机被"读到一半复位"后,需要先发 dummy WRITE RESET (0x06) 广播才能解锁(规范没有这个,厂商各自实现)——多主器件的 errata 一定要读。
你们产线上 I2C 锁死的 Top 3 根因是什么?我们统计:热插拔(背板 I2C)> 从机复位时序 > 长线干扰。欢迎补数。
一、锁死为什么发生
1. 传输中途复位:主控复位/掉电后,从机(尤其带页缓冲的 EEPROM、扩展器)状态机停在"发一半字节",其开漏输出保持低——总线的"第 9 个时钟"永远等不到;
2. 从机电源先掉后升时序错乱;
3. 强干扰下 SCL/SDA 毛刺被从机误认为 START/数据位;
4. 多主仲裁失败后的边界 bug(部分老器件行为不完全符合规范)。
后果:SDA 恒低 → 任何 START 都发不出 →"不重启就永远锁着"。
二、恢复手段可靠性排序
1. 9 时钟法(推荐,几乎零成本):硬件设计时把 SCL 留一个 GPIO 推挽能力(或经模拟开关切换),总线发现 SDA 低时切 GPIO 模式,手动打最多 9 个时钟:从机的移位寄存器会输出完整字节并释放 SDA,随后发 STOP。STM32/Linux i2c-gpio 都有现成恢复例程;
2. 从机电源独立可控:给敏感从机(多路复用器、带电机状态的器件)加 MOS 开关或使能脚,锁死时对从机断电重启而主控和其他设备不掉电;
3. 总线开关/缓冲器故障隔离:PCA9548 类多路开关可以在不中断主设备的前提下把锁死支路断开;带 RESET 脚的缓冲器(PCA9517 类)可直接复位芯片状态机;
4. 上电顺序管理:从机上电晚于总线空闲的判断,避免复位窗口内误时序;
5. 软件看门狗监测:读寄存器超时连续 N 次才触发恢复,避免"看门狗乱复位"掩盖真故障;
6. 最后的核选项:整机看门狗重启——能用但已经输了,因为它把锁死从"30 秒恢复"变成"业务中断+日志缺失"。
三、预防性设计条目(抄进 checklist)
□ 每个 I2C 总线的 SCL 可被主控单独拉出时钟(GPIO 复用);
□ 上拉电压与从机电源域一致,或经缓冲器隔离电平(混合电压总线的经典锁死源);
□ 关键从机(复用器)用带 RESET 的型号并接主控;
□ 总线长度/容性核算:>3.3 nF 上拉电阻变小时上升沿变慢,误码诱发锁死;
□ 带 ESD/D 滤波时注意电容不能大到破坏建立时间。
四、冷知识
某些从机被"读到一半复位"后,需要先发 dummy WRITE RESET (0x06) 广播才能解锁(规范没有这个,厂商各自实现)——多主器件的 errata 一定要读。
你们产线上 I2C 锁死的 Top 3 根因是什么?我们统计:热插拔(背板 I2C)> 从机复位时序 > 长线干扰。欢迎补数。

