您好,NXP技术支持,
我正在使用带有FlexCAN 增强型 RX FIFO和 RTD 的S32K388 。我希望实现基于DMA的连续CAN接收,而无需任何CPU中断。
我的要求是:
MCU: S32K388
CAN:传统 CAN ,CAN FD 已禁用
CAN 有效载荷: 8 字节
FlexCAN增强型RX FIFO已启用
DMA接收已启用
我需要接收任何 CAN ID的 CAN 消息,无需过滤。
我希望 DMA 将接收到的每个 CAN 帧自动传输到RAM 软件环形缓冲区中。
我不需要 FlexCAN RX 中断。
我也不希望出现 DMA 主循环完成中断。
DMA 应该继续自动运行,而无需 CPU 再次调用 FlexCAN_Ip_RxFifo()。
理想情况下,每个接收到的 FIFO 元素都应该立即触发 DMA 传输,因此我不想等待较大的 FIFO 水印。
我查看了RTD源代码。在 FlexCAN_StartRxMessageEnhancedFifoData() 函数中,我发现驱动程序对 DMA 的配置大致如下:
Source address = Enhanced RX FIFO output Source transfer size = 4 bytes Source offset = 4 bytes Destination transfer size = 4 bytes Destination offset = 4 bytes Minor loop size = 80 bytes Major loop count = num_enhanced_watermark EnMajorInt = TRUE DisAutoHwRequest = TRUE
我了解到,当前的 RTD 实现执行有限的 DMA 传输后便停止,需要再次调用 FlexCAN_Ip_RxFifo()。
我的问题是:
在 S32K388 上,是否可以配置 eDMA TCD,使 FlexCAN 增强型 RX FIFO DMA 请求能够连续地将接收到的 FIFO 元素传输到循环 RAM 缓冲区中,而无需任何 CPU 中断或软件重新激活?
具体来说,能否使用目标模数和/或其他 eDMA TCD 功能来实现这种连续环形缓冲器?
如果可以的话,能否提供一个配置示例,或者给我推荐一个 NXP 的示例/参考实现?
如有必要,我愿意修改 RTD FlexCAN 驱动程序或直接配置 eDMA TCD。
谢谢您!
你好@zhangyu5454 ,
该驱动程序的编写方式要求在FLEXCAN_EVENT_DMA_COMPLETE 事件中调用 FlexCAN_Ip_RxFifo() 以重新启用接收。
理论上可以实现从DMA到缓冲区的连续传输;但是,您需要修改RTD或创建自己的驱动程序。很遗憾,这超出了我们的支持范围,如果要进行此操作,则应由您自行测试其验证和功能。
您需要设置 TCDn_CSR[D_REQ] = 0 (DisAutoHwRequest = FALSE) & TCDn_CSR[INTMAJOR] 以保持通道启用并禁用中断,以及配置您的循环数据队列。您可以参考S32K3 产品页面和“安全文件”下的 S32K3 DMA 培训演示文稿。
此致,
朱利安