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.

[参考译文] RTOS/TM4C1294NCPDT:SPI DMA Ping Pong 模式

Guru**** 2439560 points


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

https://e2e.ti.com/support/microcontrollers/arm-based-microcontrollers-group/arm-based-microcontrollers/f/arm-based-microcontrollers-forum/622643/rtos-tm4c1294ncpdt-spi-dma-ping-pong-mode

器件型号:TM4C1294NCPDT

工具/软件:TI-RTOS

您好!

我正在为 SPI Tx 和 Rx 配置 UDMA。

如果我在 Ping Pong 模式下单独使用 Rx、则一切正常。 但是、如果我同时将 Tx 配置为 Ping Pong 模式(Tx 和 Rx 具有不同的 Ping Pong 缓冲器)、则在 Tx 中、Ping 和 Pong 缓冲器都同时参与。

在 Ping Pong 模式下、任一缓冲器都会被填满并提供 DMA 停止模式、但 如果  我在 Ping Pong 模式下使用 SPI Tx、则没有缓冲器会被填满或进入 DMA to Stop 模式。

在数据表中、他们 给出了乒乓接收。 能否同时使用乒乓方式进行传输? 我的 SPI DMA 在 整个编程中充当主器件。  

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    我不知道为什么在乒乓模式下不能对 TX 和 RX 数据使用 UDMA 的固有原因。
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    您好!

    我已将 SPI Tx 和 Rx 配置为乒乓模式、其工作正常。

    我的问题是、
    1.我可以在基本模式下使用循环缓冲器来连续发送数据吗?
    没有在 DMA ISR 中重新配置缓冲区? 我能否通过 SPI TX 连续传输数据?



    此致、
    Manohar。
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    1:连续传输使用乒乓模式。 基本模式在计数到期后停止、不会复位缓冲地址。
    2.是、使用乒乓模式。
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    您好!

    我要将2048字节的数据传输到 DMA SPI Rx、该 Rx 配置为乒乓模式、每个缓冲区大小为512字节。
    如何进行连续传输? 因为在 PONG 缓冲器完成后、通道将被禁用。

    因此、一次只发送1024字节的数据。 之后、我必须启用通道才能继续接收。


    问题:
    1.在乒乓缓冲器之后、是否有任何方式可以连续接收数据而不禁用通道?
    乒乓缓冲器中最多接收1024字节、每个字节的大小为512? 为什么?


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

    以下是代码:

    空 ISRhandler()

    //检查主 Rx 通道
    ulMode = uDMAChannelModeGet (UDMA_CHANGE_SSI0RX | UDMA_PRI_SELECT);
    if (ulMode = UDMA_MODE_STOP){

    memcpy (ui8ReceivedBuf、ui8DMAPrimary_Buffer、SSI_RXBUF_Size);
    uDMAChannelTransferSet (UDMA_CHANGE_SSI0RX | UDMA_PRI_SELECT、
    UDMA_MODE_PINGONG、(void *)(SSI0_BASE + SSI_O_DR)、
    ui8DMAPrimary_Buffer、SSI_RXBUF_SIZE);



    //检查备用 Rx 通道
    ulMode = uDMAChannelModeGet (UDMA_CHANGE_SSI0RX | UDMA_ALT_SELECT);
    if (ulMode = UDMA_MODE_STOP){

    memcpy (ui8ReceivedBuf、ui8DMASecondary 缓冲器、SSI_RXBUF_SIZE);
    uDMAChannelTransferSet (UDMA_CHANGE_SSI0RX | UDMA_ALT_SELECT、
    UDMA_MODE_PINGONG、(void *)(SSI0_BASE + SSI_O_DR)、
    ui8DMASecondary 缓冲器、SSI_RXBUF_SIZE);



    event_post ();


    缓冲区大小为每个 ping 和 pong 64字节、模式工作正常、如果我从 ping 和 pong 缓冲区发送的数据低于128字节、则事件发布2次。 如果我发送的数据超过128个字节、则事件帖子仍仅为2次、且通道在 pong 缓冲区后被禁用? 为什么?

    我可以在 ISR 中重新启用通道、但传输不是连续的。



    此致、
    Manohar
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    乒乓模式确实要求 CPU 处理数据、并在与一个缓冲区的传输完成后重新配置通道控制字。 由于 DMA 现在已经切换到第二个缓冲区、传输继续而不停止。