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**** 2479005 points
Other Parts Discussed in Thread: TMS570LC4357

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

https://e2e.ti.com/support/microcontrollers/arm-based-microcontrollers-group/arm-based-microcontrollers/f/arm-based-microcontrollers-forum/893979/tms570lc4357-i2c-receive-issue

器件型号:TMS570LC4357

您好!

我正在尝试通过 I2C 将 TMS570LC4357 (主设备)与 Arduino (从设备)进行通信。 Arduino 正在收到请求、正在发送三个字节、但微控制器未接收到这些字节。

我知道通信正常、因为我能够使用 sendByte 函数向 Arduino 发送数据(由于某些原因、i2cSend 无法正常工作)、但我无法接收数据。

这是我的代码:

uint8 * r_buff =&RX_Pack[0];
uint32 buf_size = bsize;
uint32 i = 0;
i2cInit();

while (i2cIsMasterReady (i2cREG2)!= true);

i2cSetSlaveAdd (i2cREG2、SLAVE_ADDRESS);//对于 I2C1、主器件
i2cSetDirection (i2cREG2、I2C_RECEIVER);
i2cSetCount (i2cREG2、3);
i2cSetMode (i2cREG2、I2C_MASTER);

i2cSetStop (i2cREG2);
i2cSetStart (i2cREG2);//仅适用于主器件

/*轮询模式下的 Transmit data_count 数据数量*/
i2cReceive (i2cREG2、3、&RX_PACK[0]);

/*等待总线忙被清除*/
while (i2cIsBusy (i2cREG2)=true);

i2cClearSCD (i2cREG2);

 


在这种情况下、它停留在  i2cIsMasterReady  语句中。 如果我删除这一行、它将一直到主代码的末尾、但没有接收到任何数据。


SDA 和 SCL 相互连接。

感谢你的帮助。 此致、

塞尔吉奥

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

    您好、Sergio、

    1、在产生停止条件后手动换档变速箱被清零。 在 主控模式下开始第一个传输之前、它不会被清零。 您无需在启动第一个事务之前检查此位。

    从从从器件读取数据与写入非常相似、但 需要执行一些额外的步骤、具体取决于从器件定义的协议。 为了从从器件读取数据、主器件必须首先告知从器件它希望读取的寄存器或地址。 这由主器件通过发送 R/NW = 0 (写入)的从器件地址、然后发送寄存器地址来完成。 一旦从机应答该寄存器地址、主机将发送一个起始条件、然后发送 R/NW=1 (读取)的从机地址。 从器件将 ACK 读取请求、主器件释放 SDA 总线并持续为从器件提供时钟。 在每个数据字节的末尾、主器件将向从器件发送 ACK、以告知 salev 已准备好接收更多数据。 一旦主器件接收到预期的字节数、它将发送一个 NACK、然后发送停止条件。

    我不知道 I2C 从设备是如何在 Arduino MCU 中实现的。