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:在从器件发送例程期间轮询 XRDY 时发送过时字节

Guru**** 2553450 points


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

https://e2e.ti.com/support/microcontrollers/c2000-microcontrollers-group/c2000/f/c2000-microcontrollers-forum/1339129/tms320f28379d-stale-byte-sent-when-polling-xrdy-during-slave-transmit-routine

器件型号:TMS320F28379D

当从机被请求发送时、我有一些 I2C 从机代码可以轮询 I2CSTR 中的 XRDY 位。

已注意到、在首次调用时、从器件发送工作符合预期。 在后续调用中、不设置 XRDY、并且从器件发送的第一个数据字节是来自上次调用的 Tx 缓冲区末尾的过时字节。

似乎在最后一次调用期间、从器件写入 I2CDXR、但主器件 NACKd 指示传输已完成、因此从器件从未将数据发送到 I2CXSR、数据仍在 I2CDXR 中、XRDY 位未设置。 因此、在下一次调用时、会首先发送这个旧字节。 在从器件发送循环之前将1写入 XRDY 似乎可以解决过时字节问题、但我注意到在 TRM 中 XRDY 指示为只读(R)、但在说明中它会输入 R/W。 根据我能告诉的信息、我可以向 XRDY 写入1、而不是0。

想知道在开始传输之前强制 XRDY 为1是否存在任何问题、或者是否有更干净的方法可以避免最后一个字节写入 I2CDXR? 谢谢!

   如果(I2caRegs.I2CSTR.bit.AAS = 1 & I2caRegs.I2CSTR.bit.SDIR = 1)
   {
      I2caRegs.I2CMDR.bit.TRx = 1;  
      //I2caRegs.I2CSTR.bit.XRDY = 1; //取消此行的注释后,过时字节问题消失
      while (I2caRegs.I2CSTR.bit.SCD == 0)   
      {
         如果(I2caRegs.I2CSTR.bit.XRDY =>= 1)   
         {
            I2caRegs.I2CDXR.all =*数据++;
         }
      }
      I2caRegs.I2CSTR.bit.SCD = 1;
      I2caRegs.I2CMDR.bit.TRX = 0;
   }

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

    您好、Ricker:

    如果我没理解错、您是在将 F2837xD 用作目标器件、而外部 I2C 控制器正在接收来自 F2837xD 的数据。 不过、F2837xD 从 I2C 控制器接收 NACK、不发送加载到 I2CDXR 的最后一个数据、因此 XRDY 不显示 I2C 已准备好传输另一个字节、是这样吗?

    Unknown 说:
    在启动从器件发送循环之前向 XRDY 写入1似乎可以解决过时字节的问题、但我注意到在 TRM 中 XRDY 指示为只读(R)、但在说明中它表明是 R/W。 从我能告诉的信息中、我可以将1写入 XRDY、而不是0。

    我在参考手册中看到了这些相互冲突的信息、我将与设计专家讨论这一点以确定具体情况(我认为寄存器描述准确、但我会确认)。

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

    是的、正确。 来自主器件 I2C 控制器的 NACK 是在主器件-接收器完成读取数据时发生的正常 NACK、并通过 NACK 向从器件指示此类 NACK。 F2837xD 上最后加载的数据不会被发送、这是正确的操作、因为主机需要的所有数据字节都已接收、但是在下一次传输时未设置 XRDY、以便发送最后加载的字节(除非我强制 XRDY 为1)。

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

    您好、Ricker:

    无法发送 F2837xD 上最后加载的数据,这是正确的操作,因为已接收主控方需要的所有数据字节,但在下一次传输时未设置 XRDY,因此发送最后加载的字节。

    我认为您通过清除 XRDY 位来清除状态位的方式并不是我们描述的方式、 我在 driverlib 中进行了检查、现在有一个可以执行类似操作的函数、但它明确排除用于 XRDY (I2C_STS_TX_DATA_RDY)的宏以及其他一些函数:

    可以通过复位 I2C 模块来复位所有状态位。 I2CMDR 寄存器中的 ISR 位将复位  仅限 I2CSTR 位并将其设置为默认值:

    可使用 I2C_disableModule/I2C_enableModule 函数在 driverlib 中完成此操作。

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

    好的、使用函数末尾的 IRS 位似乎可行。 猜我也可以在 while (I2caRegs.I2CSTR.bit.SCD == 0)之前写一次 I2CDXR 来绕过第一个 IF (I2caRegs.I2CSTR.bit.XRDY == 1)。

    我绝对能够写1到 XRDY 如此有趣地听说了关于那个的文档。

    谢谢您的创意!

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

    您好、Ricker:

    我绝对能够写1到 XRDY 如此有趣地听到关于这一个的文档。

    我能够确认、虽然我们只记录 XRDY 的只读文档、但 XRDY 为 R/W。 我将更新文档以反映这一点。

    设计专家还谈到了 F2837xD 之后的器件(即 F28004x、F2838x、F28002x、F28003x、F280015x/13x、 F28P65x 等)可使用 FSM=1来解决过时数据的问题、但 F2837xD 写入 XRDY 位似乎是一 种可能的解决方案。

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

    好的、很好知道。 谢谢!