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作为主 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 卡在低电平)
感谢大家!
此致、
李京宰