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.

[参考译文] TMS320F28384D:SPI DMA 传输

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

https://e2e.ti.com/support/microcontrollers/c2000-microcontrollers-group/c2000/f/c2000-microcontrollers-forum/1402822/tms320f28384d-the-spi-dma-transfers

器件型号:TMS320F28384D

工具与软件:

hi champs、

在 TRM 第37.3.8.1节中、使用具有 DMA 的 SPI 传输数据的示例、使用 DMA 向 SPI 传输128个字、如下所示。

  • num_words:128
  • TXFFIL:8
  • DMA_TRANSFER_SIZE:(num_words /TXFFIL)–1 =(128/8)–1 = 15 (16个传输)
  • DMA_BURST_SIZE:(16–TXFFIL)–1 =(16–8)–1 = 7 (每个突发8个字)

以上结果是正确的。 但是、当 TXFFIL 小于8时、此计算似乎无法使用。 例如、当我们要传输20个字并决定 TXFFIL 为5时、我们通过使用此计算得到以下结果、

  • DMA_TRANSFER_SIZE:(num_words /TXFFIL)–1 =(20/5)–1 = 3 (4个传输)
  • DMA_BURST_SIZE:(16–TXFFIL)–1 =(16–5)–1 = 10 (每个突发11个字)

结果不正确、可以使用 DMA_BURST_SIZE = TXFFIL - 1 = 4 (每个突发5个字)进行更正。 这是正确的、还是我误解了某些事情?

另一个问题是、当 TXFFST 为时会生成 SPITXINT 小于或等于 TXFFIL、但 SPITXDMA 会在 TXFFST 为时激活 小于 TXFFIL。 这是否正确、意味着 SPI TX 中断和 SPITXDMA 是在不同的条件下发出的? 此外、当 RXFFST 大于或等于 RXFFIL 时、SPI RX 中断和 SPIRXDMA 在相同条件下发生。

请建议、感谢您的帮助。

此致、

Luke

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

    尊敬的 Luke:

    您是对的、dma_transfer_size 的公式应如下所示:

    • DMA_TRANSFER_SIZE:(num_words /(16 - TXFFIL))–1

    我将确保在 TRM 中纠正这一问题。

    只要有若干 个 字为空、SPI TX 就会触发 DMA。  对于 DMA、字为空是我们关心的问题、因为当触发 DMA 以传输突发字时、我们需要确保 TX FIFO 中至少有太多空位置、以避免覆盖数据。 同样的条件将触发 SPI TX 中断、其中可以将该特定数量的字写入 ISR 内的 FIFO。 因此、如果您想要使用5个字的突发大小、则会在 FIFO 中至少有5个空点时触发 DMA。 TXFIL 值是指满量、因此您可以使用16 - 5 = 11个字的 TXFIL 值来触发 DMA、因为:

    大于或等于5个字空=小于或等于11个字满

    您必须将 DMA 传输大小(1)和突发大小(1)写入 TRANSFER_SIZE 和 BURST_SIZE 寄存器、这也是- 1的来源。 因此、在您的案例中、相关的数学运算如下:

    • num_words:20
    • TXFFIL:11
    • DMA_TRANSFER_SIZE:(num_words /(16 - TXFFIL))=(20/5)=每次传输4次突发<-将3写入 TRANSFER_SIZE 寄存器
    • DMA_BURST_SIZE:(16 –TXFFIL)=(16–11)=每个突发5个字<-向 BURST_SIZE 寄存器写入4

    对于 SPI RX 条件、该条件稍微简单一些。 当 FIFO 中至少存在一些字时、将发生触发。 RXFIL 还指满量(与 TXFIL 相同)、因此此处使用的值是相同的。 RX 的数学计算如下:

    • num_words:20
    • RXFFIL:5
    • DMA_TRANSFER_SIZE:(num_words /RXFFIL)=(20/5)=每次传输4次突发<-将3写入 TRANSFER_SIZE 寄存器
    • DMA_BURST_SIZE:(RXFFIL) =(5)=每个突发5个字<-向 BURST_SIZE 寄存器写入4

    如果您有任何其他问题、请告诉我。

    此致、

    Delaney

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

    尊敬的 Delaney:

    感谢您对公式进行更正、我同意您提到的 TX 和 RX DMA 配置示例会很好地工作。

    在 TRM 第37.2.4 DMA 支持部分中、我们说 SPITXDMA 在 TXFFST 为有效时激活 小于 中断级别(TXFFIL)还将检查图37-3 SPI DMA 触发图。

    在第37.3.7节 SPI FIFO 说明中、项目9内、我们说、只要发送 FIFO 状态位(TXFFST)匹配( 小于或等于 )中断触发级别位(TXFFIL)。

    我的问题是、根据 TRM 中的说明、这是否意味着 SPITXDMA 和 SPITXINT 的生成条件(时序)不同? 是这样吗?

    此致、

    Luke

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

    尊敬的 Luke:

    我可以向设计团队进行验证、但我的理解是 SPI 模块使用相同的条件来触发 TX DMA 和 TX FIFO 中断。 例如、如果 TX FIFO 中刚好存在8个字节并且 FIFO 级别设置为8、则 DMA 应触发并能够移动8个字符、因为有8个可用位置。 无论哪种方式、这都不会对任何代码产生影响。 即使 DMA 由于仅等待7个字节(小于8)而被触发稍晚一些、它仍然能够在这种情况下向 FIFO 写入8个字符、而不会发生溢出。

    此致、

    Delaney