您好!
客户已成功使用其他 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