文章来源 Cytech Engineer

瑞萨 RL78/F13 MCU 的 CAN 滤波机制介绍以及调试经验分享

一、前言

在车载电子系统中,CAN 总线几乎无处不在。多个 ECU (Electronic Control Unit,电子控制单元) 通过 CAN 总线交换控制命令、状态信息以及诊断数据,实现整车各功能模块之间的协同工作。

众所周知,CAN 总线采用广播通信机制。当某个 ECU 发送一帧 CAN 报文时,总线上的所有节点都能够接收到该报文。然而,并非所有报文都与每个 ECU 相关。如果 MCU 对所有接收到的报文都进行存储、解析和处理,不仅会占用宝贵的 CPU 资源,还会增加中断处理负担,影响系统实时性和整体运行效率。

为了解决这一问题,CAN 控制器通常提供硬件报文过滤功能。在报文进入接收缓冲区之前,控制器会根据预先配置的过滤规则对报文进行筛选,仅允许符合条件的报文进入后续处理流程,从而显著降低软件处理压力。

对于瑞萨 RL78/F13 而言,其 CAN 模块提供了灵活的 Receive Rule Table (接收规则表) 机制,可在硬件层面完成报文过滤、分类和存储管理。本文将结合实际项目经验,对 RL78/F13 的 CAN 接收过滤机制进行介绍,并分享开发过程中遇到的典型问题及排查思路。

   

二、CAN 接收规则表介绍

为了对接收到的报文进行过滤,需要配置接收规则表 (Receive Rule Table),这是 CAN 报文过滤很重要的一环。通过接收规则表执行的数据处理后,符合条件的报文将被存储到指定的缓冲区中。

接收规则表的数据处理功能包括:

  • 接收过滤处理 (Acceptance Filter Processing)
  • DLC 过滤处理 (DLC Filter Processing)
  • 路由处理 (Routing Processing)
  • 标签添加 (Label Addition)
  • 镜像功能 (Mirror Function)

配置接收规则时,需要指定以下内容:

  • 接收规则数量 (Number of Receive Rules)
  • IDE 位、RTR 位以及 CAN ID
  • 接收规则的目标报文 (Messages Target for the Receive Rules)
  • IDE 掩码、RTR 掩码以及 ID 掩码
  • DLC 检查功能 (DLC Check Function)
  • 接收规则标签 (Receive Rule Labels)
  • 报文存储目标缓冲区 (Buffers to Store Messages)
图1 CAN 报文接收规则示意图
图1 CAN 报文接收规则示意图

关于 CAN 接收规则表的配置的代码形式可以参考如下:
 

#if CAN_RX_RULE_NUM > 0

const uint16_t g_rxrule_table[CAN_RX_RULE_NUM][6] = {

    /* IDL,   IDH,   ML,     MH,     PL,     PH */

    { 0x0123U, 0x0000U, 0xFFFFU, 0x0000U, 0x0000U, 0x0000U },   // 标准帧 0x123 → Buffer0

};

#endif

以上代码的第一维表示接收规则编号 (Rule0~RuleN),第二维表示该规则对应的 6 个 GAFL 配置寄存器 (IDL、IDH、ML、MH、PL、PH)。初始化时,程序会将数组中的内容逐条写入 CAN 模块的 Receive Rule 寄存器,从而建立完整的接收过滤规则表。

    

1. IDL 和 IDH 配置明细

图2 CAN Receive Rule Entry Register jAL (GAFLIDLj) (j = 0 to 15) 寄存器配置表
图2 CAN Receive Rule Entry Register jAL (GAFLIDLj) (j = 0 to 15) 寄存器配置表
图3 CAN Receive Rule Entry Register jAH (GAFLIDHj) (j = 0 to 15)寄存器配置表
图3 CAN Receive Rule Entry Register jAH (GAFLIDHj) (j = 0 to 15)寄存器配置表

IDL+IDH 合起来其实就是一整个 ID 的信息,前 16 位是 IDL 部分,后 16 位是 IDH 部分。其中 IDL 的 0-15 位全是报文 ID 的 ID 大小,在标准帧只有 11 位的情况下,IDL 部分足以涵盖标准帧 ID 的大小。如果是扩展帧的话,则 IDL 的 16 位不够用,需要再加上 IDH 部分的低 13 位,一共 29 位 ID 长度。

剩下的 3 位功能如下:

Bit 13:选择收信规则目标,如果是 1 可以接收自己节点发送的 ID 报文,如果是 0 只能接收外部报文。

Bit 14:RTR 选择,如果是 1 则该帧被标记为远程帧。

Bit 15:选择是不算扩展帧,如果是为 1,否则为标准帧为 0。

    

