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.

[参考译文] TMS320F28377S:SPI 从器件和 RX FIFO 缓冲器

Guru**** 2478765 points


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

https://e2e.ti.com/support/microcontrollers/c2000-microcontrollers-group/c2000/f/c2000-microcontrollers-forum/905406/tms320f28377s-spi-slave-and-rx-fifo-buffer

器件型号:TMS320F28377S

您好!

我在 RxFifo 的从模式下使用 SPI 时遇到问题。

在我的应用程序中,我可以有一个先前的中断(用于控制电机)。

然后、对于 SPI 从器件接收数据时配置的 SPI 中断、它可以在主器件之前的中断完成时延迟。

因此、我可以在真正发生中断之前接收许多 SPI 数据。

然后我使用 Rx FIFO。 RXFILL 设置为1。

但我观察到一些行为:

-在接收到的第一个数据上、通过将 RXFFST 设置为1来设置 SPI_O_DAT 寄存器。 在这种情况下、我必须读取 DAT 寄存器、而不是返回虚拟值的 RXBUFF。

但我必须读取 RXBUFF 才能将 RXFFST 减少到0、从而不产生另一个中断。

为什么 SPI_O_DAT 寄存器不直接填充 RXBUF? 这是个问题、因为我必须测试 RXFFST、

if = 1 =>读取 DAT 和 RXBUFF 来清空 RXFFST

如果> 1:只读 RXBUFF 以获取第一个接收到的数据。

但是、如果在 RSFFST 测试和寄存器(RXBUF / DAT)读取之间接收到新字符、则会导致问题!

在 RXBuf Fifo 中正确使用 SPI 从器件的好方法是什么?

我找不到好的解决方案!

谢谢

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

    您好!

    以下是对您的问题的理解:-

    您担心您可能会错过 SPI 接收到的数据(溢出情况)、因为您的应用程序可能忙于处理其他中断、这些中断可能比 SPI 中断具有更高的优先级。 我是对的吗?

    在 F28377S (SPI)中、FIFO 深度为16级深 x 16位。 因此、您无需在每次 SPI 接收数据时获取 SPI 接收中断。 您可以将 SPI RX FIFO 寄存器配置为在接收到16 (最大限制) SPI 字(16位)后触发接收中断。 这样、您可以增加 SPI 接收数据就绪中断之间的时间。

    另一种方法是使用 DMA 而不是 CPU 来读取 SPI 接收到的数据。 这样您就可以释放 CPU 带宽。

    此致、

    曼诺伊

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

    您好!

    好的、我将尝试减少混乱。 让我们在中断优先级的一边。

    我在 SPI 从属设备中。 CPU 接收一个16位 SPI 卡解、然后我得到一个中断。

    请查看以下屏幕截图:主器件发送了一个 SPI 字符(0x1503)。 我们在 SPI 中断子例程上。

    RXBUFF 不会由接收到的数据(0x1503)填充、而是保持在 SPI_DAT 缓冲区中。 然后、当我获取 RXBuffer 时、我不会获得良好的数据值!

    但 RXFFST 被设为1、表示 FIFO 有一个字符...

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

    您好!

    我想知道 SPIINT (非 FIFO SPI RX 数据就绪中断)和 RXFFINT (RX FIFO SPI 数据就绪中断)是否都被触发。

    使用 SPI RX FIFO 时、应使用 SPI RX FIFO 中断(RXFFINT)、而不是非 FIFO SPI RX 中断(触发 SPIINT)。 因此、请确保清除 SPIINTENA=0、这将确保您没有获得 SPIINT (由非 FIFO SPI RX 数据就绪事件引起)

    此致、

    曼诺伊

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

    你是对的、

    最初、我只使用 FIFO RX 中断。

    但当我遇到问题时、我了解了 TI 提供的 Endat 堆栈的工作方式(也在从器件中使用 SPI)

    然后两者都已配置!

    但无论有无问题都是相同的。

    我认为问题是从器件和主器件在初始化阶段发生移位。

    我认为主器件在从器件初始化 SPI 期间开始传输。 因此、我将一个或多个位移入接收到的数据。

    然后我不知道如何同步这两者。 在主器件发送第一个数据之前,确保从器件已准备好接收数据....

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

    将 SPI 配置为从器件后、它应准备好从其主器件接收数据。 您将哪个器件用作 SPI 主器件?

    您只需确保 SPI 从器件(F28377S)已准备好接收 SPI 主器件发出的命令。 您可以使用 F28377S 的 GPIO 告知 SPI 主器件 SPI 从器件配置已就绪。

    此致、

    曼诺伊

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

    奇怪的是、

    我同时同步主设备和从设备。

    则所有引脚状态均正常。

    但我总是有错误的数据。

    当不传输时、我用调试器停止两侧。 然后在从器件侧、我使用调试器的 CCR 寄存器执行 SPI 复位(恰好在初始阶段之后)

    然后下一个字节接收正常。

    现在,如果我添加了 C 代码行来执行此复位(设置为0,然后设置为1),则下一个字节将被设置为 alays shiff....

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

    不幸的是,我没有所有的谜题来理解你所面临的问题。 如前所述、如果在 SPI 主器件启动通信之前配置了 SPI 从器件、则不会出现任何同步问题。

    除非我更好地了解您的问题、否则我无法提供有意义的意见。

    此致、

    曼诺伊