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.

[参考译文] TMS320F28388D:EEPROM 读取问题、意外读取导致 I2C 总线锁定

Guru**** 2405245 points


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

https://e2e.ti.com/support/microcontrollers/c2000-microcontrollers-group/c2000/f/c2000-microcontrollers-forum/1510022/tms320f28388d-eeprom-read-issue-unexpected-read-cause-i2c-bus-locked

器件型号:TMS320F28388D
主题中讨论的其他器件:F28385D

工具/软件:

尊敬的专家:

我的客户使用的是 F28385D。 他们发现、当他们尝试 从 EEPROM 读取 2 个字时、 总线上会意外出现三个读取字。

如下图(顶部)所示、它们向 EEPROM 写入 2 个字、然后读回 2 个字以进行验证

但是、将有 3 个读取字。 如图下半部分所示、这种行为有时会导致总线被 EEPROM 锁定。 即使我们尝试使用 GPIO 功能手动拉取 SDA 线、F28388 也无法生成停止条件。  

其 EEPROM 读取函数从 ex4 i2c 示例复制。 如下图所示、读取大小配置为 2。

他们希望在控制卡上重现此问题、但电路板上只有用于 EtherCAT 的 EEPROM 上存在此问题。 他们不确定是否应该使用它。

有什么想法如何解决?

此致、

