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.

[参考译文] RM57L843:使用 DMA 和虚拟通道的循环缓冲器问题

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

https://e2e.ti.com/support/microcontrollers/arm-based-microcontrollers-group/arm-based-microcontrollers/f/arm-based-microcontrollers-forum/572830/rm57l843-issue-with-circular-buffer-using-dma-and-dummy-channel

器件型号:RM57L843

您好!

客户已成功使用其他 e2e 帖子来实现具有 DMA 和虚拟通道的循环缓冲器

客户 正在尝试使用 RM57上的 DMA 用从 SCI 接收到的数据填充循环缓冲区。 E2E 网站非常有帮助、其中的答案让 他一路前进;现在、只有一个问题、如果得到解决、一切都可以正常工作。

下面是设置:

    • 设置3个 DMA 通道:
      • 填充大型(1KiB)缓冲器的 RX 通道、具有自动启动功能且启用了 BTC。 使用帧传输模式、其中1字节的帧由 SCI DMA 硬件请求触发。 端口 B 读取、端口 A 写入。
      • 软件 触发的"虚拟"通道、从任意外设寄存器传输一个字(我选择了 DMA PTCRL 寄存器、但结果未使用)。 该通道用于强制仲裁。 端口 B 读取、端口 A 写入。
      • 由与 RX 通道相同的请求硬件触发的"Sentinel "通道。 在任意位置之间传输1个字节。  该通道的使能位在 RX 块的第一个帧上被操作、然后在缓冲区回绕之前不被触发。
    • 为每个通道设置 BTC 中断:
      • RX 通道 BTC 清除"transfer in progress"标志、并检查溢出。
      • 虚拟 BTC 读取 RX 通道的工作控制数据包并存储 CFTCOUNT 域、以便应用程序知道它可以安全读取的距离。 它还会执行额外的溢出检查。
      •  Sentinel BTC 设置"正在进行传输"标志、以便虚拟 BTC 可以判断 仲裁是否已触发;缓冲区可能已填充、在这种情况下不会触发仲裁、CFTCOUNT 也不会写回 WCP。 在这种情况下、应用程序需要知道它无法读取超过缓冲区末尾的数据。

通过从我的 PC 发送一系列字节并检查接收到的序列是否与发送的序列相匹配来测试设置。 它运行完美、除了在一个条件下:当虚拟通道传输在 SCI 上的一个字节边界上发生时(以便最后一个字节结束、下一个字节在虚拟传输进行期间开始)、DMA 停止更新 WCP。 此后、CFTCOUNT 被冻结、不再更新、因此应用程序无法再判断缓冲区中有多少数据。

 

 客户不确定导致此行为的原因、但他们认为它与 DMA 状态机有关。 非常感谢您的任何建议!

此致、

-Gunter

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

    Gunter、

    所以我不能完全理解这种方法、除了最初的帖子似乎是强制仲裁、从而强制将控制数据包写回 DMA 的存储器。

    我不确定 RM57的行为会有何不同、因为与 RM46不同 、RM57 DMA 已升级。

    以下是 RM46手册的方框图:

     

    与 RM57手册中的此方框图进行比较:

    了解 RM57的 DMA 上有两个并行 FIFO 和端口吗?


    我本能地说、这可能会与一些其他关键的时序混淆、这些时序使该方案在 RM46上有效、但可能对 RM57有危险。


    或者、RM46也有危险、原始帖子未看到。


    我不知道实际答案、但芯片的设计实际上并没有考虑到这一特性。   没有可靠的方法强制回写控制数据包、这样 它就可以通过软件读取'id flight'。   至少没有一个计划中的项目。


    这肯定是在此器件上集成 SCI 和 DMA 的一个缺点。

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

    Gunter 代表我发布了这个问题。 我知道我正在(或过去)系统设计工作的边缘工作、但我最终能够使其工作! 我最后中断了 Sentinel 通道、并重新配置了虚拟通道:现在它被链接到 RX 通道、并且在接收到每个帧后、它会将 CTCOUNT 寄存器从 SCI RX 通道传输到 RAM 中的某个位置。 我确信它会影响 DMA 的性能、但我已经对它进行了测试、发现它可以满足我们的需求。

    感谢您的所有帮助、
    Trevor