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.

[参考译文] MSPM0L1305:如何通知 I2C 目标释放 I2C 总线? (SDA 卡在低电平)

Guru**** 1869600 points
Other Parts Discussed in Thread: MSPM0L1305, BQ76952
请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

https://e2e.ti.com/support/microcontrollers/arm-based-microcontrollers-group/arm-based-microcontrollers/f/arm-based-microcontrollers-forum/1365314/mspm0l1305-how-to-inform-an-i2c-target-to-release-the-i2c-bus-sda-stuck-low

器件型号:MSPM0L1305
主题中讨论的其他器件: BQ76952

您好!

背景:

我目前使用的定制电路板使用 MSPM0L1305作为主 MCU、通过 I2C 与两个 BQ76952芯片通信。 在 MCU 复位时、我有时会观察到 I2C 总线卡在低电平、导致程序在等待退出"总线忙"状态时无限期地挂起。 只有当我通过断开并重新连接电源将 BQ76952芯片完全复位后、I2C 总线才会恢复。

问题:

在这种情况下、主机 MCU 是否可以通过任何方式通知目标(BQ76952)释放总线?

我被告知、生成9-10个 SCL 周期的控制器会实现该操作。 如果这是推荐的解决方案、您能否提供生成特定数量时钟周期的正确方法?

谢谢!

李京宰

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

    尊敬的 Kyungjae:

    通常是 I2C 目标器件创建时钟延展(使 SCL 保持低电平)、因此在这种情况下、其中一个或两个 BQ76952器件未准备好响应并将 SCL 线保持在低电平。  对于从这种情况中恢复、MSMP0可以做的事情不多。  如您所述、完全恢复的唯一方法是对 BQ 器件进行循环通电。

    您可以将 BQ 器件与 I2C 总线隔离吗?换句话说、您一次只能运行一个器件、以查看问题是否与某个特定 BQ 有关? 您可以监控 I2C 总线吗、看看是什么命令或事务导致 BQ 进入时钟扩展模式吗?

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

    您好、Dennis、

    为了澄清这一点、保持低电平的不是 SCL 线、而是 SDA 线。 (我已经有一种权变措施、使用 MCU 的"Timeout A"功能使 SCL 保持低电平。)

    为了回答您的问题、此问题不会在程序运行时自行发生。 只有当我在程序运行时通过按下电路板上的复位按钮来复位 MCU 时、才会出现这种情况。 在我看来,有一个导致这种行为的具体时机。

    写入当前程序是为了仅与两个 AFE 中的一个进行通信、此处的一些快照显示了捕获行为的时刻。

    放大了通信的最后一部分:

    最后一部分进一步放大了:

    希望这对您有所帮助!

    谢谢!

    李京宰

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

    尊敬的 Kyungjae:

    根据最后两个映像、我怀疑可能发生的情况是、当您在 I2C 事务的中间对 MSMP0进行复位时、这会使 BQ 器件处于某种不完整的读取或写入状态。 有效事务需要总线上任何 I2C 器件的 I2C 启动条件和 I2C 停止条件。  在 MSMP0复位之后、MSPM0开始向 BQ 发送一个新的事务、但 BQ 需要先看到之前事务中的 I2C 停止位、然后才能开始处理这个新事务。  我建议先尝试创建 I2C 停止条件、将 MSPM0 I2C 引脚配置为 GPIO、然后将其重新配置为 I2C。  但是、如果 I2C 总线的状态使得 BQ 器件在 SDA 线上随时钟输出的过程中、这将不起作用、因为当 BQ 器件处于此状态时、MSPM0将无法控制 SDA。

    我假设 MSMP0复位仅在您的开发/调试过程中发生、并且在实际操作中、MSPM0和 BQ 器件都要进行复位、因为它们第一次上电时、是这样的吗?

    您能发布您分享的波形的 Saleae .sal 捕获文件吗?

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

    如果目标器件保持(仅限) SDA 为低电平、您可以将 SCL 切换到 GPIO 并发送(8+1)个时钟脉冲。 在其中一个脉冲时、目标将释放 SDA、以下脉冲将被视为 NACK。

    这在 I2C 技术规范(UM10204版本7)第3.1.16节("总线清除")中进行了说明。  

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

    您好、Dennis、

    我想您的解释是正确的。 它完全符合我所观察到的情况。

    要回答您的问题、复位 MSPM0仅作为我们开发/调试过程的一部分进行。 在实际操作中、一旦程序启动并运行、仅 MCU 复位不太可能发生、但我仍然认为有必要在程序开始时实施"总线清除"逻辑、因此当我出于某种原因需要在现场复位 MCU 时、我不需要担心这一点。

    此外、请找到随附的.sal 捕获文件。 (https://drive.google.com/file/d/1rK8iIzxLhdUiE9--ED9gjLBml__UpxOc/view?usp=drive_link)

    谢谢!

    李京宰

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

    Bruce、您好!

    感谢您的深入见解并将我引导至文档。 为了生成时钟脉冲、我需要做的似乎只是临时将 SCL 引脚切换到 GPIO 输出引脚并多次切换以模拟(8+1)时钟脉冲。 我是对吗?

    谢谢!

    李京宰

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

    可以。 将 SCL 配置为输出(GPIO)是没有问题的、因为您是主器件(并且您知道 SCL 是空闲的)。  

    我建议发送全部9个脉冲-任何额外的脉冲都将被忽略(由于 NACK)。

    我用它从丹尼斯所描述的那种状况(大师"消失"的中间交易)中恢复。

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

    非常感谢 Bruce -我不知道这一点。

    Kyungjae -请尝试一下,并告诉我们这是否对你有效。

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

    您好、Dennis、

    由于我能够通过手动将 SCL 线路短接至 GND 几次来清除总线(以模拟8+1时钟周期)、我非常确信 Bruce 建议的方法也可行。

    另外,为了其他面临类似情况的人的利益,我想  在论坛的另一个部分分享路易斯·H·S 提出的另一个解决办法。 BQ76952:如何通知目标器件(bq76952)释放 I2C 总线? (SDA 卡在低电平)

    感谢大家!

    此致、

    李京宰