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