在工业自动化、智能交通、机器人等领域,CANFD(CAN with Flexible Data-Rate)技术正逐步取代传统CAN,以适应更高的数据速率和更复杂的通信需求。本文将深入解析RZ/N2L CANFD模块的缓冲区机制,帮助工程师更高效地管理CAN消息,提高系统性能。(下面的内容主要涉及RZN2L CANFD外设手册的解读,篇幅较长,感兴趣的读者可以收藏,以备日后不时之需)
RZN2L CAN-FD模块提供高达8 Mbps的数据速率,支持丰富的缓冲管理机制(独立缓冲、FIFO缓冲、共享缓冲),提供完整的消息过滤、错误检测、消息路由及传输管理,同时具备低功耗模式和测试功能,适用于工业控制、汽车电子、自动化系统等需要高可靠性和高性能通信的应用。
接着前面的章节,下面是关于FIFO中断配置的深入解析:
1FIFO中断模式配置
CFDRFCCn.RFIM(RXFIFO)和CFDCFCCn.CFIM(公共FIFO)控制中断生成条件。
模式0(InterruptMode=0):
RX FIFO:FIFO计数器达到阈值(RFIGCV/CFIGCV配置)时触发中断。
TX FIFO:成功发送最后一条消息时触发中断。
GWFIFO:
接收帧:消息计数器达到阈值时触发中断。
发送帧:最后一条消息成功发送后触发中断。
模式1(InterruptMode=1):
RXFIFO:每接收一条消息即触发中断。
TXFIFO:每条消息成功发送后触发中断。
GWFIFO:
接收帧:消息存入FIFO时触发中断。
发送帧:消息成功发送后触发中断。
2中断阈值配置
阈值寄存器:
CFDRFCCn.RFIGCV[2:0](RXFIFO)和CFDCFCCn.CFIGCV[2:0](公共FIFO)。
实际触发消息数:
根据FIFO深度(由FDC[2:0]位配置)计算。
示例:若FIFO深度为64消息(FDC=110b),配置阈值1/4满(001b),则触发阈值为16条消息。
3关键限制与注意事项
1.阈值配置依赖FIFO深度:
FDC[2:0]位配置的FIFO深度决定了阈值配置的有效性
例如:若FIFO深度为4消息(FDC=001b),某些阈值(如1/8满)可能不可用。
2.模式0的阈值应用:
仅在InterruptMode=0时生效,需确保阈值配置与FIFO深度匹配。
3.硬件无自动检查:
用户需自行验证配置合法性,避免因阈值超限导致中断失效。
4
应用场景建议
模式0(阈值触发):
适用于需要减少中断频率的场景(如高吞吐量系统),通过设定较高阈值(如3/4满)降低CPU负载。
模式1(每条消息触发):
适用于实时性要求高的场景(如关键控制指令),确保每条消息的即时处理。
GW模式中断:
需根据数据优先级选择接收/发送中断策略,避免关键消息丢失。
潜在问题与解决
中断未触发:
检查FDC[2:0]与阈值配置是否兼容(如深度过小时,阈值比例可能无效)。
确认Interrupt Mode位设置是否正确。
中断频率过高:
调整阈值至更高比例(如7/8满),或切换为模式0。
配置冲突:
若FIFO深度为0(未启用),所有中断配置均无效,需重新配置深度。
示例配置
1RX FIFO(高吞吐量场景):
深度:64消息(FDC=110b)。
中断模式:0(阈值触发)。
阈值:3/4满(101b),触发阈值48条消息。
2TX FIFO(实时控制):
中断模式:1(每条消息触发),确保每条指令的发送状态被即时监控。
3GW FIFO(数据转发):
接收中断:模式1(消息存入即触发),发送中断:模式0(最后一条消息触发)。
代码调试结果补充:
在RZN2L的canfd的example program中,对“RZN2L_RSK_canfd_Rev100a”工程做如下的配置:
开启CAN_TEST_MODE_LOOPBACK_EXTERNAL的回环测试模式
通过4个不同的MB(Message Buffer)id发送4帧数据(不使能发送中断):
接收FIFO的设置:
Loopback Mode下的发送行为:
在不开启TX中断(Transmit Interrupt)的情况下发送数据帧。
如果发送的帧数少于4,则不会触发RX中断。
FIFO配置相关:
在FSP(Flexible Software Package,瑞萨的软件框架)中配置FIFO时:
先启用FIFO(即使能FIFO功能)。
然后设置FIFO的Depth(深度),即FIFO的存储容量。
再设置FIFO的中断模式(Interrupt Mode),即何时触发中断。
最后设置中断阈值(Interrupt Threshold Value)
如果使用同一个MB id发送,需要使能对应的MB的TX中断,比如用MB0来发送,可以使用如下的发送代码和配置:
在使用不同的TXMB ID来发送CANFD数据帧的情况下,如果发送的帧数大于或等于4,才会触发RX中断,小于4则不会触发RX中断。在使用一个TXMB ID的情况下,对于接收FIFO的行为来说是一样的。如果发送的帧数大于或等于4,才会触发RX中断,小于4则不会触发RX中断。通过阈值的方式触发RX中断后,RX FIFO中的数据帧将逐一产生中断,直到RX FIFO中的数据帧为空。比如RX FIFO中有4帧数据,那么将逐一产生4次RX中断。注意这里并不是产生一次中断。