挂起

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

    您好 Hang、

    对不起,延误,请再给我一天回来给你。

    此致、

    Aishwarya

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

    挂起、

    第三个字是随机读取、还是过早读取下一个预期数据? 在读取第二个数据后、它们是否插入了任何延迟? 确保在第二次读取后正确处理 RRDY 标志、防止 将来发生读取。  

    如果需要、客户可以将外部 EEPROM 与控制卡一起使用。

    此致、

    Aishwarya

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

    尊敬的 Aishwarya:

    我认为 CC 上的 EEPROM 仅连接到 ESC、I2C 模块无法访问它。

    第三个字是下一个预期数据。 我们正在查看 RRDY 标志或使用非重复模式、因为数据长度是固定的。

    此致、

    挂起。  

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

    挂起、

    我认为 CC 上的 EEPROM 仅连接到 ESC、I2C 模块无法访问它。

    是的、是这样。 由于这个原因、我指的是外部 EEPROM、而不是 CC 上的 EEPROM。

    是否启用了重复模式? 如果是、客户可以不使用它来尝试查看结果吗?

    我来运行这个示例、然后返回给您。 如果他们不使用该功能、而只是执行该操作、是否会发生相同的问题?

    此致、

    Aishwarya

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

    尊敬的 Aishwarya:

    他们厌倦了使用非重复模式的 ex2。 运行示例时没有问题。 但是、当他们将 ex2 集成到应用中时、问题仍然会发生、但并非总是发生(可能性仍然很高)。

    客户的中断已做好安排、因此他们不能使用额外的中断。 必须删除 ex2 中的中断。

    它们的数据读取代码如下所示、该代码可以使用控制卡重现 I2C 锁定(请参阅波形末尾)、如下所示。

    您能帮我们看看吗?

    不确定代码是否正确、我仍在检查它。 如果不正确、您能否提供一个无中断的简单数据读取示例代码?  

    此致、

    挂起。

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

    挂起、

    我假设使用的是这个函数、而不是原始问题中的函数。 代码本身看起来不错、但我认为 最好添加示例 2 中的 if 语句、从而确保仅在地址设置阶段完成时才发送停止条件、而不是仅仅添加延迟。  

    另外,在 F2838x 中,它应该是 I2C_ControllerReceiver () 函数,而不是  I2C_MasterReceiver ()。 较旧的设备使用 I2C_MasterReceiver ()。 也许这也是问题所在?

    此致、

    Aishwarya

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

    尊敬的 Aishwarya:

    它应该是 I2C_ControllerReceiver ()

    我   现在使用它应该是 I2C_ControllerReceiver ()。

     最好添加示例 2 中的 if 语句、以确保仅在地址设置阶段完成时才发送停止条件。  [/报价]

    EX2 在读取阶段完成后发送停止条件、地址设置阶段和读取阶段之间似乎没有停止。

    我连接了 I2C 锁定发生时的波形。  

    这发生在读取阶段结束时、此时读取过程仅读取一个字节后停止。

    如右侧面板中所示,正确的模式就像设置写入 — 两个字节-设置读取 — 两个字节,但在最后一轮中,设置读取后只有一个字节。  

    由于该误差发生在读取阶段的末尾、因此它应该与使用 IF 语句执行相位转换的天气无关。

    您是否知道导致上述 I2C 锁定的原因?

    这可以通过用上述代码替换 ex2 中的 while 循环来重现。 numofbyte 设置为 2。

    此致、

    挂起。

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

    挂起、

    我将在我这边更多地研究这一点,看看我是否可以重现它。 我将离开办公室直到下周初,但会尽快回到你. 感谢您的耐心!

    此致、

    Aishwarya

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

    挂起、

    除了禁用  I2C_REPEATE_MODE 之外、还应确保将 I2CCNT 寄存器设置为要发送和接收的所需字节数的正确值。 I2CCNT 的价值是什么?

    此致、

    Aishwarya

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

    尊敬的 Aishwarya:  

    我通过 I2C_setDataCount () API 将其设置为 2。

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

    尊敬的团队:

    更新进度。

    我能够确定重现问题的条件。

    这是关于设置 STP 位的时序。 在本例中、我使用 driverlib API 来设置 stP 并通过 GPIO 监视其时序、并通过延迟控制其时序、如下所示:

    通过这 种方式、我们可以观察设置 STP 的时序、如下所示(停止条件稍后生成,下一帧正常出现)

    事实证明、如果设置 STP 的时序接近当前帧的“最后两个时钟“、则会导致 SCL 锁定为低电平。

    从上述波形开始、如果我向 STP 添加 1us 延迟、 SCL 将一直处于低电平。

      

    同时、锁定时 SCA 的级别取决于 EERPOM 对读取的响应。 如果 IT 响应为零(我提前向其写入零)、我将一直处于低电平。

    无论 SCA 电平如何、SCL 都被锁定、这是意外的。 如果 SCA 和 SCL 均锁定为低电平、并且用户此时复位 I2C、则 SCL 将变为高电平、SCA 保持低电平、I2C 总线将保持锁定状态、只有 EEPROM 上的 I 下电上电才能解锁该总线。

    在实际应用中、在设置 STP 之前不会有用途的延迟、但是、 在后台会有中断使 I2C 停止、其影响类似于延迟。

    通过调整设置 STP 的延迟、我找到一个设置 STP 将导致 SCL 锁定的范围。

    在这种情况下、导致 SCL 锁定的机制是什么?

    如果客户继续使用重复模式、如何控制设置 STP 的时序以避免 SCL 锁定?(不使用任何中断)

    此致、

    挂起

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

    挂起、

    感谢您的更新。 我们将与我们的设计专家一起探讨这一点、然后再回来联系您。 感谢您发送编修。

    此致、

    Aishwarya

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

    挂起、

    经过进一步调查、我们 可以看到正在设置 RRDY 状态标志(作为内部 I2C 模块流程的一部分)、但该位未在 SW 中清除(因为假设是清除仅由用户设置的标志)、从而锁定总线。 请将以下代码行添加到   i2cLib_FIFO_Polling.c 文件中的 I2C_ControllerReceiver () 函数中、如下所示:

        I2C_clearInterruptStatus(I2CA_BASE, I2C_INT_RX_DATA_RDY); // Needed only in INT mode
        I2C_clearStatus(I2CA_BASE, I2C_STS_RX_DATA_RDY);

    类似的想法适用于 您清除 XRDY 标志的 I2C_ControllerTransmitter() 函数。 请告诉我。

    此致、

    Aishwarya

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

    尊敬的 Aishwarya:

    我们今天尝试了如下清零 RRDY

    但是、锁仍然存在。

    • 您能检查一下我们是否正确清除了 RRDY 吗?
    • 如果这对您有利、您能否提供上述屏幕截图、并通过 GPIO 翻转来指示 STP 时序?
    • 您能否分享一个项目来演示清除 RRDY 功能如何解决问题?

    此致、

    挂起。

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

    挂起、

    请允许我们保持该线程打开、以便进一步离线调试该线程。 将使用可见性的最终解决方案更新此主题。

    此致、

    Aishwarya

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

    挂起、

    我将关闭此主题、但如果客户有任何其他问题、请随时通过电子邮件链发送消息或制作另一个主题。

    此致、

    Delaney