i2c驱动调试总结

遇到i2c通信失败的情况,可从下面几个方面入手。

1.电源,复位脚状态确认,注意芯片规格书需要配置的特殊信号脚。
2.留意同一路i2c的其他设备,如有存在设备没上电,或者复位脚状态异常,都可能拉低i2c引脚,导致i2c死锁。
3.正确配置i2c,量i2c波形,一般i2c都预留测试点,遇到没有测试点的情况,只能通过飞线来测量信号了。怀疑该路i2c的问题,将芯片接到另一组i2c去尝试(或者换其他芯片看是不是芯片引起的异常信号)
4.检测芯片的引脚由没有画错,遇到过芯片SCL和SDA弄反的情况。

下面分享下调试i2c遇到过的案例。

      在Android下调试一款UBLOX设备。该UBLOX支持i2c和usb接口,这里使用的是i2c接口。查看原理图,该i2c接到一个普通的io上。这里,首先将该io配成i2c功能。烧写修改过的镜像后,对应的i2c总线总线有了。进行通信时,发现通信失败。测量i2c波形,发现i2c波形异常(更换上拉电阻)。让硬件的同事检查电路并修改后,i2c波形已正常。再次实验,发现ublox还是没有应答。再次检查UBLOX的供电,复位脚没发现异常。测量UBLOX的两个晶振产生的方波,发现其中的一个晶振产生的方波异常,改完电路后,cpu跟UBLOX通信正常,该UBLOX也定位成功,调试完成。

        调试G-SENSOR mc3410的时候,发现休眠后,唤醒后无法正常通信。检查i2c的供电,没发现异常。初步怀疑挂在该i2c上其他设备引起的I2C总线异常。硬件的同事通过拆除其他芯片的方法,发现只有不挂上某个i2c设备,G-SENSOR工作正常。最终定位到该芯片的复位脚导致了i2c总线异常,导致G-SENSOR通信失败。其实,这是一次典型的i2c总线锁死,因为某一个从设备复位(复位脚控制有误),导致i2c的时钟线或者数据线拉低,cpu的i2c无法正常发出信号(i2c是线与的关系,拉低就是0,那么主机发出高电平,线与一下还是0,导致i2c锁死)。关于i2c总线锁死,具体的可参考https://www.jianshu.com/p/95f53ca2724e。

      异常i2c信号https://blog.csdn.net/mike8825/article/details/80962420

      i2c波形https://blog.csdn.net/mike8825/article/details/80961858

      I2C串联保护电阻和上拉电阻的选择https://blog.csdn.net/jhn199388/article/details/74330813

 

 

你可能感兴趣的:(IIC)