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 总线中的 ACK 轮询

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

https://e2e.ti.com/support/microcontrollers/c2000-microcontrollers-group/c2000/f/c2000-microcontrollers-forum/905740/tms320f28379d-ack-polling-in-i2c-bus

器件型号:TMS320F28379D
主题中讨论的其他器件:C2000WARE

您好!  

我使用 的是 C2000软件随附的 I2C 示例 i2c_ex2_EEPROM。 一切都很完美。 但是、我正在尝试了解 ACK 轮询是如何发生的。  

向 EEPROM 写入一个字节后、EEPROM 需要5ms 的时间才能完成数据写入。 在此期间、主器件输出的从器件地址不被应答。 因此、主器件可以反复执行该操作、直到从器件确认其地址以确定写入周期是否结束。 这在 EEPROM 数据表中称为 Ack 轮询。

如果我们在向 EEPROM 写入字节后立即开始读取周期、F28377D 的 I2C 模块是否自行(在硬件中)执行此操作?

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

    您好 Dhammika、

    您是否在 C2000ware 中使用 driverLib 示例或位字段(头文件) I2C 示例?

    [引用 user="Dhammika Wijesundera"]如果我们在向 EEPROM 写入字节后立即开始读取周期、F28377D 的 I2C 模块是否自行(在硬件中)执行此操作?

    您是否意味着 F2837x 会持续发送从地址、直到它自己收到 ACK? 如果是这样、则不是、您必须为每次尝试启动一个起始条件+从器件地址。

    最棒的

    Kevin

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

    尊敬的 Kevin:

    我使用的是 driverLib 示例。

    当我们在写入周期后立即开始读取周期时、我们是否不发送 start+slave 地址? 我看不出这种情况一再发生。   

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

    尊敬的 Kevin:

    我通过在下面显示的行中放置一个断点对其进行了测试。 这些线位于 ISR 内部。 代码从不会在那里停止、读取成功。

    谢谢、

    Dhammika

    //中断源=寄存器访问就绪
    //
    //此中断用于确定何时设置 EEPROM 地址
    //读取数据通信的部分已完成。 因为没有停止位
    //为命令,此标志告诉我们何时发送了消息
    //而不是 SCD 标志。
    否则、如果(intSource = I2C_INTSRC_REG_ACCESS_RDY)

      //如果接收到 NACK,清除 NACK 位并命令停止。
      //否则,继续到通信的读取数据部分。
      if ((I2C_getStatus (I2CB_BASE)& I2C_STS_NO_ACK)!= 0)
      {
        I2C_sendStopCondition (I2CB_BASE);         //我在这里设置一个断点- Dhammika
        I2C_clearStatus (I2CB_BASE、I2C_STS_NO_ACK);
      }
      否则 if (currentMsgPtr -> msgStatus = MSG_STATUS_SEND_NOSTOP_BUSY)
      {
        currentMsgPtr ->msgStatus = MSG_STATUS_RESTART;
      }

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

    尊敬的 Kevin:

    很抱歉、我们在中断点停止所花费的时间足以完成写入周期(我在读取周期开始的点也有一个中断点)。 这就是为什么没有出现上述断点的原因。

    我可以看到重新发送 Start 的位置。  

    谢谢、

    Dhammika