你好 ,
我们目前正在研究基于 S32K312 的 FlexCAN 增强型 RX FIFO 和 DMA, enhanced FIFOenhanced FIFO增强型先进先出
我们正在使用 rtd v 7.0.1,希望就我们遇到的几个问题和观察结果进行澄清。
请您确认启用 DMA 的 FlexCAN 增强型 RX FIFO 的推荐 MEX 配置是什么?我们希望确保我们的配置符合预期的RTD使用模型。
根据 FlexCAN 勘误表中的建议,启用增强型 RX FIFO 时,以下消息缓冲区将不使用:
MB0–MB7、MB10、MB12、MB20、MB22、MB30、MB32、MB40、MB50 和 MB60。
我们的配置如下:
观察到的行为:
请解释一下这种情况下的预期行为以及出现消息丢失的可能原因?
在调试 RTD 驱动程序时,我们观察到 FlexCAN_Ip_RxFifo API 似乎会重新配置 DMA 参数。
具体来说:
这导致总传输大小为 64 字节(或根据解释约为 68 字节),这似乎与参考手册中描述的增强型 RX FIFO 条目大小不符。
能否解释一下这个 API 的预期功能以及这些 DMA 设置背后的原理?
调试过程中还观察到,尽管 DMA 似乎将数据从 FIFO 传输到软件缓冲区:
附上屏幕截图供参考。
能否解释一下这是否是预期行为,以及在运行时调试期间应该如何解释增强型 RX FIFO 内存?
我们还观察到 RTD 结构与参考手册之间存在差异。
请问您能否解释一下:
我们的要求是使用:
预期行为是:
有意避开增强型 RX FIFO 保留的消息缓冲区(MB0–MB7、MB10、MB12、MB20、MB22、MB30、MB32、MB40、MB50 和 MB60),而其余的消息缓冲区则用于传输。
请问您能否提供以下信息:
感谢您的支持。
您好,
1. MEX 配置验证
A:看来您的 MEX 与您描述的设置不符。
- 水印设置为 1
- DMA传输配置并非必需,驱动程序会自动配置DMA,除非您想要自行设置DMA参数和传输方式。
2. 增强型接收 FIFO + DMA 数据丢失观察
A:DMA 完成中断后,所有接收到的消息都会被读取,并且分配的 DMA 通道将被禁用。
因此,如果不再调用 FlexCAN_Ip_RxFifo,RXFIFO 仍然会从条目 0 开始接收消息,但由于 DMA 没有再次启动,因此不会读取 RXFIFO。
3. FlexCAN_Ip_RxFifo DMA 重配置
A:什么是次要循环计数?驱动程序本身将次要循环大小(字节)设置为 80,以便从 RXFIFO 读取最多 64 字节的有效负载消息以及 IDHIT 和时间戳信息。
所以,我其实不太明白你的计算方法。或许可以分享一下你的代码
4. 增强型接收 FIFO 存储器观察
A:仅第一个增强型 RX FIFO 元素区域可见,表示增强型 FIFO 输出端口地址范围。调试期间不建议显示 RXFIFO 内存。为了使 FIFO 引擎正常运行,CPU 在 DMA 操作期间不应访问增强型 FIFO 输出端口地址范围,实际上显示此内存空间会导致对其进行读取。
5. 结构尺寸不匹配
A:FlexCAN_Ip_MsgBuffType 不能完全反映 RXFIFO 结构。传输结束时,驱动程序读取内部缓冲,并将相应的数据填充到用户缓冲区的相应字段中。
如上所述,DMA 应设置为每次 DMA 请求读取 80 字节。
驱动程序的编写方式是,在 DMA 完成并调用 FLEXCAN_EVENT_DMA_COMPLETE 事件后,需要重新激活 DMA(调用 FlexCAN_Ip_RxFifo)。
您可以参考下面的演示来增强 RXFIFO 和 DMA 的使用,但这是在 RTD400 中实现的。
https://community.nxp.com/t5/S32K-Knowledge-Base/Example-S32K344-FlexCAN-Ip-TX-RX-EnhanceRXFIFO-DMA-...
BR,彼得