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.

[参考译文] TMS570LC4357:I2C 主器件在数据可用之前读取设置标志

Guru**** 2466550 points


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

https://e2e.ti.com/support/microcontrollers/arm-based-microcontrollers-group/arm-based-microcontrollers/f/arm-based-microcontrollers-forum/1115273/tms570lc4357-i2c-master-reads-set-the-flag-before-the-data-is-available

器件型号:TMS570LC4357

尊敬的 Sirs:

在从外部 ADC 读取数据时、I2C 的实现存在问题。

顺序为:

1) 1)设置 I2C 从机地址

2) 2)将 Mode 设置为 I2C 主机

3) 3)将方向设置为 I2C 发送器

4) 4)设置开始

5) 5)发送地址

6)在  i2cREG1->STR 中检查 I2C_TX_INT

7) 7)读取 i2cREG1->DRR 以清除标记

8) 8)设置"开始"

9) 9)将方向设置为 I2C 接收器

10) 10)从 ADC 接收2个字节

11) 11)设置停止

12)接收最后一个字节(第3个)

13) 13)清除 SCD

该算法在许多小时内工作正常、但有时在步骤10中、在实际字节到达 I2C 模块之前设置 Rx 标志(在步骤7中清除)、从而导致读取0x00。

结果是、我们读取0x00-byte1-byte2、而不是字节1-byte2、从而导致 ADC 读数错误。

我尝试更改序列7-9、以便在输入10之前重置标志)、结果相同。

因此、I2C 模块似乎是错误地设置 Rx 标志。

是否有任何线索知道为什么会发生这种情况以及如何解决这种情况?

谢谢你

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

    您好!

    我认为#9和#8应该被交换。 为什么在读取第3个字节之前放置#11?

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

    你(们)好。

    首先、我必须要说明的是、很难找到有关如何使用 I2C 外设的库或良好文档。 实施过程花费了一些时间、并且基于我在互联网上找到的一些代码示例(包括 TI I2C 主设备演示代码)和目标方实验。

    插拔#9和#8确实是我想知道并测试的结果、但它没有改善结果、问题仍然存在。

    我还在#8之后移动了#7、以减少 I2C 模块错误设置 Rx 标志的时间。 结果相同。

    关于#11、在读取最后一个字节之前、这是我理解的必须完成的操作。 当它在实际发生前接收到最后一个字节时、告诉 I2C 模块发送 STOP。 它运行正常、我认为它与报告的问题不相关、但如果不是真的需要、代码会更干净、没有这种奇怪的技巧。

    请注意、该函数每20ms 执行一次、为了捕捉故障、我们必须让系统工作数小时。 因此、发生的概率非常低、因此很难进行调试。 我更希望此代码基于良好的文档、而不是基于试用和错误。