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.

[参考译文] LAUNCHXL-F280049C:在 4 个数据包后、I2C 总线变为低电平

Guru**** 2513185 points
Other Parts Discussed in Thread: C2000WARE

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

https://e2e.ti.com/support/microcontrollers/c2000-microcontrollers-group/c2000/f/c2000-microcontrollers-forum/1530573/launchxl-f280049c-i2c-bus-goes-low-after-4-packet-of-data

器件型号:LAUNCHXL-F280049C
主题:C2000WARE 中讨论的其他器件

工具/软件:

您好、

我正在使用 C2000 i2c 驱动一个 16 位端口扩展器、并且在发送一些数据包后、总线变为低电平(数据和时钟线)。

我已经尝试过所有方法来解决它,但问题仍然存在(限制优化属性等)。  示波器上的总线快照如下:

问题可能是什么?  我们已经在 MSP430 LaunchPad 上测试了端口扩展器硬件、并且运行良好。

我的 i2c 代码如下所示:

e2e.ti.com/.../hw_5F00_i2c.cpp

你能为我回顾一下代码吗? 几个月前该代码运行良好,但不会再次。

谢谢。

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

    Abayomi,

    问题是否与此 E2E 相关? LAUNCHXL-F280049C:当我为编译器使用优化时、I2C 时钟会在一段时间后变为并保持低电平。 优化将影响时序关键型操作、我们可以对此进行进一步研究。

    如果不是,虽然我不能为您审查代码,我可以根据所述的症状提供一些建议。  由于代码之前工作并且总线显示正常的空闲状态(两条线路都处于高电平)、因此问题可能与时序或事务处理(而不是硬件配置)有关

    它看起来目标在等待控制器的同时将总线驱动为低电平(时钟延展)。 在事务之间、在开始新事务之前、请验证总线是否空闲、I2C 外设时钟设置以及 I2C 目标地址和 R/W 位是否正确。 事务之间的时序是多少、它是否满足数据表要求? 检查寄存器以进一步确认该行为。

    此致、

    Aishwarya

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

    您好、   

    感谢您的答复。  是的,这与我之前发表的帖子有关。

    我已经检查了寄存器以查看行为。  我只能说的是、在将数据发送到 i2c 总线后、时钟线变为低电平、BB 位保持高电平。  为什么我不知道。

    我还观察到、根据某些.cpp 文件的优化级别、代码运行的时间会有所不同、直到出现问题、但代码运行的时间不会超过 1 分钟   

    在我的代码中、我始终在发送之前检查停止条件、并且发送之间的时间为 4ms、这已经足够了。  i2c 配置为以 100KHz 的频率进行发送。

    问题可能是这样吗?

    谢谢

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

    Abayomi,

    由于代码操作与编译器优化相关、我认为优化会影响时序关键型操作、发送寄存器中的过时数据和目标器件的时钟延展都发生了。

    建议减少/禁用 I2C 相关代码的优化、在事务处理前添加对数据寄存器的虚拟读取、并刷新发送寄存器。 您还可以在事务之前添加总线状态检查逻辑(不仅仅是 STP、还包括 BB 条件)

    此致、

    Aishwarya

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

    您好、

    谢谢。  

    我玩过优化的 i2c reated 代码,但没有进展.  我还启用该中断来读取接收寄存器上的任何数据、它 只能得到改进、但时钟线路在一段时间后仍会变为低电平。  我会在事务之前尝试检查更多总线状态逻辑。   

    谢谢

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

    尊敬的 Abayomi:

    Aishwarya 目前不在办公室。 请期待收到延迟的回复。

    此致、

    Delaney

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

    您好、

    如果他回来,或者如果我们能有活生生的会话,那就赢了。

    谢谢

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

    Abayomi,

    我会在今天晚些时候再回来,因为我正在研究一些可能的解决方案,从我的结束,谢谢.

    此致、

    Aishwarya

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

    Abayomi,

    您能否放大范围内的问题? 不清楚该错误情况在事务中的何处发生。

    您还可以在事务处理之前添加总线状态检查逻辑(不仅是 STP、还包括 BB 条件)

    您能否确认在进行交易之前检查 BB 的结果? 您还可以 在传输后尝试轮询停止条件或 NACK:

    while(I2caRegs.I2CSTR.bit.SCD == 0 && I2caRegs.I2CSTR.bit.NACK == 0);  // Wait for a stop condition or a NACK

    我们能否添加一个  

    DEVICE_DELAY_US(100);
    之间有什么区别?

    I2C 总线上的上拉电阻是什么?

    此致、

    Aishwarya

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

    我会在这周回来的。

    我有点忙于处理其他任务。

    谢谢

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

    Abayomi,

    感谢您发送编修 。

    经过一些进一步的研究,我怀疑一个稍微不同的问题,我之前的想法。 当总线卡住时、您能否确认是否看到 I2CSTR.XRDY(发送时) 和/或  I2CSTR.RRDY(接收时)标志被设置且未被清除? 如果是、您是否可以尝试以下软件修改:

    注意:此图专门展示了根据 C2000WARE 软件示例实施情况接收 I2C 时的序列。 请根据需要对您的代码库进行修改。 当 I2C 正在传输数据时、将#3 替换为以下逻辑:  

    for(i=0; i<remainingBytes; i++)
    {
    I2C_Params->pTx_MsgBuffer[buff_pos++] = I2C_putData(base);
    }

    此致、

    Aishwarya

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

    我会尝试一下、然后回到您的身边。  谢谢

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

    好的、听起来不错、谢谢。

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

    此问题会出现延迟、因为我的硬件出现故障、需要修复。  请多多包涵

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

    Abayomi,

    没问题,因为这个主题已经打开了 3 个多月,我将继续并关闭它。 如果您有更多问题、请创建新主题。  

    此致、

    Aishwarya