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.

[参考译文] AM623:I2C 控制器卡在高负载下

Guru**** 2424970 points


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

https://e2e.ti.com/support/processors-group/processors/f/processors-forum/1543473/am623-i2c-controller-becomes-stuck-under-high-load

器件型号:AM623


工具/软件:

您好:

我们遇到了与链接的原始帖子相同的问题。

从那时起、我想检查一下、控制器在压力情景中是否存在任何已知问题?

我们的  TQMa62xx SOM 采用 AM6234、不运行 Linux、而是运行带有自己 I2C 驱动程序的 RTOS(轮询模式)。

在正常运行期间、驱动器检查“总线忙“BB = 0、然后开始传输。 新的字节由 XRDY(发送就绪)或 RRDY(接收就绪)指示。
在 ARDY(访问就绪)结束时表示完成状态、并且可以写入配置寄存器以进行下一次传输。
在正常条件下、所有 I2C 通信均正常工作。

在应力测试期间、我们可以看到在读取操作 (0x1410/0x1010) 期间设置了 XRDY、并且未设置 ARDY。
在示波器上查看时、SCL 会一直处于低电平(如 OP)。  一段时间后、SCL 会保持不变、但不再创建稳定的时钟、这可能会导致虚假状态位。

CH1:SDA、CH2:SCL

如果 3 个或更多线程在 2 个或更多内核上运行、并且每个线程在总线上连续读取或写入、则会出现此问题。  
驱动程序会对访问进行串行化处理、以确保在启动新的传输之前完成一次传输。

是否存在限制交易频率的已知硬件限制? 如果我 在呼叫之间插入一个短暂的延迟、一切都正常工作。
我将再次尝试捕获 SCL、以查看是否能够确定事务中的哪个点发生错误。

谢谢。

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

    您好、

    您使用哪个版本的 MCU+SDK?

    如果有 3 个或更多线程在 2 个或更多内核上运行、并且每个线程在总线上连续读取或写入、则会出现问题。

    此处的总线是否意味着 I2C_SDA 线?

    驱动程序对访问进行序列化、以确保在开始新的访问之前完成一次传输。

    那么、是否可以假设 I2C 总线上没有同时进行读取/写入?

    如果我 在调用之间插入一个短暂的延迟、一切都正常。

    您将此延迟保持在哪里?

    此致、

    Tushar

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

    您好:

    您正在使用哪个版本的 MCU+SDK?

    我们使用的固件来自 MCU+SDK 09.01.00。 对于应用开发、我们使用自己的驱动程序、不带 SDK。

    此处的总线是否指 I2C_SDA 线?

    是的。

    那么、是否可以假设 I2C 总线上没有同时进行读取/写入?

    是的、在硬件完成事务之前、代码只允许单线程访问硬件。

    您在哪里保留此延迟?

    作为一种快速的解决方法、延迟当前在应用程序级别、是对驱动程序的调用之间的延迟。

    最新调查显示、这可能与控制器的启动和停止条件的创建有关。 虽然驱动器 始终在控制寄存器中设置 STT 和 STP、以创建启动和停止条件、但在某个点可以看到重复的启动条件。
    发生这种情况后、控制器不会继续为 SCL 计时:  

    我继续分析行为。

    此致。

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

    你(们)好

    虽然驱动程序 总是在控制寄存器中设置 STT 和 STP、以创建启动和停止条件、但在某一时刻可以看到重复的启动条件。

    发生问题时、I2C 的状态是什么?

    是否由您实现的自定义驱动程序触发重复启动条件?  

    此致、

    Tushar

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

    您好、Tushar、

    [引述 userid=“16414" url="“ url="~“~/support/processors-group/processors/f/processors-forum/1543473/am623-i2c-controller-becomes-stuck-under-high-load/5942559

    发生问题时、I2C 的状态是什么?

    是否由您实现的自定义驱动程序触发重复启动条件?  

    [/报价]

    根据我的理解、当我在控制寄存器中设置 STT 而不是 STP 时、在稍后的点设置 STT | STP 时、会创建重复的启动条件。 我们的司机总是设置 STT 和 STP,所以我不希望在线路上重复开始。 从总线上的数据可以看出、两个线程的访问确实存在冲突。 进一步的分析表明,他们都可以同时获取旋锁。 因此、它可能不是 I2C 问题、而更像是硬件同步问题。

    此致

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

    尊敬的 M K:

    感谢您确认问题不是与 I2C 驱动程序有关、而是与线程之间的同步有关。

    您是否实施了正确的顺序来实现硬件同步?

    此致、

    Tushar

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

    您好、Tushar、

    您是否实施了正确的顺序来实现硬件同步?

    我认为它是正确同步的。 进一步的分析表明,锁定不是完全原子。 修复后、只有一个线程可以访问总线、并且错误状态不再出现。

    感谢你能抽出时间。

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

    尊敬的 M K:

    感谢您确认问题已解决。 关闭螺纹。

    此致、

    Tushar