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.

[参考译文] TMS320F28379D:I2C_ex6_eeprom_interrupt 示例--发送之间的延迟过长

Guru**** 2515700 points


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

https://e2e.ti.com/support/microcontrollers/c2000-microcontrollers-group/c2000/f/c2000-microcontrollers-forum/1562270/tms320f28379d-i2c_ex6_eeprom_interrupt-example----delay-too-long-between-sends

部件号:TMS320F28379D


工具/软件:

您好 TMS32 团队:

此问题不利于我的申请/测试、并且阻碍了我的进展。 请提供支持。

我正在尝试编写代码以每 5kHz 发送一次 I2C 数据(3 字节)、但我在尝试让 I2C 数据以一致的速率发送时遇到了很大的麻烦。

必须在下一个上升沿之前发送这 3 个字节。

不过、我观察到在经过 x 次事务处理后、存在较长的延迟、I2C 模块在最终通过总线发送/释放数据之前挂起。 我观察到在发生这种情况时、延迟/总线挂起之前、可能需要高达 30k 或 40k 次事务。 这意味着该问题是间歇性的或由边缘情况引起的。 我尝试使用轮询方法、但这也导致了延迟、所以我认为中断可以解决问题--它确实改善了(我可以在延迟发生之前发送更多数据,但仍然发生)。

我的代码基于“i2c_ex6_eeprom_interrupt"示“示例。 我还使用此工程进行了测试 (.c 文件中的示例 1)、然后添加了 200us、同样的问题。 200 μ s 的延迟应该足够发送 3 字节的数据, I2C 速率为 400kHz ,至少我认为。

修改代码以使用示例 1:

EEPROM.currentHandlePtr     = &EEPROM;
    EEPROM.SlaveAddr            = EEPROM_SLAVE_ADDRESS;
    EEPROM.WriteCycleTime_in_us = 10000;    //6ms for EEPROM this code was tested
    EEPROM.base                 = I2CA_BASE;
    EEPROM.pControlAddr         = &ControlAddr;
    EEPROM.NumOfAddrBytes       = 0;

    //Example 1: EEPROM Byte Write
    //Write 11 to EEPROM address 0x0
    ControlAddr = 0x0;     //EEPROM address to write
    EEPROM.NumOfDataBytes       = 3;
    TX_MsgBuffer[0]             = 1;
    TX_MsgBuffer[1]             = 2;
    TX_MsgBuffer[2]             = 3;
    EEPROM.pTX_MsgBuffer        = TX_MsgBuffer;

    while(1){
        status = I2C_MasterTransmitter(&EEPROM);

        //Wait for EEPROM write cycle time
        //This delay is not mandatory. User can run their application code instead.
        //It is however important to wait for EEPROM write cycle time before you initiate
        //another read / write transaction
        DEVICE_DELAY_US(200);
    }

历史记录: TMS320F28379D:I2C 控制器不发送 x 字节问题(非中继器模式) 

注意:我使用外部 2.2 千欧上拉电阻器、而不是内部上拉电阻器。

谢谢您、
Jennifer

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

    尊敬的 Jennifer:  

    您是否有权使用能够捕获长数据流的 Saleae 逻辑分析仪? 由于问题是间歇性的、因此很难理解导致这种情况的原因。 查看大量 I2C 通信数据样本并在该错误发生之前查看数据线路的外观会有所帮助。 除这些间歇性暂停之外、I2C 通信是否在所有其他事务中工作?

    此致、

    彼得