4. RH850 CAN控制器配置与报文收发

RH850 系列 MCU 通常集成 RS-CAN 或 RS-CANFD 控制器,其报文收发能力并不取决于“调用了哪个库函数”,而取决于对一组寄存器与消息缓冲结构的正确编排。理解这一点的关键,是把控制器看成一个“消息存储 + 过滤 + 事件通知”的硬件子系统:CPU 负责初始化与搬运,控制器负责位流收发、验收滤波和状态机推进。本节以 RS-CAN 的典型结构为参照,给出可直接迁移到工程代码的配置思路与示例参数。

一、控制器初始化:从模块停止到进入通道通信

RH850 的 CAN 通道在复位后处于模块停止或复位状态,必须按顺序解除保护、配置位时序、再进入通信。典型顺序如下:

  1. 解除寄存器写保护:向 RSCAN0GAFLCFG0 等全局寄存器写入前,需先通过 RSCAN0GAFLECTR 的 AFLDAE 位使能访问;通道相关寄存器则受 RSCAN0C0CTR 的 CTME 等位控制。
  2. 设置通道进入复位/停止:将 RSCAN0C0CTR 的 CSLPR 置 1,使通道进入停止状态,避免在配置过程中误发报文。
  3. 配置位时序:根据目标波特率计算 BRP、TSEG1、TSEG2、SJW。例如 PCLK=80 MHz、目标 500 kbps、采样点 80% 时,可取 BRP=9(分频后 8 MHz,tq=125 ns),TSEG1=13 tq、TSEG2=3 tq、SJW=3 tq,写入 RSCAN0C0CFG 与 RSCAN0C0CTR 对应字段。
  4. 配置全局滤波与接收规则:设置 RSCAN0GCFG 的 TPRI、DCE 等,决定发送优先级与 DLC 检查行为。
  5. 退出停止/复位,进入通信:清 CSLPR,等待 RSCAN0C0STS 的 CSLPSTS 归零,再置 CTME 使能发送/接收。

这一顺序中,最容易出错的是“先使能通信再配位时序”。若在 CTME=1 时修改 BRP,控制器可能进入错误状态并触发总线关闭。因此工程上应把“进入停止 → 配置 → 退出停止”作为固定三段式。

二、邮箱与 FIFO:把报文放到正确的硬件槽位

RS-CAN 提供两类消息存储:邮箱(Mailbox) 与 FIFO。邮箱适合“固定 ID、固定方向、需要独立中断”的场景,例如网关中某几个关键控制报文;FIFO 适合“一组 ID 连续到达、按顺序处理”的场景,例如诊断响应或周期状态帧。

邮箱配置的核心是 RSCAN0CF0ID(ID 与 IDE/RTR 位)、RSCAN0CF0DL(DLC)、RSCAN0CF0D(数据区)以及 RSCAN0CF0M(掩码)。发送邮箱还需置 RSCAN0CF0T 的 TMOM 等位;接收邮箱则通过 RSCAN0CF0R 的 RMP 选择接收规则。FIFO 则通过 RSCAN0RF0 系列寄存器设置深度、水印与接收规则,并用 RSCAN0RF0STS 观察当前填充级别。

一个常见的工程做法是:把 0x100~0x10F 这 16 个 ID 分配给接收 FIFO0,深度设为 8,水印设为 4;把 0x200 这个单 ID 分配给接收邮箱 0,用于紧急事件;发送侧用发送 FIFO0 承载周期报文,用发送邮箱 1 承载事件报文。这样中断源清晰,CPU 负载可控。

三、验收滤波:让硬件先替 CPU 做筛选

验收滤波由 RSCAN0GAFLID、RSCAN0GAFLM、RSCAN0GAFLP0、RSCAN0GAFLP1 等寄存器描述。每条规则包含 ID、掩码、IDE/RTR 匹配位以及目标 FIFO/邮箱编号。掩码为 1 的位参与比较,为 0 的位忽略。例如要接收 0x100~0x10F,可设 ID=0x100、掩码=0x7F0,并把目标指向 RF0;要精确接收 0x200,则设 ID=0x200、掩码=0x7FF,目标指向邮箱 0。

滤波规则数量有限,因此应优先覆盖“必须由硬件实时响应”的报文,其余交给软件二次过滤。若规则冲突,控制器按规则编号优先级匹配,工程上应把最严格的规则放在前面。

四、中断与轮询混合收发

纯中断在突发流量下会造成频繁上下文切换,纯轮询又可能漏掉紧急帧。混合策略是:接收用中断,发送用轮询,或对高优先级邮箱用中断、对 FIFO 用轮询。具体地,使能 RSCAN0C0IE 的 RFIE(接收 FIFO 中断)与 RMIE(接收邮箱中断),在 ISR 中只做“取数据 + 置标志”,把解析与转发放到主循环;发送侧在主循环中检查 RSCAN0CF0T 的 TMOM 或发送 FIFO 的 TXIF,空闲时写入下一帧。

下面给出一个可参考的初始化与收发骨架(示例参数,非实测):

/* 1. 进入停止 */
RSCAN0C0CTR |= 0x00000001;              /* CSLPR = 1 */
while (RSCAN0C0STS & 0x00000001);       /* 等待 CSLPSTS = 0 */

/* 2. 位时序:PCLK=80MHz, 500kbps, 采样点 80% */
RSCAN0C0CFG = (9u << 0) | (13u << 8) | (3u << 12) | (3u << 16);

/* 3. 验收滤波:0x100~0x10F -> RF0 */
RSCAN0GAFLECTR = 0x00000001;            /* AFLDAE = 1 */
RSCAN0GAFLID   = 0x100u << 0;
RSCAN0GAFLM    = 0x7F0u << 0;
RSCAN0GAFLP0   = 0x00000000;            /* 目标 RF0 */
RSCAN0GAFLECTR = 0x00000000;

/* 4. 接收 FIFO0:深度 8,水印 4 */
RSCAN0RF0 = (8u << 0) | (4u << 8);

/* 5. 退出停止并使能通信 */
RSCAN0C0CTR &= ~0x00000001;
while (RSCAN0C0STS & 0x00000001);
RSCAN0C0CTR |= 0x00000002;              /* CTME = 1 */

/* 6. 中断使能:接收 FIFO + 接收邮箱 */
RSCAN0C0IE |= 0x00000010 | 0x00000020;

在 ISR 中,读取 RSCAN0RF0STS 判断填充级别,再从 RSCAN0RF0D 取数据;若为邮箱中断,则读 RSCAN0CF0D 并清 RSCAN0CF0R 的 RMP 标志。发送时,主循环检查发送 FIFO 的 TXIF,若为空则写入 RSCAN0TF0ID 与 RSCAN0TF0D,再置 RSCAN0TF0T 的 TXTR 触发发送。

调试建议:先用回环模式(RSCAN0C0CFG 的 LBME 置 1)验证滤波与收发路径,再切到正常模式接总线。回环模式下若收不到自己发的帧,优先检查验收滤波目标是否指向了正确的 FIFO/邮箱。

五、结果判读与常见异常

判断配置是否生效,可观察三类信号:RSCAN0C0STS 的 BOF、EPF、EWF 反映总线错误状态;RSCAN0RF0STS 的填充级别反映接收是否持续到达;RSCAN0C0ERFL 的 FEF、AEF、ALF 分别指示格式错误、ACK 错误与仲裁丢失。若 FEF 频繁置位,通常是位时序或采样点不匹配;若 AEF 频繁置位,则检查终端电阻与总线拓扑。

RH850 RS-CAN 报文收发路径与配置对象 CPU 侧 初始化序列 停止→位时序→滤波→通信 中断服务程序 取数据 + 置标志 主循环轮询 发送 FIFO 空闲检测 状态判读 BOF/EPF/EWF/FEF 回环自检 LBME=1 验证路径 RS-CAN 控制器 验收滤波 GAFLID / GAFLM / GAFLP0 掩码匹配 → 目标 FIFO / 邮箱 接收 FIFO0 深度 8 / 水印 4 RF0STS 填充级别 接收邮箱 0 ID 0x200 精确匹配 CF0R 标志清除 发送 FIFO0 周期报文 TXIF 空闲触发 发送邮箱 1 事件报文 TMOM 状态检查 位时序 C0CFG / C0CTR BRP=9, TSEG1=13, TSEG2=3, SJW=3 CAN 总线 差分信号 CANH / CANL 终端电阻 120 Ω × 2 错误状态 BOF / EPF / EWF 仲裁与 ACK ALF / AEF 判读 接收路径:总线 → 验收滤波 → FIFO/邮箱 → 中断 → CPU;发送路径:CPU → 发送 FIFO/邮箱 → 位时序 → 总线

把上述配置落到工程中,建议形成一份“通道配置检查表”:位时序参数是否与总线采样点一致、验收滤波目标是否指向正确槽位、中断使能位是否与 ISR 匹配、发送触发条件是否在空闲时写入。只要这四项对齐,RH850 的 CAN 收发就能从“能通”走向“稳定可控”。