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.

[参考译文] MSPM0G3507:管理 RX FIFO 和 SPI RX DMA

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

https://e2e.ti.com/support/microcontrollers/arm-based-microcontrollers-group/arm-based-microcontrollers/f/arm-based-microcontrollers-forum/1521531/mspm0g3507-managing-rx-fifo-and-spi-rx-dma

器件型号:MSPM0G3507

工具/软件:

你好。

我有 SPI RX 和 TX DMA 同时工作。

它似乎基本上能正常工作、但我显然收到了一个错误、我认为是 RX FIFO 和 DMA 问题导致的数据。

RPI 通过连续发送0x8000来轮询 MCU。

当 MCU 轮询时、它以轮询进行响应、然后通过 DMA 传输 TX 数据。 这种方法很有效。

由于 SPI 通过 DMA 同时是双工 I RX 数据。

数据 RX 数据固定在0xf0f0、因此我可以看到正在发生什么。

但是、 RX 数据的前两个数据包被"轮询"破坏??

RPI 发送的数据正确、我可以在逻辑分析仪上看到这一点、请参阅 snip。

NB -由于各种原因、我在轮询和数据之间更改 SPI 时钟速度、这一切都可以正常工作。

进行以下设置和两次剪切。

NB - MOSI 存在一个不是最后一次轮询后的真实数据的干扰(宽度为10ns、不产生影响)。

有任何线索?? 似乎很接近、一如既往的…

--

Phil

//等待 RPI 发送"轮询"
DL_SPI_drainRXFIFO16 (SPI_0_INST、SPI_rx_buffer、4);

while ((SPI_rx_Buffer[0]=DL_SPI_receiveDataBlocking16 (SPI_0_INST))!=POLL)
;
//从 RPI 获得"轮询"

//通过投票确认投票!
DL_SPI_transmitDataBlocking16 (SPI_0_INST、POLL);
while (!DL_SPI_isTXFIFOEmpty (SPI_0_INST))
;

//空 RX
DL_SPI_drainRXFIFO16 (SPI_0_INST、SPI_rx_buffer、4);

//启用 DMA 中断
DL_SPI_clearDMAReceiveEventStatus (SPI_0_INST、DL_SPI_DMA_INTERRUPT_RX);
DL_SPI_enableDMARceiveEvent (SPI_0_INST、DL_SPI_DMA_INTERRUPT_RX);

//等待 TX 和 RX 结束
DL_DMA_enableChannel (DMA、DMA_SPI_TX_CHAN_ID);
DL_DMA_enableChannel (DMA、DMA_SPI_RX_CHA_ID);
while (DL_DMA_isChannelEnabled (DMA、DMA_SPI_TX_CHAN_ID)==true)
;
while (DL_DMA_isChannelEnabled (DMA、DMA_SPI_RX_CHAN_ID)==true)
;

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

    我应该添加一个拳击手、我轮询是尝试禁用所有 SPI DMA 活动:

    //初始化指向缓冲区的指针
    //请注意、16位、因为 SPI TX/RX 是16位
    ptr16_buffer_start =(无符号短整型*)缓冲器;
    ptr16_Buffer_ACTIVATE =(unsigned short *) BUFFER_ACTIVATE;

    //"大小"是单行、1
    //65个字= 130个字节=单列
    尺码=尺码*65;


    // TX DMA
    DL_DMA_disableChannel (dma、DMA_SPI_TX_CHAN_ID);
    DL_DMA_setTransferSize (dma、DMA_SPI_TX_CHAN_ID、(uint16_t) size);//
    DL_DMA_setSrcAddr (dma、DMA_SPI_TX_CHAN_ID、(uint32_t) ptr16_BUFFER_START);
    DL_DMA_setDestAddr (DMA、DMA_SPI_TX_CHAN_ID、(uint32_t)(&SPI_0_INST->TXDATA));
    // RX DMA
    DL_DMA_disableChannel (dma、DMA_SPI_RX_CHAN_ID);
    DL_DMA_setTransferSize (dma、DMA_SPI_RX_CHAN_ID、(uint16_t) size);//
    DL_DMA_setSrcAddr (dma、DMA_SPI_RX_CHAN_ID、(uint32_t)(&SPI_0_INST->RXDATA);
    DL_DMA_setDestAddr (DMA、DMA_SPI_RX_CHAN_ID、(uint32_t)(ptr16_BUFFER_ACTIVATE));
    DL_SPI_clearDMAReceiveEventStatus (SPI_0_INST、DL_SPI_DMA_INTERRUPT_RX);

    //等待 RPI 发送"轮询"
    DL_SPI_drainRXFIFO16 (SPI_0_INST、SPI_rx_buffer、4);
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    一些观察结果:

    1) TRM 没有说、但我预计帧不会直接从 FIFO 在时钟沿输出、而是从"发送/接收逻辑"中的移位寄存器输出[参考 TRM 图19-1]。 这意味着 FIFO 在写入第一个(仅)轮询确认帧后立即变为空;这可能对主器件不可见、因为时钟立即启动、但从器件可能会有明显的延迟、因为它等待主器件发送一些 SCI。 过早出现 FIFO 空指示可能意味着清空 Rx FIFO 后您会看到第二个轮询。

    您可能使用 DL_SPI_isBusy ()之类的  器件做得更好、而不是 DL_SPI_isTXFIFOEmpty ()[Ref TRM 表19-61、其中 BUSY 也包括 FIFO不 为空]。

    2)观察您的迹线,似乎您的分析仪处于其分辨率的边缘,因为并非所有 SCK 都是单独可见的。 如果我下蹲正确、您提到的"毛刺"可能看起来更像另一个轮询帧。

    您的分析仪是否具有更多频道? /CS 和 MISO (准确地查看何时交付轮询确认)可能会提供信息。 或者、可以使轮询字周期超过0x8000-0x800F 或其他值。

    [编辑:如果您的从属设备使用4线(/CS)模式,设置 CTL0 : CSCLR=1 (DL_SPI_enablePeripheralAlignDataOnChipSelect ())[参考 TRM 19.2.2.1.1 ]似乎是针对干扰的"廉价保险"。

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

    正如以往一样,一个伟大的观察:

    您可能使用 DL_SPI_isBusy ()之类的  器件做得更好、而不是 DL_SPI_isTXFIFOEmpty ()[Ref TRM 表19-61、其中 BUSY 也包括 FIFO不 为空]。

    这是成功的,感谢。