I2C挂死(I2C锁死)问题的终极对策方法
本文给出了针对I2C挂死问题的四种对策方案。大家可以根据成本维度,对策效果维度,软件or硬件维度来选择具体的对策方案。
【写在前面的一些废话】
I2C这种通信,除了便宜,其他都是缺点的总线来说,的确会出现挂死的情况。尤其是软件时序错乱或者有外部噪声干扰时都会发生挂死。尽管你小心翼翼的此后他,他还是可能会不定期的死给你看。更要命的是无法自我恢复。
比如,如下这种复现波形,这也是最常见的一种挂死方式。就是SDA被拉低。

总之就是乱七八糟的各种原因,I2C挂死。并且也有很多文章分析挂死原因了。话不多说,我们进入正题,如何对策。
【对策方法】
对策方式当然也有很多,笔者认为最有效果的就是如下四种。其他都是花拳绣腿。

方案①
是纯软件方案。也就是说,当I2C挂死的后,由于MCU的I2C接口死掉了无法对其进行I2C的重置唤醒。比较简单的方式就是不用硬件的I2C资源,而是采用GPIO模拟I2C的方式实现通信。这样方便监控当I2C挂死的时候,用程序控制GPIO,初始化I2C总线,达到唤醒I2C的目的。
方案②
从机电源设置为可控,发生I2C挂死后,主控对从机电源进行重启。优点是可行性高,物料成本低。最推荐的就是这个方案。这个是软件和硬件结合的方案。挂死之后软件需要通过GPIO重启从设备的电源即可。如果知道是哪个从机挂死,也可以针对性的充气挂死的从机的电源。


方案③
总线上增加缓冲器芯片。可以降低总线上的总线电容。
这个可以参考“可热插拔型 I2C 总线缓冲器”例如NXP的“PCA9517A”的datasheet
方案④ I2C总线上加缓冲器,带有总线挂死恢复功能(例如IT的TCA4307)
本方案为纯硬件方案稳定性高,当然价格也高。


如图所示,按照上述方案改造,人为强行干预总线,总线挂死之后可以自我恢复。
【总结】
以上方法中,作为硬件工程师来说尤其推荐方案2或者方案4。
如果这样还不能对策你的I2C挂死问题,你来留言找我。我们一起探讨。
更多推荐



所有评论(0)