项目背景:MCU+陀螺仪芯片,通讯总线为I2C总线,应用中需要GD303多次复位。
问题:debug过程中,反复reset单片机,会出现从机不回应的现象,读不到从机的数据,SDA一直为低。
分析:主机发送数据,从机拉低数据线发送数据,然后等待下一个时钟,此时主机突然复位,没了时钟脉冲,而程序重新跑了,你的I2C API接口肯定先判断总线是否繁忙再拉低拉高SCL进行通信,与此同时,从机一直占用着SDA线,等待主机的时钟线,所以主机判断总线繁忙,通讯异常,即使主机重新复位总线也不行。
按照通用方法:发送8个SDL时钟脉冲,调试也不行。
我的解决办法:当从机busy没有回应超时,把SDA和SCL设置为普通输出IO模式,把SCL拉高,延时1ms,再复用为I2C总线进行通讯,多次在keil debug模式下软件复位是OK的,稳定的,没有再出现读不到数据的现象。
具体情况具体分析,死锁的解决方法各位不同,无非是设置为两个普通IO口,拉低几次拉高几次,就可以愉快的进行I2C通信了。