This thread has been locked.

If you have a related question, please click the "Ask a related question" button in the top right corner. The newly created question will be automatically linked to this question.

[参考译文] MSPM0G3507:如何知道 I2C SCL 是否异常保持在低电平时然后复位

Guru**** 2393275 points
Other Parts Discussed in Thread: MSPM0G3507

请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

https://e2e.ti.com/support/microcontrollers/arm-based-microcontrollers-group/arm-based-microcontrollers/f/arm-based-microcontrollers-forum/1511702/mspm0g3507-how-to-know-and-then-reset-if-i2c-scl-is-held-low-abnormally

器件型号:MSPM0G3507

工具/软件:

尊敬的 champs:

我向我们的客户询问这个问题。

用户使用 I2C 作为目标模式来实现 PMBus 1.2。

当 I2C SCL 异常保持在低电平时、用户如何知道然后使 I2C 模块复位?

例如、主机 I2C 挂起并保持 SCL 为低电平、然后自行复位、但 MSPM0G3507 I2C 目标似乎 会卡住并继续等待、因为 SCL 为低电平。

理想情况下、MSPM0G3507应在主机 I2C 自身复位时复位 I2C 模块。

如果 SCL 保持低电平并超过一段时间、用户是否有任何寄存器可以检查 SCL 状态、然后复位 I2C 模块?

我们知道  

18.2.3.6 SCL 时钟低电平超时

TIMEOUTA

但仍然感到困惑、是否以及如何使用它来处理这个问题。

如果 TIMEOUTA 可用于此目的、我们是否有示例代码?

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    方法1:

    在该目标 I2C 中启用 I2C 控制器模式(I2C 同时支持启用控制器和目标模式)

    读取 I2C 寄存器 20.3.39 CBMON 寄存器(偏移= 1234h)[复位= 00000003h]可定期检查 SDA 状态

    方法2:

    将 SDA 连接到另一个 GPIO/计时器输入、使用 GPIO 读取功能或计时器捕获功能检查 SDA 状态。

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    您好、Helic、

    我很困惑。

    这里是 SCL 而不是 SDA。

    您上面提到了 SDA。

    这是一个拼写错误还是您指的是另一种方法?

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    抱歉、SCL 和 SDA 的方法相同。

    这是我的错。

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    您好、Helic、

    您提到 I2C 控制器模式和目标模式可以同时使用、因此下面还有一些问题。

    1. TIMEOUTA 只能用于 I2C 控制器、但不能用于 I2C 目标模式。 对吗?

    2.由于 TIMEOUTA 可用于检测 SCL 在超时时间内为低电平、用户是否可以使用它(启用 I2C 控制和 I2C 目标模式) 、以便使用 TIMEOUTA 中断直接检测 SCL 低电平一段超时时间、这与方法3不同(上文介绍了方法1和方法2)? 还是有任何问题?

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    1. TIMEOUTA 只能用于 I2C 控制器、但不能用于 I2C 目标模式。 正确吗?

    20.2.3.6 SCL 时钟低电平超时、此处提供了此功能的说明。

    2. 由于 TIMEOUTA 可用于检测 SCL 在超时时间内为低电平、用户是否可以使用它(启用 I2C 控制模式和 I2C 目标模式)来使用 TIMEOUTA 中断直接检测 SCL 低电平一段超时时间 、这与方法3一样(上文介绍的方法1和方法2)? 还是有任何问题?

    根据20.2.3.6中的问题答案、TIMEOUA 是 I2C 目标器件的函数。

    The I2C target can extend the transaction by pulling the clock low to slow down communication. The I2C module
    has a 12-bit programmable counter that is used to track how long the clock has been held low.

    这是一种监测 SCL 的方法。

    勘误表中需要注意另一个问题: https://www.ti.com/lit/er/slaz742b/slaz742b.pdf   I2C_ERR_04与该问题有关。

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    您好、Helic、

    实际上、我们已经读取了 20.2.3.6 SCL 时钟低电平超时、但如果在目标模式或控制器模式下使用、仍然会感到困惑。

    从下面的 TRM 中可以看出、似乎暗示它是在控制器模式下隐式使用的。

    请帮助您再次确认吗?

    也可以在控制器模式或目标模式下使用?

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    实际上、我们已经阅读到 20.2.3.6 SCL 时钟低电平超时、但如果在目标模式或控制器模式下使用它、仍然会感到困惑。

    它可以在 T 模式和 C 模式下使用。

    目标超时的测试演示

    e2e.ti.com/.../i2c_5F00_target_5F00_Timeout_5F00_G3507.zip

    禁用数据自动 ACK、  

    I2C_INST->SLAVE.SACKCTL = 0x00000003
    然后、目标将提供较长的时钟延展时间、然后将触发超时 A。
    中断中有一个 BKPT、您将在调试中触发此断点。

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    您好、Helic、

    感谢您的支持。

    此外、我们发现勘误表确实很重要。 禁用后、我们发现它按预期工作。