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.

[参考译文] TMS320F28377D:SPI FIFO 模式

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

https://e2e.ti.com/support/microcontrollers/c2000-microcontrollers-group/c2000/f/c2000-microcontrollers-forum/1232356/tms320f28377d-spi-fifo-mode

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

您好!

我将使用 SPI 的 SPI-C 实例、它在不处于 FIFO 模式时工作正常。 数据宽度为8位。 无中断、无 DMA。

当配置为 FIFO 模式(我执行四项设置:SPIFFENA=1、TXFIFO=1、RXFIFORESET=1、SPIFFTX.SPIRST=1)时、我向 SPITXBUF 寄存器写入8个字节、逐个写入而没有任何代码延迟。 (我是否应该在此处添加延迟?)

最后、我看到 RSFFST 值设置为8。 这说明我已经接收到8个字节。 我相信、要读取缓冲区、我应该读取 SPIRXBUF 8次? 当我执行该操作时、我将为所有8个字节获取相同的数据。 我知道这是不正确的、因为我可以在不处于 FIFO 模式时看到正确的数据。 在 FIFO 模式下、我也可以看到正确的数据、但数据每次发送并写入一个字节。 但是、当8个字节一起写入时、我看到为所有8个字节读取了相同的值。 我看到 SPIFFRX.RXFFST 值在我读取这些值时不断递减、最终会变为零、但读取的值是相同的。

感谢任何帮助。

此外、我绝不会在"Registers"窗口中看到 TXFFST 设置为除零以外的任何值。 这可能是因为数据一旦被写入 SPITXBUF 寄存器就在引脚上发送。 请告诉我这种理解是否正确、我将无法在寄存器窗口中看到 TXFFST 上的任何其他值。

