I2C总线死锁问题介绍
-
在I2C通信中,如果主机出现异常复位,就会有概率导致总线死锁,出现这个问题后,我们就需要一些特殊手段来解锁总线。接下来我来介绍一下死锁问题的原因及解决方案:
I2C死锁现象:
I2C总线SCL为高,SDA一直为低,通信一直处于异常状态I2C死锁原因:
在I2C主设备进行读写操作的过程中:主设备在开始信号后控制SCL产生8个时钟脉冲,然后拉低SCL信号为低电平,在这个时候,从设备输出应答信号,将SDA信号拉为低电平。如果这个时候主设备异常复位,SCL就会被释放为高电平。
此时,如果从设备没有复位,就会继续I2C的应答,将SDA一直拉为低电平,直到SCL变为低电平,才会结束应答信号。而对于I2C主设备来说.复位后检测SCL和SDA信号,如果发现SDA信号为低电平,则会认为I2C总线被占用,会一直等待SCL和SDA信号变为高电平。这样,I2C主设备等待从设备释放SDA信号,而同时I2C从设备又在等待主设备将SCL信号拉低以释放应答信号,两者相互等待,I2C总线进人一种死锁状态。解锁方案:
- 在硬件设计上,MCU通过控制MOS来开关I2C从机的电源。
- 从机带复位引脚的话,可以通过MCU IO控制,让从机硬件复位
- 在检测到总线死锁后,MCU将SCL配置为GPIO,并输出9个CLK信号
Demo演示:
芯片:YTM32B1ME05
硬件环境:YTM32B1ME0-EVB-Q144
内容:演示上述方案3,即通过翻转SCL引脚解锁总线-
在YCT下载ME05的I2C Master Demo,该Demo是MCU和eeprom通信
-
在I2C通信过程中多次复位,便有概率出现I2C死锁问题
-
在出现错误后加入unlock操作
-
验证OK
代码工程:
I2c_Master_Demo.zip
参考资料:
https://blog.csdn.net/fengel_cs/article/details/50563291
帮助没办法联网的电脑使用YCT
帮助改进和优化YT CONFIG TOOL,有机会抽取YTM32B1ME0 EVB哦...