工具/软件:
您好 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