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-F28379D:具有中断的 I2C -在400kHz 频率下工作、但不支持100kHz 频率下的 n#39;t。

Guru**** 2529560 points
Other Parts Discussed in Thread: PCF8574

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

https://e2e.ti.com/support/microcontrollers/c2000-microcontrollers-group/c2000/f/c2000-microcontrollers-forum/670662/launchxl-f28379d-i2c-with-interrupts---works-with-400-khz-but-doesn-t-with-100-khz

器件型号:LAUNCHXL-F28379D
主题中讨论的其他器件:PCF8574

大家好、

我根据您的 EEPROM 示例编写了自己的库来处理 i2c、该示例使用中断和 API 来处理79D。 这是主循环中的代码:

while (1)
{
COUNTER++;
uint16_t DATA[]={0x0F、0x1F、0x2F、0x3F、0x4F}; 
I2C_lib_MasterWriteRead (&I2cMaster、SLAVE_ADDRESS、DATA、5、0); while (I2cMaster.status!= I2CM_STATUS_READY); I2C_lib_MasterWriteRead (&I2cMaster、SLAVE_ADDRESS、DATA、0、5); while (I2cMaster.status!= I2CM_STATUS_READY); I2C_lib_MasterWriteRead (&I2cMaster、EEPROM_address、data、2、1); while (I2cMaster.status!= I2CM_STATUS_READY); }

当 I2C 以400kHz 的频率运行时、此代码工作正常。 但是、当我将 I2C 速度设置为100kHz 时、它在一个事务后会冻结 while 环路。 当我在 WriteRead 函数之间设置一些延迟时、它的工作频率为100kHz、例如:


对于(I = 0;I < 100000);I++)
COUNTER++ 

但是、正如我说过的、它在400kHz 频率下工作。 我可以在示波器和逻辑分析仪上看到 SDA 线。 当以400kHz 的频率运行时、一切都正常、例如启动、ACK 和停止条件。

我不知道为什么它在100kHz 频率下不工作。 我正在使用 TI 提供的 API、并且我正在使用中断、因此单个位应该不会打扰我...

我感谢你的任何帮助。

BR、
Dawid。

PS: 我的代码位于附件中。

e2e.ti.com/.../pcf8574.zip

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

    那么、您说它一直在等待状态进入 I2CM_STATUS_READY 吗? 应该在 ISR 中设置状态吗? 您是否曾尝试在 ISR 中放置断点以确保它正常运行?

    惠特尼
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    此外、请确保在 I2cMaster 对象上使用 volatile 关键字。 我不知道您使用的优化级别、但如果您打开优化器、则可能状态不会重新读取、因为它位于该循环中。

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

    您好、Whitney、

    我在 I2cMaster 对象上尝试了 volatile 关键字、但出现警告:

    说明资源路径位置类型
    "volatile I2C_Master_t *"类型的#169-D 参数与"I2C_Master_t *"类型的参数 main.c /PCF8574行35 C/C++问题不兼容

    回答您之前的问题:

    1) 1) 那么您说它一直在等待状态转至 I2CM_STATUS_READY? -是的

    2) 2) 状态是否应在 ISR 中设置? -是的

    3) 3) 您是否尝试在 ISR 中放置断点以确保它正常运行? 不,老实说,我不知道我应该在哪里注意这一点。

    关于优化:

    我想它是关闭的。

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

    我将结构声明为:typedef volatile struct I2C_Master。 它仍然挂起、但我意识到正在发生一些奇怪的事情。 查看图片:

    查看 ReadData 表。 ReadData 被声明为无符号字符、因此它应该是8位值。 但调试器显示为0x8A0B。 怎么可能?

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

    由于优化器处于关闭状态、因此易失性不会产生影响。 如果您稍后再打开优化器、则需要注意的是这一点。

    在 C28上、16位是可单独寻址的最小位数、因此我们的字符和字节为16位。 不过、仍然可以使用__byte()和__mov_byte ()内在函数一次访问8位数据。 您可以在我们的编译器用户指南的"TMS320C28x C/C++语言实现">"数据类型"一章中详细了解这一点。

    www.ti.com/.../getliterature.tsp

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

    好的、我明白了。  

    与此同时,我解决了我的问题。 我只需添加一个循环、在该循环中我检查停止条件状态。 正确的步骤如下所示:

    while (I2C_getStopConditionStatus (I2CA_BASE)) counter++; 

    I2C_lib_MasterWriteRead (&I2cMaster、SLAVE_ADDRESS、DATA、0、5); while (I2cMaster.status!= I2CM_STATUS_READY);

    非常感谢您的帮助和重要信息。 我非常感谢。

    BR、

    Dawid。