2. RH850 CAN FD硬件架构解析
在RH850系列MCU(以RH850/F1x、RH850/C1M等常见车规型号为例)中,CAN FD通信并不是由CPU直接逐位操作完成的,而是由一套相对独立的硬件子系统承担:CAN FD控制器(也称CAN-FD模块,如RSCAN、RSCAN-FD、RCAN等)负责协议层与位流处理,消息RAM(Message RAM)负责报文缓冲,发送/接收FIFO负责流量整形与批量收发,过滤器负责接收筛选,中断与DMA负责把事件和数据搬运到CPU或内存。理解这套硬件架构,是后续做故障注入的前提——因为故障注入本质上是在“可控的硬件边界”上制造异常,而不是随意改内存。
一、CAN FD控制器的内部功能划分
RH850的CAN FD控制器通常包含以下几个关键子模块:
- 协议引擎(Protocol Engine):处理CAN FD帧格式、位填充、CRC、ACK、错误帧、仲裁与位定时。它直接连接CAN收发器(外部PHY),是物理层与协议层的交界。
- 位定时逻辑(Bit Timing Logic):由寄存器配置波特率预分频、时间段1/2、同步跳转宽度等,决定仲裁段与数据段的速率。
- 消息处理器(Message Handler):负责把协议引擎收到的帧写入消息RAM,或从消息RAM取出待发送帧送入协议引擎。
- 寄存器接口:CPU通过外设总线访问控制寄存器、状态寄存器、中断寄存器、错误计数器和消息RAM窗口。
从故障注入视角看,协议引擎和位定时逻辑属于“难以直接干预”的硬件,而寄存器接口和消息RAM则是“可触及”的边界。因此,后续注入点大多落在寄存器写入、消息RAM内容、FIFO指针和过滤器配置上。
二、消息RAM与FIFO的结构关系
消息RAM是CAN FD控制器内部的一块专用SRAM,通常按“报文槽(Message Buffer)”组织。每个槽包含:标识符(ID)、控制字段(DLC、FDF、BRS、ESI等)、数据字段(最多64字节)、时间戳和状态位。RH850的CAN FD模块一般把消息RAM划分为多个区域:
- 发送缓冲区(TX Buffer):每个发送对象对应一个或多个槽,CPU写入数据后置位发送请求。
- 接收缓冲区(RX Buffer):按过滤器匹配结果写入,可配置为FIFO或独立槽。
- 发送FIFO(TX FIFO):多个待发报文按顺序排队,适合周期性报文批量发送。
- 接收FIFO(RX FIFO):多个接收报文按到达顺序排队,减少CPU中断次数。
- 过滤器区域:存放接收过滤规则,通常与接收FIFO配合使用。
消息RAM的访问通常通过“窗口寄存器”间接进行:先写地址寄存器指向某个槽,再读写数据寄存器。这种间接访问方式意味着,如果地址寄存器被错误修改,就可能读写到错误的槽——这正是故障注入可以模拟的一类硬件异常。
三、过滤器与接收路径
接收路径的核心是过滤器。RH850 CAN FD控制器通常提供多组过滤器,每组包含ID寄存器、掩码寄存器和FIFO选择位。当一帧到达时,消息处理器把帧ID与过滤器逐条比较,命中后写入对应的RX Buffer或RX FIFO。过滤器可以配置为“精确匹配”或“掩码匹配”,掩码为1的位参与比较,为0的位忽略。
例如,假设要接收ID为0x123的标准帧,可设置ID寄存器为0x123,掩码寄存器为0x7FF(11位全比较)。若要接收0x120~0x12F范围内的一批ID,可设置ID=0x120,掩码=0x7F0,这样低4位被忽略。这种配置在故障注入中很有用:通过修改掩码,可以让原本应被过滤掉的报文进入接收FIFO,模拟“过滤器失效”类故障。
四、中断与DMA通路
CAN FD控制器产生的中断事件通常包括:发送完成、接收完成、发送FIFO空/满、接收FIFO溢出、错误警告、总线关闭等。每个事件对应一个中断标志位,通过中断使能寄存器决定是否向CPU发出中断。RH850的中断控制器(INTC)支持优先级配置,CAN FD中断可分配到不同优先级。
DMA通路则用于把接收FIFO中的数据批量搬运到用户指定的内存缓冲区,或把发送数据从内存搬到发送FIFO。DMA请求通常由FIFO水位触发,例如接收FIFO中报文数达到阈值时触发一次DMA传输。这样CPU只需处理DMA完成中断,而不必为每帧报文单独响应。
从故障注入角度看,中断使能位和DMA触发阈值都是可写寄存器。如果错误地关闭了接收中断使能,或把DMA阈值设得过高,就会造成“报文已收到但CPU不知道”或“FIFO溢出”的现象。这类故障在真实系统中可能由软件配置错误引起,也可以通过注入复现。
五、故障注入可触及的硬件寄存器边界
综合来看,RH850 CAN FD硬件架构中,故障注入可以触及的边界主要包括:
| 边界对象 | 典型寄存器/区域 | 可注入的故障类型 | 观察现象 |
|---|---|---|---|
| 位定时配置 | 波特率预分频、TSEG1/TSEG2、SJW | 波特率偏差、采样点偏移 | 错误帧增多、通信失败 |
| 消息RAM内容 | TX/RX Buffer数据字段 | 数据位翻转、DLC错误 | 接收端数据校验失败 |
| FIFO指针 | TX/RX FIFO的put/get索引 | 指针越界、重复读取 | 报文丢失或重复 |
| 过滤器配置 | ID寄存器、掩码寄存器 | 掩码错误、ID偏移 | 误收/漏收报文 |
| 中断使能 | 中断使能寄存器、标志寄存器 | 关闭接收中断、清标志失败 | CPU不响应、中断丢失 |
| DMA触发阈值 | FIFO水位寄存器 | 阈值过高/过低 | DMA不触发或频繁触发 |
需要强调的是,上述边界中,位定时配置和协议引擎内部状态属于“半可触及”区域:寄存器可以写,但写错后往往导致总线关闭,恢复需要重新初始化。而消息RAM、FIFO指针、过滤器和中断使能则属于“完全可触及”区域,适合做精细化的故障注入实验。