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.

[参考译文] TM4C129XNCZAD:有关 UDMA 和 SSI 中断的查询

Guru**** 2394075 points


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

https://e2e.ti.com/support/microcontrollers/arm-based-microcontrollers-group/arm-based-microcontrollers/f/arm-based-microcontrollers-forum/707563/tm4c129xnczad-query-regarding-udma-and-ssi-interrupt

器件型号:TM4C129XNCZAD

我想对 UDMA 与 Tiva SPI 的交互进行一些澄清。  我正在 Tiva 处理器上设置一个从器件 SPI 接口、并希望在交替模式下将 UDMA 与 SPI 配合使用。   

SPI 配置为16位宽元素-使用 SSI1。   

UDMA 配置为交替模式

uDMAChannelControlSet (10 | UDMA_PRI_SELECT、UDMA_SIZE_16 | UDMA_SRC_INC_NONE | UDMA_DST_INC_16 | UDMA_ARB_4);

//设置传输缓冲区
uDMAChannelTransferSet (10| UDMA_PRI_SELECT、UDMA_MODE_PINGONG、(void *)(SSI1_BASE + SSI_O_DR)、&g_DSP_SPI_Rx_buffer[primary_buffer]、128);

//配置乒乓传输的备用传输
uDMAChannelControlSet (10 | UDMA_ALT_SELECT、UDMA_SIZE_16 | UDMA_SRC_INC_NONE | UDMA_DST_INC_16 | UDMA_ARB_4);

uDMAChannelTransferSet (10 | UDMA_ALT_SELECT、UDMA_MODE_PINGONG、 (void *)(SSI1_base + SSI_O_DR)、g_DSP_SPI_RX_buffer[ALT_buffer]、128);

在尝试使 DMA 正常工作时、我发现需要启用 SPI RX DMA 中断才能使 DMA 正常工作: SSIIntEnable (SSI1_base、SSI_DMARX)。  此外、在 SSI1的中断处理程序中、我需要清除 SSI_DMARX 中断屏蔽、以便更多数据包获得 DMA'ed.  这意味着、要接收128元件数据包、SSI ISR 需要运行大约30次、否则会丢失数据。  使用 DMA 来避免中断服务传输的整个过程不是什么?  我想我错过了数据表中的一些内容、希望有人能够向正确的方向指出我。

谢谢你

-Yan

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

    首先、SSI 的 FIFO 只有8个入口深度。 根据设计、只要一半 FIFO 已满、就会生成突发 RX DMA 请求。 UDMA 需要该请求并将其用作启动传输的触发器。 SSI 不知道乒乓缓冲器有多大。 与您的情况一样、您已经设置了128。 除非 SSI 的 FIFO 深度为256个单元、否则只要 FIFO 中有128个单元或更多单元、SSI 就可以发出猝发 DMA 请求。 由于这是不可能的、它将需要在4个入口边界上生成 DMA 请求。 接收到请求后、uDMA 将在 SSI 的 FIFO 满之前开始传输、在这种情况下、您可能会遇到溢出错误。
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    感谢 Charles 的答复。 因此、我对外设的理解是正确的。 让 ISR 每4或8个元素清除一次中断状态会使 UDMA 不是很有用。 我刚从 FIFO 直接复制到接收缓冲区、因为性能优于使用 uDMA。 此外、清除 UDMA RX 不是一个单步过程、因为它需要清除 SSIDMADisable (SSI1_base、SSI_DMA_RX)、然后清除中断状态、然后重新启用 DMA。