I²C从设备掉电后,整条总线通信异常
同一条I²C总线上挂了多个器件,其中一个模块断电或热插拔后,其他设备也可能跟着通信失败。问题不一定出在主控程序,而可能是掉电器件对SDA、SCL的钳位、反向供电,或者总线状态没有恢复。
一个模块断电,其他地址也读不到
做多传感器板卡时,主控通过一条I²C总线同时连接温度传感器、EEPROM和其他器件。正常上电时每个地址都能响应;但给其中一个传感器模块单独断电以后,原本工作正常的其他器件也开始超时,有时重启主控都无法立即恢复。
看到“所有地址都没有应答”,很容易先改扫描程序、加重试次数,或者怀疑主控的I²C外设死机。可I²C使用开漏或开集电极方式拉低SDA、SCL,由上拉电阻恢复高电平。只要有一个器件把总线维持在异常电平,其他设备也可能无法正常通信。
关键先看是哪一种异常:SDA一直为低、SCL一直为低,还是高电平只能升到一两伏?这些波形背后的原因不完全一样。不要把所有通信超时都归结为“总线锁死”,更不能一上来只靠软件发送时钟脉冲。

图1:I²C异常波形示例,SCL仍有活动,SDA却没有回到正常高电平。
掉电器件仍可能影响总线电平
一些I²C器件在VCC为0V时,并不保证SDA、SCL对外部总线完全呈高阻态。主控侧仍有3.3V上拉,信号引脚却连到了没有供电的从设备,芯片内部的保护结构或输出级可能改变总线电平,甚至出现从信号脚向掉电电源域反向供电的现象。
TI关于I²C热插拔的资料给过一个很有代表性的现象:某些普通器件的总线侧电源悬空时,3.3V总线信号可能被钳位到约2V。此时看起来并不是彻底短路,但其他器件能不能把这个电平识别成有效高电平,已经要看实际输入门限和余量。
也有另一类情况,器件在一次传输中途复位、欠压或错过时钟,内部状态停在发送数据的阶段,导致SDA持续被拉低。这种总线状态异常与“掉电端口钳位”是两条不同的排查路径。
前一种问题要重点看器件的Powered-off行为和电源域设计;后一种问题才适合研究I²C总线恢复时钟、器件复位和看门狗处理。两种情况如果不区分,软件改了很多遍,硬件电平依然不会正常。
先量SDA、SCL,再测掉电模块的VCC
排查时,可以先让系统在全部器件供电的情况下工作,记录SDA、SCL高电平以及通信波形。然后只断掉可疑模块的供电,对比总线高电平、低电平和上升时间变化。注意不要在没有保护设计的情况下对不支持热插拔的接口反复带电插拔。

图2:总线缓冲器的故障恢复波形,断开故障段后发送时钟尝试释放总线。
如果掉电后SDA、SCL高电平明显偏低,还可以检查该模块的VCC有没有被信号线抬起来。明明关掉供电,VCC却还残留一个异常电压,这时就要怀疑通过接口引脚发生了反向供电。
如果SDA被固定拉低,恢复供电或单独复位从设备后立即正常,则更像是从设备状态异常。可以结合逻辑分析仪找到出问题的那一次传输,看看是否在ACK或数据位阶段中断。
即便主控可以发送9个SCL脉冲尝试恢复总线,也不能认为这是万能办法。对于物理钳位、端口仍被外部电路拉低的情况,额外时钟并不会改变掉电器件的内部供电状态。
多电源域I²C,设计阶段就要留余地
如果几个I²C从设备始终共用同一个电源,掉电状态可能并不明显;但工业板卡、传感器扩展模块、热插拔子板和可单独关电的模块,会把这个问题放大。电源上电顺序、外部上拉接到哪个电源域,都应在原理图阶段确认。
有些器件Datasheet会明确写Power-off protection、Ioff、Hot-swap等参数,表示它们在掉电或插拔场景下对总线的行为有专门设计。需要隔离故障模块时,可以考虑合适的I²C缓冲器、开关或带故障恢复能力的器件,例如可将下游故障段与主总线分开的方案。

图3:带总线故障恢复功能的TCA4307模块,适合了解上下游总线隔离的实现方式。
选用缓冲器也要核对双向电平、总线电容、上拉电阻和速率限制,不能看到支持I²C就直接替换。调试完成后,最好把“其中一个模块掉电时,其他模块是否仍能通信”列入系统测试,而不仅仅测试所有器件正常上电时的情况。
当一条总线突然影响了多个设备,先看电平是否还成立,再看协议状态是否恢复。确定是物理电平问题还是通信状态问题,后面才知道该改硬件还是改固件。
声明:
本文由凡亿教育整理,转载请注明来源!
投稿/招聘/广告/课程合作/资源置换 请加微信:13237418207

扫码关注












































