跳转至内容
  • 版块
  • 最新
  • 标签
  • 热门
折叠
品牌标识

YunTu Forum

YTMicro.com
  1. 主页
  2. Discussion & Question
  3. YT MCAL
  4. MD14 I2C SCL 对地短路恢复后总线通讯失败

MD14 I2C SCL 对地短路恢复后总线通讯失败

已定时 已固定 已锁定 已移动 YT MCAL
1 帖子 1 发布者 32 浏览
  • 从旧到新
  • 从新到旧
  • 最多赞同
登录后回复
此主题已被删除。只有拥有主题管理权限的用户可以查看。
  • quanfengQ 离线
    quanfengQ 离线
    quanfeng YunTu
    编写于 最后由 编辑
    #1

    1. 问题背景

    1. 软件:MD14 MCAL2.3.0 CddI2c_Master_Demo
    2. 硬件:MD14 EVB
    3. 背景描述:
    • 客户测 I2C 设备的失联恢复,及将 I2C 的 SCL 对地短路,然后恢复,检测恢复后 I2C 总线是否可以正常通讯;
    • MCU 的 I2C0 Master Mode,I2C 收发使用同步模式
    • 客户将 I2C 的 SCL 对地短路,恢复后 I2C 总线无法正常发送

    2. 问题分析

    2.1 问题复现

    1. 使用 CddI2c_Master_Demo 进行复现,使用逻辑分析仪抓取波形
    原工程:
    #define I2C_RX_MODE     (I2C_TRANS_IN_SYNCMODE)
    修改后:
    #define I2C_RX_MODE     (I2C_TRANS_IN_ASYNCMODE)
    
    1. 正常烧入 CddI2c_Master_Demo 到 MD14 EVB 板后,将 SCL 对地短路后进行测试。SCL 对地短路后 SCL 电平呈现常低,SDA 电平呈现常高,松开 SCL 对地短路后 SCL/SDA 电平均为常高,但 I2C 总线通讯失败

    ae455856-9c93-4b7f-8810-b5a8bbd6a1c7-image.png

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

    065b8965-524f-4213-b792-5e0d178ac1bb-image.png

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

    bd6e1fae-6a40-4279-9308-63f6c49d95c2-image.png

    2.1.1 排查方向一

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

    ae41bf8d-ee9f-4927-98f3-d28b9f3928d7-image.png

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

    60fdd1ee-8b6d-49f6-9738-b4590b8b8dba-image.png

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

    243b7060-38c5-4440-809b-ce9d8ea37e8e-image.png

    2.1.2 排查方向二

    1. 推测是总线死锁导致的 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”

    943959a4-8371-4b4f-a1e4-d6f367d98502-image.png

    1. 按照死锁的方式处理,SCL 对地短路恢复后,MCU 将 SCL配置为 GPIO,并输出 9 个 CLK 信号。实际测试也无法回复 I2C 总线通讯。

    3. 解决方案

    1. 方案一:
    • 检测 I2C 状态为 I2C_CHN_ERROR_PRESENT 的情况下,先反初始化 I2C 后,再重新初始化 I2C 即可恢复

    efd0d3dd-3ad2-43e1-bc0b-5afe70d7c8e2-image.png

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

    88c1d22c-5a8b-4f02-a759-380049a8adb7-image.png

    1 条回复 最后回复
    1

  • 云途开发生态介绍

    快速上手云途开发生态

  • 云途论坛规则/Yuntu Forum Rules

    发帖前请查看

  • YT CONFIG TOOL调查问卷

    帮助改进和优化YT CONFIG TOOL,有机会抽取YTM32B1ME0 EVB哦...

  • can
    23
    demo
    20
    uds
    13
    lin stack
    12
    md14
    6
    fbl
    5
    yt-link
    5
    adc模块
    4
    Online Users
    Tiger987T
    Tiger987
    • 登录

    • 登录或注册以进行搜索。
    • 第一个帖子
      最后一个帖子
    0
    • 版块
    • 最新
    • 标签
    • 热门