MD14 I2C SCL 对地短路恢复后总线通讯失败
-
1. 问题背景
- 软件:MD14 MCAL2.3.0 CddI2c_Master_Demo
- 硬件:MD14 EVB
- 背景描述:
- 客户测 I2C 设备的失联恢复,及将 I2C 的 SCL 对地短路,然后恢复,检测恢复后 I2C 总线是否可以正常通讯;
- MCU 的 I2C0 Master Mode,I2C 收发使用同步模式
- 客户将 I2C 的 SCL 对地短路,恢复后 I2C 总线无法正常发送
2. 问题分析
2.1 问题复现
- 使用 CddI2c_Master_Demo 进行复现,使用逻辑分析仪抓取波形
原工程: #define I2C_RX_MODE (I2C_TRANS_IN_SYNCMODE) 修改后: #define I2C_RX_MODE (I2C_TRANS_IN_ASYNCMODE)- 正常烧入 CddI2c_Master_Demo 到 MD14 EVB 板后,将 SCL 对地短路后进行测试。SCL 对地短路后 SCL 电平呈现常低,SDA 电平呈现常高,松开 SCL 对地短路后 SCL/SDA 电平均为常高,但 I2C 总线通讯失败

- 将 SCL 对地短路后 Debug 查看 I2C 寄存器,MSTS -> BUSY 位置 1,I2c_MasterHwStatePtr = I2C_CHN_BUSY_STATUS。

- I2C 发送 API CddI2c_SyncModeTransfer 函数里会判断 I2c 状态,此时 TempChannelStatus = I2C_CHN_ERROR_PRESENT 的情况下 API 是不会调用底层发送,所以 SCL 对地短路恢复后,I2C 总线通讯依旧无法恢复。

2.1.1 排查方向一
- 推测是 I2C TOCFG Register 对 SCL 和 SDA 的常低检测导致的 SCL 对地短路恢复后总线通讯失败。但 TOCFG -> SDA 位为 0 的时候只检测 SCL 低电平超时时间,TOCFG -> SCL 位为 1 的时候检测 SCL 和 SDA 低电平超时时间,因此 SCL 低电平超时检测是无法关闭的

- 在 I2C_Lld_MasterConfig 函数里将 I2C_Lld_MasterFeatureConfig 注释掉后,TOCFG -> SDA 位就不会被置 1,SDA 的低电平超时将不会被打开,此时使用逻辑分析仪抓取 I2C 设备的失联恢复的波形

- 将 SDA 对地短路后进行测试。SDA 对地短路后 SDA 电平呈现常低,SCL 电平呈现常高,松开 SDA 对地短路后 SCL/SDA 电平均为常高,但 I2C 总线通讯失败,此时 SDA 常低检测处于未打开的情况,所以可以排除低电平超时导致的 I2C 总线发送失败的推断

2.1.2 排查方向二
- 推测是总线死锁导致的 SCL 对地短路恢复后总线通讯失败。参考 SDK 总线死锁的解决方案“https://forum.ytmicro.com/topic/603/i2c%E6%80%BB%E7%BA%BF%E6%AD%BB%E9%94%81%E9%97%AE%E9%A2%98%E4%BB%8B%E7%BB%8D”

- 按照死锁的方式处理,SCL 对地短路恢复后,MCU 将 SCL配置为 GPIO,并输出 9 个 CLK 信号。实际测试也无法回复 I2C 总线通讯。
3. 解决方案
- 方案一:
- 检测 I2C 状态为 I2C_CHN_ERROR_PRESENT 的情况下,先反初始化 I2C 后,再重新初始化 I2C 即可恢复

- 方案二:
- CDDI2C MCAL 配置里 I2cBusIdleTimeout 配置是超时的配置,默认是 0(不开启),但当前版本测试开启后不生效。当前驱动没有检查这种情况的一个处理,后续 MCAL 版本更新后会修复

快速上手云途开发生态
发帖前请查看
帮助改进和优化YT CONFIG TOOL,有机会抽取YTM32B1ME0 EVB哦...