3. CAN FD协议帧结构与故障注入切入点

要对RH850上的CAN FD网络做故障注入,第一步不是写代码,而是把“帧”拆开看清楚:哪些位是协议强制、哪些位是应用可改、哪些位一旦被破坏会触发接收节点的错误处理。只有把帧结构、位填充规则和CRC校验的边界弄清楚,注入才有明确靶点,否则很容易出现“改了数据但节点根本没反应”或“注入后总线直接进入Bus Off”的失控情况。

标准帧与扩展帧:仲裁场的两种形态

CAN FD沿用经典CAN的两种帧格式。标准帧的仲裁场由11位标识符(ID)和RTR位组成;扩展帧则由11位基本ID、SRR位、IDE位、18位扩展ID和RTR位组成,共29位标识符。在CAN FD中,RTR位被替换为RRS位,且FD帧不再支持远程帧,因此RRS恒为显性0。IDE位是区分两种格式的关键:IDE=0为标准帧,IDE=1为扩展帧。对故障注入而言,ID场是最容易被篡改的字段之一——改变ID会直接改变仲裁优先级,可能让目标节点收不到报文,也可能让本不该响应的节点误接收。在RH850的CAN FD通道(如RSCANFD或RCANFD模块)中,验收滤波器按ID和IDE组合匹配,因此篡改ID或IDE是验证滤波配置是否正确的直接手段。

FD帧格式:从控制场到CRC场

CAN FD帧在控制场引入了三个关键位:FDF、BRS和ESI。FDF(FD Format)位区分经典CAN帧与FD帧,显性为经典帧,隐性为FD帧。BRS(Bit Rate Switch)位决定数据段是否切换到更高的数据波特率:BRS=1时,从BRS位之后到CRC界定符之前使用数据段波特率;BRS=0时全帧使用仲裁段波特率。ESI(Error State Indicator)位反映发送节点的错误状态:ESI=0表示发送节点处于错误主动状态,ESI=1表示错误被动状态。ESI不参与仲裁和校验,但它是接收方判断发送节点健康度的唯一线索,因此篡改ESI可以测试接收节点是否对发送方错误状态做出预期反应。

控制场中的DLC在CAN FD中扩展为4位,可表示0~8字节(经典范围)以及12、16、20、24、32、48、64字节。DLC与实际数据长度并非线性对应,例如DLC=9对应12字节,DLC=15对应64字节。数据场长度由DLC编码决定,若DLC与实际写入的数据长度不一致,接收节点会按DLC解析,导致数据错位。CRC场在CAN FD中显著增强:当数据长度不超过16字节时使用17位CRC,超过16字节时使用21位CRC,并引入CRC定界符和填充计数。CRC多项式分别为0x1685B(17位)和0x102899(21位)。CRC场是故障注入中最敏感的字段——任何一位翻转都会导致接收节点CRC校验失败,触发错误帧。

位填充规则:注入必须绕开的“陷阱”

CAN FD的位填充规则与经典CAN不同。在仲裁段和数据段(即BRS之前和CRC场之前的部分),发送节点在连续5个相同极性位后插入1个相反极性位;接收节点在相同位置去除该填充位。但在CRC场中,CAN FD采用了固定填充位:CRC序列之后、CRC定界符之前,根据CRC计算结果插入固定数量的填充位,且这些填充位不参与去填充。这意味着如果注入工具在数据段直接翻转某一位,接收节点会先按位填充规则重新同步,翻转位可能被当作填充位而“吞掉”,导致注入无效。因此,有效的位翻转注入必须避开填充位位置,或者选择在CRC场之后、ACK场之前注入,此时已无位填充,翻转必然进入CRC校验范围。

CAN FD 扩展帧结构与故障注入切入点 SOF 1b 仲裁场 11b Base ID + SRR + IDE + 18b Ext ID + RRS 控制场 IDE + FDF + res + BRS + ESI + DLC(4b) 数据场 0~64 字节 CRC场 17b/21b CRC + 定界符 ACK 2b EOF 7b 位填充区域:连续5个相同位后插入1个相反位(仲裁段 + 数据段) 固定填充位,不参与去填充 BRS=1 时切换至数据段波特率 可篡改 / 破坏的字段与注入效果 ID / IDE 篡改 改变仲裁优先级 触发验收滤波失配或误接收 BRS 位翻转 波特率切换异常 接收节点采样点错位 ESI 位篡改 伪造发送节点错误状态 测试接收方健康度判断 DLC 篡改 数据长度与实际不符 接收端数据错位或截断 数据场位翻转 需避开填充位位置 否则被去填充“吞掉” CRC 场位翻转 必然触发 CRC 校验失败 接收节点发错误帧 ACK 场干扰 抑制或伪造应答 发送节点重传或报错 填充位插入/删除 破坏位流同步 触发格式错误 RH850 注入实现要点: • 使用 RSCANFD/RCANFD 的发送缓冲或直接操作 Tx 寄存器,在帧发送前修改指定字段; • 位翻转注入需先读取已组帧的位流,定位填充位位置,再选择非填充位进行翻转; • CRC 场注入可直接改写 CRC 寄存器值,验证接收端 CRC 校验与错误帧响应。

故障注入的字段选择与实现路径

在RH850平台上,故障注入通常有三种实现路径。第一种是“发送前篡改”:在应用层组帧完成后、写入发送缓冲之前,修改ID、DLC、数据或BRS/ESI位。这种方式最安全,因为帧仍由控制器正常发送,位填充和CRC由硬件自动计算,注入的是“合法但错误”的帧。第二种是“位流级注入”:通过总线收发器或FPGA在物理层翻转某一位,这种方式需要精确知道填充位位置,否则翻转可能被去填充机制吸收。第三种是“CRC场直接改写”:在发送缓冲中直接写入错误的CRC值,接收节点必然报CRC错误,用于测试错误帧的触发和恢复行为。

以RH850 RSCANFD模块为例,发送缓冲寄存器组中,CFDGRP_CFDTMCTR寄存器包含IDE、FDF、BRS、ESI和DLC字段,CFDGRP_CFDTMD0~15包含数据字节,CFDGRP_CFDTHL/CFDTHL包含ID和CRC。若要在发送前篡改BRS位,只需在写入发送缓冲前修改CFDTMCTR的BRS位;若要篡改CRC,则需在发送请求置位前写入CFDTHL的CRC字段。需要注意的是,硬件在发送时会重新计算CRC并覆盖写入值,因此CRC注入通常需要绕过硬件CRC计算,或使用监听模式在总线上直接注入。

教学示例参数:假设仲裁段波特率为500 kbps,数据段波特率为2 Mbps,DLC=15(64字节数据)。此时CRC为21位,多项式0x102899。若在数据场第10字节翻转1位,且该位恰好是填充位,接收节点去填充后数据不变,注入无效;若翻转的是非填充位,接收节点CRC校验失败,错误计数器增加8,发送节点收到错误帧后重传。这一过程可通过RH850的CFDERR寄存器观察错误计数变化。

注入前的检查清单

在动手注入之前,建议先确认以下事项:目标帧是标准帧还是扩展帧,IDE位当前值是什么;BRS位是否使能,数据段波特率与仲裁段波特率分别是多少;DLC编码对应的实际数据长度;CRC是17位还是21位;当前帧的填充位分布是否已知;接收节点的验收滤波配置是否允许该ID通过。这些信息决定了注入是否有效、注入后节点会进入哪种错误状态。只有把帧结构、位填充和CRC边界都对齐,故障注入才能从“碰运气”变成可复现、可判读的工程手段。