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.

[参考译文] EK-TM4C129EXL:散聚 DMA 循环

Guru**** 657500 points
Other Parts Discussed in Thread: TLC6983, EK-TM4C1294XL
请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

https://e2e.ti.com/support/microcontrollers/arm-based-microcontrollers-group/arm-based-microcontrollers/f/arm-based-microcontrollers-forum/1230326/ek-tm4c129exl-scatter-gather-dma-loops

器件型号:EK-TM4C129EXL
主题中讨论的其他器件:TLC6983EK-TM4C1294XL

您好!

我有一些与外设散聚 DMA 相关的问题。

我需要使用 DMA 将各种数据帧从 RAM 发送到 SSI0。 有时会有一些帧将数据更新到 LED 驱动器 IC (TLC6983)、而有一些常规帧会发送空闲状态和同步消息。 TLC6983需要连续的背对背 SPI 数据流(IDEL/SYNC)。  我计划使用散聚 DMA、其中源是 DMA 任务列表中定义的 RAM 区域、目标始终为 SS!0 TX 寄存器。  理想情况下、DMA 将循环(如数据表中所述)并单独发送空闲状态和同步消息、但当需要显示新映像时、需要使用不同的任务列表来执行此操作、 然后 DMA 会恢复到空闲/同步任务列表。

1.产品说明书指出"在 列表末尾标记为将最后一个条目的控制字编程为采用自动传输模式。" -循环时应该这样做吗? 我怀疑不会、因为它会停止 DMA 控制器。 那么、在循环时、最后一个任务列表条目应该设置为分散集中模式、这与其他条目相同?

2.以这种方式循环时,当任务列表中的最后一个传输运行时 DMA 完成中断是否仍然被置位? (这个条目用来复制主控制结构体、使其返回到列表的开始位置(或者指向一个新的列表)。 如果不是,是否有办法确定名单的末尾?

3.数据表指出最后一个任务列表条目可以指向一个新列表-如何以无缝的方式从任务列表 A 切换到任务列表 B、从而确保连续从任务列表 A 传输到任务列表 B? 理想情况下、任务列表中的最后一个任务将被新任务异步覆盖、 但是、在 DMA 控制器循环时执行此操作听起来很危险、因为 DMA 控制器可能会在更新时尝试访问它-除非这以某种方式被双缓冲。 如果在 DMA 完成 ISR 中对其进行更新、可能太晚了- DMA 将已经循环并重新启动当前任务列表。

4.这应该起作用:请勿循环、而是运行任务列表 A、然后在 DMA 完成中断加载任务列表 B 上并启动 DMA -但这会导致 SSI 传输之间出现间隙。

5. 与上述(4)相关、DMA 完成中断到底将在什么位置设置? 如果是在完成最后一个请求时、则可能存在 SSI 上最后一个字节的 TX 时间、在此时间内需要为 DMA 完整 ISR 提供服务。

提前感谢您的帮助、

马修

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

    您好!

    1. 数据表中注明" 列表末尾的标志是将最后一个控制字编程为采用自动传输模式。" -循环时应该这样做吗? 我怀疑不会、因为它会停止 DMA 控制器。 因此、在循环时、最后一个任务列表条目应将模式设置为分散集中、这与其他条目相同?

    我想您所说的是存储器散聚模式、而不是外设散聚模式。 请参考 C:\ti\TivaWare_C_Series-2.2.0.295\examples\boards\ek-tm4c1294xl\udma_d分散_collect 中的示例。 此示例将同时执行存储器散聚和外设散聚。 对于外设散聚模式、目的外设为 UART。 但您应该了解这个想法、并且可以适应 SSI。  

    查看示例任务列表时、会发现存储器散聚模式的最后一个条目是自动模式。 对于外设任务列表、最后一个条目是 Basic。  

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

    感谢你的帮助。 非常感谢您提供帮助、如有可能、就上面的问题2和3提供帮助。

    此致、

    马修

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    ,如果可能的话,上面有问题2和3。
    2. 以这种方式循环时、当任务列表中的最后一个传输运行时、DMA 完成中断是否仍被置位? (这个条目用来复制主控制结构体、使其返回到列表的开始位置(或者指向一个新的列表)。 如果不是,是否有办法确定已到达列表末尾?

    我想您说的是外设散聚。 如果是这种情况、则没有 DMA 完成中断来指示任务列表中的最后一次传输。 相反、UART 中断本来会指示任务列表已完成。 有关向 UART 的分散集中传输、请参见下面的示例。 您的应用来说、这个想法是相同的。  

    //
    //如果 UART1 DMA TX 通道被禁用,则表示 TX DMA 传输
    //完成。
    //
    if (!MAP_uDMAChannelIsEnabled (uDMA_CHANNEL_UART1TX))
    {
    //
    //开始另一个 DMA 传输到 UART1 TX。 重复同一外设
    //任务列表。
    //
    MAP_uDMAChannelScatterGatherSet (uDMA_CHANNEL_UART1TX、3、
    pvUARTTxTaskList,true);

    //
    // uDMA TX 通道必须重新启用。
    //
    MAP_uDMAChannelEnable (uDMA_CHANNEL_UART1TX);

    3. 数据表指出、最后一个任务列表条目可以指向一个新列表-如何以无缝的方式从任务列表 A 切换到任务列表 B、从而确保连续从任务列表 A 传输到任务列表 B? 理想情况下、任务列表中的最后一个任务将被新任务异步覆盖、 但是、在 DMA 控制器循环时执行此操作听起来很危险、因为 DMA 控制器可能会在更新时尝试访问它-除非这以某种方式被双缓冲。 如果在 DMA 完成 ISR 中对其进行了更新、可能太晚了- DMA 将已经循环并重新启动当前任务列表。

    同意在 DMA 正在进行时更改任务列表会导致危险、如果以异步方式进行。 您只能在任务列表完成后更改任务列表、然后在更新的任务列表中重新启动信道。  

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

    感谢您的帮助 Charles、

    此致、

    马修