谢谢你。

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

    您好、Gobind:

    当配置为 FIFO 模式时(我进行了四项设置:SPIFFENA=1、TXFIFO=1、RXFIFORESET=1、SPIFFTX.SPIRST=1)、我向 SPITXBUF 寄存器写入8个字节、而不会在代码中产生任何延迟。 (是否应在此添加延迟?)

    是否希望同时设置 RX 和 TX 的 FIFO? 此外、你是否计划启用中断?  

    我建议查看 C2000Ware 中的软件示例以交叉检查您的 FIFO 设置。 我们确实有一个使用 FIFO 的 SPI 示例、我认为唯一应该根据您提到的情况变化的是 TXFILL 和 RXFILL 电平。  

    您不需要在 TX 写入之间添加任何延迟。

    但是当8个字节一起写入时、我看到所有8个字节读取的值都是一样的。 我看到 SPIFFRX.RXFFST 值在我读取这些值时不断递减、最终变为零、但读取的值是相同的。[/引号]

    这可能是您设置的 FIFO 所致。 同样、我建议参考我们的一个 C2000Ware 示例、并确保正确设置完整的 FIFO 配置。  

    此外、在"Registers"窗口中、我绝不会看到 TXFFST 设置为除零以外的任何值。 这可能是因为数据一旦被写入 SPITXBUF 寄存器就在引脚上发送。 请告诉我这一理解是否正确、我将无法在寄存器窗口中看到 TXFFST 中的任何其他值

    当您以背靠背的方式写入缓冲区时、您应该仍然会看到 TXFFST 增量的值。  

    此致、

    马林

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

    感谢的回复 Marlyn。

    您是否希望同时为 RX 和 TX 设置 FIFO?

    是的、我要为 RX 和 TX 设置 FIFO。

    此外,您是否打算启用中断?  [/报价]

    否。  

    我相信唯一应该根据您所提到的变化的是 TXFILL 和 RXFILL 级别。

    这些级别不是仅在我要设置中断时才具有的吗?  

    我建议查看 C2000Ware 中的软件示例以交叉检查您的 FIFO 设置。 我们有一个利用 FIFO 的 SPI 示例

    我看到过该示例、我想我已按照进行了设置。

    FIFO 寄存器仅有3个:  

    SPIFFTX 信号

    SPIFFRx

    SPIFFCT:这里没有配置,因为我不想有任何延迟。

    我应该已经配置了这两个寄存器的所有可写位。 以下是我的设置、如果还需要进行其他设置、请告诉我。

    我的问题有:

    1.如果 TX 和 RX 都启用了 FIFO、那么 SPI 模块是否应该在开始发送之前等待将 TXFFIL 数量的数据写入 SPITXBUF? 并且随着我写入 SPITXBUF、TXFFST 应该递增。

    如果答案是肯定的,我看不出发生了这种情况。 一旦数据被写入 SPITXBUF 并且 TXFFST 为0、就立即被发送。 我看到 RXFFST 递增、这意味着它已接收数据。

    2. RXFFST 达到8后开始从 SPIRXBUF 中读取数据。 我看到 RXFFST 在每次读取时递减、但我读取的数据每次都是相同的。 读取的所有8个字节都是相同的。

    我只想发送8个字节的数据、等待 RXFFST 是8个字节、然后从 SPIRXBUF 读取8个字节的数据。  

    谢谢。

    G·辛格

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

    您好、Gobind:

    我想我已经配置了这两个寄存器的所有可写位。 以下是我的设置,请告诉我是否有更多设置需要完成。

    您的配置看起来没有问题。

    1. 如果 TX 和 RX 都启用了 FIFO、那么 SPI 模块是否应该在开始发送之前等待将 TXFFIL 数量的数据写入 SPITXBUF? 并且在我写入 SPITXBUF 时 TXFFST 是否应递增。

    如果您写入的数据立即移入移位寄存器、则您可能无法看到 TXFFST。

    2. RXFFST 达到8后、我开始从 SPIRXBUF 读取数据。 我看到 RXFFST 在每次读取时递减、但我读取的数据每次都是相同的。 因此读取的所有8个字节都是相同的。[/引号]

    您读回8次什么值? 您接收到的第一个字节、最后一个字节、等等。

    此致、

    马林

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

    尊敬的 Marlyn:

    您读回8次的值是什么? 接收到的第一个字节、最后一个字节等[/引号]

    当我单步执行每条传输和接收指令时、发现这一点非常有效。 然后、我在每次写入 Tx 缓冲区之后添加了等待、在这之后它似乎工作正常。 新代码如下所示:

    但这看起来不是一个好的解决方案。 正如你在之前的回复中所说的那样、 在写入 TXBUF 寄存器之间我不应该有延迟。  

    在每次写入 TXBUF 之后添加 WAIT 语句使得它与非缓冲 SPI 相似。 还有其他解决方案吗?

    谢谢你。

    G·辛格

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    要找出这一点,当我单步执行每一个传输和接收指令时,一切顺利。

    为了说明这一点、它仅在步越模式下有效、而不是在连续运行模式下有效。 但在添加等待之后、它也可以在连续运行模式下工作。

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

    Gobind,

    每次写入 TXBUF 后添加等待语句使其类似于非缓冲 SPI。 是否有其他解决方案?

    感谢您分享更多详细信息。 您能告诉我您在 RX 缓冲区中接收到的返回数据是什么吗? 您之前提到每次都是相同的、但您能否说明您发送的数据和读取的数据? 这将让我弄清会发生什么情况。 此外、您能否分享您的完整 SPI 初始化代码?

    此致、

    马林

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

    尊敬的 Marlyn:

    有8个字节的数据、

    1.字节1至7:故障标志和更新计数

    2.字节8:CRC

    我的 SPI 初始化函数如下所示、我使用了 RXFIL 和 TXFIL、因为它们对我的问题没有任何影响。

    void initSpi()
    {
    spiRegs->SPICCR.bit.SPICHAR = 7;
    spiRegs->SPICCR.bit.CLKPOLARITY = 0;
    spiRegs->SPICTL.bit.CLK_PHASE = 0;
    spiRegs->SPICTL.bit.MASTER_SLAVE = 1;
    spiRegs->SPICTL.bit.talk = 1;
    spiRegs->SPIBRR.all = 9;

    /* FIFO 设置*/
    spiRegs->SPIFFTX.bit.SPIFFENA=1;
    spiRegs->SPIFFTX.bit.TXFIFO = 1;
    spiRegs->SPIFFRX.bit.RXFIFORESET = 1;
    spiRegs->SPIFFTX.bit.SPIRST = 1;

    spiRegs->SPICCR.bit.SPISWRESET = 1;
    spiRegs->SPIPRI.bit.free = 1;

    谢谢

    G·辛格

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

    您好、Gobind:

    在 您提供的某些代码中、您使用 spiRegs 和其他 SpicRegs。 是否已将 spiRegs 初始化为指向 SpicRegs?

    另外、您是否已经规划了通信范围、以验证 TX 数据是否正确发送(没有延迟到写入 TX 缓冲区的操作)、以及是否正在将预期进入器件的 RX 数据写入到器件中?

    您是否能够提供一个演示该问题的简单测试案例(可能通过修改 C2000Ware 示例)?

    此致、

    马林

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

    尊敬的 Marlyn:

    很抱歉回复延迟、我没有访问设置的权限。

    我在这两种情况下把时钟的范围限定为(等待和无等待)、唯一的区别(正如预期的那样)是、如果我等待第一个字完成传输、然后再写入下一个字、那么两个字之间就有一个延迟。

    等待:

    无等待:

    在这两种情况下、数据看起来也很好。

    不响应在字之间无延迟发送的时钟的另一个器件(FPGA)必须是该器件。

    感谢您的答复。 该线程可以关闭。