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.

[参考译文] TMS320F28027:InstaSpin 示例中的 SPI 驱动程序代码

Guru**** 2604225 points
Other Parts Discussed in Thread: DRV8305, MOTORWARE

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

https://e2e.ti.com/support/microcontrollers/c2000-microcontrollers-group/c2000/f/c2000-microcontrollers-forum/677032/tms320f28027-spi-driver-code-in-instaspin-example

器件型号:TMS320F28027
主题中讨论的其他器件:DRV8305MOTORWARE

您好!

看到以下代码(来自文件 DRV8305.C 中的函数 DRV8305_readSpi)出现问题、该代码行检查 FIFO 的状态、记录缓冲区中有一个字、但读取结果(传入的 SPI 字)、有时这种情况大约在1%的时间内发生、 正在读取之前接收到的字、而不是最新的一个……

因此我怀疑由于某种原因、实际的字尚未完全接收(在您传输16位时、以 Write 指令开始、接收所有16位都需要时间)、因此我在写入后添加了一些延迟、解决了问题。 但这不是一个解决方案、我们需要了解发生这种情况的原因。

 那么、问题是、为什么缓冲区状态会随着一个字恢复为有效、而没有字呢? 应通过复位 SPI SPI_resetRxFifo (obj->spiHandle)来复位状态;??

 

请告诉我。

 

BTW、我们为什么读取 EMU 寄存器而不读取 RX 寄存器、或者读取 FIFO 更好?

 

 

 //构建控制字

 ctrlWord =(uint16_t) DRV8305_buildCtrlWord (CtrlMode_Read、regAddr、data);

 

 //将 Rx FIFO 指针重置为零

 spi_resetRxFifo (obj->spiHandle);

 spi_enableRxFifo (obj->spiHandle);

 

 //编写命令

 spi_write (obj->spiHandle、ctrlWord);

 

 //等待响应填充 RX FIFO,否则将发生等待超时

 while (((RxFifoCnt < SPI_FifoStatus_1_Word)&&(WaitTimeOut < 0xFFFF))

 {

   RxFifoCnt = SPI_getRxFifoStatus (obj->spiHandle);

      if (++WaitTimeOut > 0xFFe)

      {

            obj->RxTimeOut = true;

      }

 }

 

 //阅读该词

 readWord = SPI_readEmu (obj->spiHandle);

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

    Motorware 18中的 DRV8305.c 文件如您所述错误地调用 SPI_readEmu()。 应将 SPI_readEmu()替换为 SPI_read()。

    您也可以更正,在调用 SPI_resetRxFIFO()之后再调用 SPI_enableRxFifo()将将 FIFO 计数器重置为0。 一旦接收到最后一个字符、SPIRXEMU 将反映 SPIRXBUF 的当前状态。 当您轮询 FIFO 状态的字数超过0时、您不应看到任何旧数据。

    为了帮助了解现有代码中发生的情况、您可能需要添加一些 GPIO 调试以查看相对于前一个被发送的 SPI 字何时读取 SPIRXEMU 寄存器。 这应该有助于我们了解这里的时序。

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

    只需签入即可查看这是否有助于解决您的问题?

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

    不,不是一个位,系统似乎也没有记录我的响应。。

    因此,在这个区域的代码中添加任何内容会破坏时间,基本上会使这个问题不再发生,请看我的初始接受,我添加了一个延迟,它解决了这个问题.... 因此、这不是启动器。

    你们给出的答案中的关键句子是"当您轮询 FIFO 状态的字数超过0时、您不应该看到任何旧数据"-是的! 这是我们大家所期望的,但没有发生! 那么、这里发生了什么... 你能在家里测试一下,看看正在发生什么 这是我们的代码、它的发生时间不到1%、所以要有耐心、但它发生在几分钟的测试时间内。

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

    我将进一步研究这一点。 明天我将会有一段时间的目标。

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

    谢谢!

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

    ETai、

    我很确信我在这里找到了根。

    第一个。 将 SPI_readEmu()函数替换为 SPI_read()。 这种情况下不会引起问题、因为每次调用 RXFIFO 都会被复位。  

    实际问题是 WaitTimeOut 被声明为静态。 这意味着该值将在 DRV8305_readSpi()函数的调用之间保持不变。 每次调用此函数时、WaitTimeOut 变量都会增加一个量(在我的测试过程中每次调用加5)。 在对该函数进行足够的调用后、变量将最大输出、FIFO 状态 while 循环将失败、从而允许 SPI 立即读取缓冲区、而不管前一个字是否已完成。

    要防止此问题,请更换
    静态易失性 uint16_t WaitTimeOut = 0;
    使用
    volatile uint16_t WaitTimeOut = 0;

    我没有对文件进行完整处理以查看是否存在此类怪异事件的其他实例、但这是不正确的。

    我们不打算在现有的 motorware 框架中修复此错误、但会确保它不会出现在下一个框架中。

    谢谢、
    标记

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

    谢谢 Mark!!!

    我将检查它是否确实解决了问题 、并将返回给您! 非常感谢!

    ETai

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    这是个诀窍! 谢谢、工作做得很好!

    ETai
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    我很高兴这对我有所帮助。 我已提交 TT、以确保在下一个框架中解决此问题。

    只需重申一下、对于可能稍后看到此问题的用户、MotorWare 中不会修复此问题。 请按照之前的答复(e2e.ti.com/.../2501923 )中的建议实施更改

    谢谢、
    标记