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.

[参考译文] TMS570LC4357:TMS570LC4357 DMA 通道链。

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

https://e2e.ti.com/support/microcontrollers/arm-based-microcontrollers-group/arm-based-microcontrollers/f/arm-based-microcontrollers-forum/938745/tms570lc4357-tms570lc4357-dma-channel-chaining

器件型号:TMS570LC4357

您好!

使用 DMA 控制器的通道链接功能时遇到一些问题。  我们必须具有的功能是能够对 DMA 传输编程一次、并且一旦传输启动、就不需要任何 CPU 干预(包括无中断)。 我想使用 DMA 的通道0将任意数量的16位字数据传输到 Mibspi 缓冲区、以便通过 SPI 进行传输。 mibspi TX RAM 缓冲区的长度为128字节。 我的假设是将数据分为128字节的块、并以链式传输方式发送任何剩余数据。

例如、假设我需要发送500个字节。 我会首先配置 DMA 通道0以发送3 * 128 = 384字节。 通道1配置为发送剩余的116个字节并链接到通道0。 因此、假设通道0传输结束后将触发通道1传输。 然而、最后116个字节的传输在通道0传输到 Mibspi 缓冲区的第一个帧完成后立即启动、因此数据的第一个块会被覆盖。

看起来、链式传输是在传输的第一个帧完成后触发的、而不是在给定通道的所有数据传输完成后触发的。

我的问题是、是否可以配置链通道、以便在传输触发通道中的所有数据后启动其传输?

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

    Bartlomej、您好!

    这很有可能。 请将 DMA 数据包传输类型更改为块传输。 如果 tType 为帧传输、则在通道0帧传输完成时触发通道1 DMA 传输。

    G_dmaCTRLPKT.tType   = block_transfer;  /* transfer type        *

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

    您好!

    感谢您的回答。 虽然将数据包传输设置为块传输会在所有数据被发送到 MIB TX RAM 缓冲区后触发链通道、但它会产生另一个问题。 MibSPI Tx 缓冲器需要以帧模式写入、因为 SPI 序列发生器需要一些时间将数据推出。 因此、当我启用块传输时、一旦完成前一帧的传输、DMA 将用新帧覆盖 MibSPI Tx 缓冲器。 请参阅下面的屏幕截图、其中显示了 SPI 数据线的捕获:

    我的测试输出缓冲区长度为500 16位字。 从0到500不等。 您可以清楚地看到、在 DMA 复制保存0到5值的存储器后、它开始复制另一个值为128和以上的帧(我们只看到134、依此类推、因为 SPI 序列发生器已经发送了0-5值)。

    TRM 指出:

    我是否正确地理解、这仅在传输模式设置为块传输时有效?

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

    是的、链通道在通道的 DMA 请求被处理后被触发。

    如果 tType =帧传输、则每帧有一个 DMA 请求。 传输一帧后、将触发链通道。  

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

    嗯、这与 TRM 中所述的情况不同。 令人困惑。 我认为应该更新它、因为现在它建议了不同的行为。

    您是否看到过适用于我的用例的任何解决方案?

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

    您可以使用 DMA 通道0的 BTC 中断。 当完成标志被置位时、您将启动通道1传输。