2. ML 和 MH,即掩码信息配置明细

图4 CAN Receive Rule Entry Register jBH (GAFLMHj) (j = 0 to 15) 寄存器配置表
图4 CAN Receive Rule Entry Register jBH (GAFLMHj) (j = 0 to 15) 寄存器配置表
图5 CAN Receive Rule Entry Register jCL (GAFLPLj) (j = 0 to 15) 寄存器配置表
图5 CAN Receive Rule Entry Register jCL (GAFLPLj) (j = 0 to 15) 寄存器配置表

ML 和 MH 部分这两个是掩码部分对应的寄存器,比较简单粗暴,其实就是和 ID 进行每一位的比对,如果是 1 表示要比,0 则不用比较。

    

3. PL 部分配置明细

图6 CAN Receive Rule Entry Register jCL (GAFLPLj) (j = 0 to 15) 寄存器配置表
图6 CAN Receive Rule Entry Register jCL (GAFLPLj) (j = 0 to 15) 寄存器配置表

该部分寄存器的主要功能是当某条过滤规则匹配成功后,决定报文要存到哪里。

Bit 15:控制是否使用 Receive Buffer

Bit 14~8:指定写入哪个 Receive Buffer

Bit 7~5:预留位,只能写 0

Bit 4:控制是否写入 Transmit/Receive FIFO0

Bit 3~2:预留位,只能写 0

Bit 1:控制 Receive FIFO0,0 是不使用,1 是写入使用

    

4. PH 部分配置明细

图7 CAN Receive Rule Entry Register jCH (GAFLPHj) (j = 0 to 15) 寄存器配置表
图7 CAN Receive Rule Entry Register jCH (GAFLPHj) (j = 0 to 15) 寄存器配置表

该寄存器主要负责决定报文有什么附加属性。

Bit 15~12:DLC 检查,检查报文携带多少字节数据

Bit 11~0:Label 标签,给进入的报文携带额外的标签

   

三、实际调试案例:CAN 过滤规则超限导致“幽灵帧”出现

问题现象

项目调试过程中,使用 PCAN 抓取总线数据时,发现总线上持续出现两条来源不明的 CAN 报文,但是其他系统中有的报文也都正常出现。由于当前环境未搭建其他 ECU 仿真节点,系统中也未配置远程帧 (Remote Frame),因此初步判断该现象属于软件配置异常。

图8 现场调试过程中截取的 PCAN 上的 CAN 问题报文
图8 现场调试过程中截取的 PCAN 上的 CAN 问题报文

排查过程

由于项目硬件设计与上一代产品基本一致,因此首先从软件配置差异入手进行比对。经过逐步定位,最终发现问题出现在 CAN Receive Rule Table 的配置上。瑞萨 RL78/F13 最多仅支持 16 条接收规则,而新项目中实际配置了 18 条接收规则,超出了硬件允许范围。

图9 目标设备和他们对应参数
图9 目标设备和他们对应参数

如上图 (图9) 显示,F13 和 F14 最多为 16 个规则 (0~15)。

因为在旧项目共使用 15 个 CAN ID,因此接收规则数量为 15 条。新项目增加了部分功能报文,CAN ID 总数增加至 18 个,但在移植代码过程中,开发人员直接按照报文数量配置了 18 条接收规则,导致超出了硬件限制。超出的规则区域覆盖了后续寄存器空间,从而导致系统出现异常接收现象,最终表现为 PCAN 中出现两条“幽灵帧”。

问题验证

Dummy 了两个 ID 过滤规则后,幽灵帧报文不再出现。

新的问题

如果有 18 个 ID,但是最大只能 16 的情况下如何变通?

对应方法

可以通过修改掩码配置,将两条 ID 合并到一条的方式去过滤,设置成符合 16 个数目,但是实际上对应着 18 条的规则。

通过以上设定,最终幽灵帧消失,一切正常,且原有的 18 条报文也正常出现在 PCAN 上。

   

四、总结

CAN 接收过滤机制是 RL78/F13 CAN 模块的重要特性之一。合理利用 Receive Rule Table 不仅能够降低 MCU 负载,提高系统实时性,还能够有效优化接收资源的分配。在实际项目开发过程中,除了关注过滤逻辑本身外,也需要特别注意接收规则数量、Buffer 配置以及 Mask 的使用方式,避免因配置超限而引发难以定位的问题。通过充分理解硬件过滤机制,可以让 CAN 网络设计更加高效、稳定和可靠。

欲了解关于更多瑞萨相关方案或技术信息,请与骏龙科技当地的办事处联系或点击下方「联系我们」,提交您的需求,骏龙科技公司愿意为您提供更详细的技术解答。

更多信息: