2411682_zh-CN

取消
显示结果 
显示  仅  | 搜索替代 
您的意思是: 

2411682_zh-CN

2411682_zh-CN

#S32K388 增强型 RX FIFO + eDMA:无需 CPU 中断的连续循环缓冲区接收

您好,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。

谢谢您!

Re: #S32K388 Enhanced RX FIFO + eDMA: Continuous Circular Buffer Reception Without CPU Interrupts

你好@zhangyu5454 ,

该驱动程序的编写方式要求在FLEXCAN_EVENT_DMA_COMPLETE 事件中调用 FlexCAN_Ip_RxFifo() 以重新启用接收。

理论上可以实现从DMA到缓冲区的连续传输;但是,您需要修改RTD或创建自己的驱动程序。很遗憾,这超出了我们的支持范围,如果要进行此操作,则应由您自行测试其验证和功能。

您需要设置 TCDn_CSR[D_REQ] = 0 (DisAutoHwRequest = FALSE) & TCDn_CSR[INTMAJOR] 以保持通道启用并禁用中断,以及配置您的循环数据队列。您可以参考S32K3 产品页面和“安全文件”下的 S32K3 DMA 培训演示文稿。

此致,
朱利安

标记 (1)
无评分
版本历史
最后更新:
4 周之前
更新人: