4. RH850 CAN控制器配置与报文收发
RH850 系列 MCU 通常集成 RS-CAN 或 RS-CANFD 控制器,其报文收发能力并不取决于“调用了哪个库函数”,而取决于对一组寄存器与消息缓冲结构的正确编排。理解这一点的关键,是把控制器看成一个“消息存储 + 过滤 + 事件通知”的硬件子系统:CPU 负责初始化与搬运,控制器负责位流收发、验收滤波和状态机推进。本节以 RS-CAN 的典型结构为参照,给出可直接迁移到工程代码的配置思路与示例参数。
一、控制器初始化:从模块停止到进入通道通信
RH850 的 CAN 通道在复位后处于模块停止或复位状态,必须按顺序解除保护、配置位时序、再进入通信。典型顺序如下:
- 解除寄存器写保护:向
RSCAN0GAFLCFG0等全局寄存器写入前,需先通过RSCAN0GAFLECTR的AFLDAE位使能访问;通道相关寄存器则受RSCAN0C0CTR的CTME等位控制。 - 设置通道进入复位/停止:将
RSCAN0C0CTR的CSLPR置 1,使通道进入停止状态,避免在配置过程中误发报文。 - 配置位时序:根据目标波特率计算
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对应字段。 - 配置全局滤波与接收规则:设置
RSCAN0GCFG的TPRI、DCE等,决定发送优先级与 DLC 检查行为。 - 退出停止/复位,进入通信:清
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 频繁置位,则检查终端电阻与总线拓扑。
把上述配置落到工程中,建议形成一份“通道配置检查表”:位时序参数是否与总线采样点一致、验收滤波目标是否指向正确槽位、中断使能位是否与 ISR 匹配、发送触发条件是否在空闲时写入。只要这四项对齐,RH850 的 CAN 收发就能从“能通”走向“稳定可控”。