【写在前面的一些废话】

        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挂死问题,你来留言找我。我们一起探讨。

Logo

智能硬件社区聚焦AI智能硬件技术生态,汇聚嵌入式AI、物联网硬件开发者,打造交流分享平台,同步全国赛事资讯、开展 OPC 核心人才招募,助力技术落地与开发者成长。

更多推荐