帧格式总览:四种帧类型与经典 vs FD

子域: protocol

概述

CAN 总线上只存在四种帧类型:数据帧(Data Frame,携带有效载荷)、远程帧(Remote Frame,请求对方发送数据)、错误帧(Error Frame,节点报告检测到的协议错误)与过载帧(Overload Frame,延迟后续帧或报告接收器过载)。其中数据帧是通信主体,其余三种是辅助机制。

CAN FD 数据帧是数据帧的扩展形态,由 ISO 11898-1:2024 第 6.6.11 节定义:FD 帧有两种格式,**FBFF(11 位标识符)**与 FEFF(29 位标识符),可携带 0 至 64 字节数据;不存在远程 FD 帧(6.6.11.1)。帧骨架与经典 CAN 相同(SOF → 仲裁场 → 控制场 → 数据场 → CRC 场 → ACK 场 → EOF),差异集中在控制场的 FDF/res/BRS/ESI 标志位、DLC 映射、CRC 长度与填充规则上。协议源头是 Bosch 2012 年 CAN FD 规范。

关键参数:FBFF 帧位序

FBFF(11 位标识符)数据帧完整位序(图 18/20/22)

字段内容位值/规则条款
SOF起始帧显性6.6.8
仲裁场ID(28)…ID(18)(11 位)+ RRSRRS 发送显性;接收端接受显性或隐性6.6.11.2
控制场IDE显性(区分 11 位标识符格式)6.6.11.3
控制场FDF(FD Format Indicator)隐性 = FD/XL 帧;显性 = CC 帧;11 位标识符帧中位于 IDE 之后6.6.11.3
控制场res(保留位)显性;检测为隐性时:协议异常处理启用则检测协议异常事件,禁用则按格式错误6.6.11.3
控制场BRS(Bit Rate Switch)隐性 = 数据相位切换到 FD 数据位速率;显性 = 全程名义位速率6.6.11.3
控制场ESI(Error State Indicator)发送端 error-active 发显性、error-passive 发隐性;LLC 置位则发隐性6.6.11.3
控制场DLC(4 位)数据长度编码,见 DLC 表6.6.11.3
数据场0-64 字节字节 0 起顺序发送,每字节 8 位(bit(7)→bit(0));DLC=0 时无数据场6.6.11.4
CRC 场SBC(stuff count,4 位)+ FCRC(17 或 21 位)+ CRC 界定符CRC 界定符 1 或 2 个隐性位(发送端发 1 个)6.6.11.5
ACK 场ACK slot + ACK delimiter发送端发隐性;接收端在 slot 内覆盖为显性;界定符隐性6.6.11.6
EOF帧结束7 个隐性位6.6.11.7

FEFF(29 位标识符)位序

SOF → ID(28)…ID(18) → SRR(隐性)→ IDE(隐性)→ ID(17)…ID(0) → RRS(显性)→ FDF(隐性)→ res(显性)→ BRS → ESI → DLC → 数据 → SBC+FCRC+CRC 界定符 → ACK slot+delimiter → EOF。仲裁自 ID(28) 开始、至控制场的 FDF 位结束;SRR/IDE 隐性保证同基标识符下 11 位标识符帧优先于 29 位帧(6.6.11.2、图 19-21)。

DLC 编码(表 5,6.4.3)

DLC(十进制)0-89101112131415
经典帧字节数0-8(直映)8888888
FD 帧字节数0-8(直映)12162024324864

规则:0-8 直接映射;FD 帧 9-15 映射到 12/16/20/24/32/48/64 字节(间隔先 4 字节后 8/16 字节递增);经典帧 9-15 全部为 8 字节(截断)。

flowchart LR
    D["DLC(4 位,表 5)"] --> R{"DLC 值?"}
    R -->|"0-8"| A["字节数 = DLC 值<br/>(经典与 FD 一致)"]
    R -->|"9 10 11 12 13 14 15"| B["FD 帧:12 16 20 24 32 48 64 字节<br/>经典帧:一律 8 字节(截断)"]
    B --> C["CRC 选择(6.6.11.5):<br/>≤16 字节 → CRC_17<br/>>16 字节 → CRC_21"]

工作原理

帧结构位序总览(sequenceDiagram)

sequenceDiagram
    autonumber
    participant TX as 发送节点
    participant BUS as 总线
    participant RX as 接收节点
    TX->>BUS: SOF(显性)+ 仲裁场(11/29 位 ID + RRS)
    Note over TX,BUS: 仲裁结束于控制场 FDF 位(6.6.11.2/6.6.17.4)
    TX->>BUS: 控制场 IDE·FDF·res·BRS·ESI·DLC
    Note over TX,BUS: BRS 隐性 → 数据相位切换到 FD 数据位速率
    TX->>BUS: 数据场(0-64 字节)+ SBC + FCRC(17/21 位)+ 固定填充位
    Note over TX,BUS: CRC 界定符(首个)采样点处数据相位结束,切回名义位速率
    TX->>BUS: CRC 界定符 + ACK slot(隐性)
    RX->>BUS: ACK slot 内覆盖为显性(匹配 FCRC 与 stuff count 的节点)
    TX->>BUS: ACK delimiter + EOF(7 隐性)

帧格式家族:四种帧类型

flowchart TD
    F["CAN 帧类型"] --> D["数据帧 DF<br/>仲裁场+控制场+数据场+CRC+ACK+EOF"]
    F --> R["远程帧 RF<br/>无数据场(DLC 表示请求长度)<br/>仅经典 CAN;FD 无远程帧(6.6.11.1)"]
    F --> E["错误帧 EF<br/>错误标志(主动 6 显性/被动 6 隐性)<br/>+ 错误界定符(8 隐性)<br/>6.6.5"]
    F --> O["过载帧 OF<br/>过载标志(6 显性)+ 过载界定符(8 隐性)<br/>仅帧间空间发送<br/>6.6.6"]

经典 CAN vs CAN FD 数据帧

维度经典 CAN(CC)CAN FD
数据场最多 8 字节最多 64 字节
位速率整帧单速率一帧两速:BRS 隐性后进入数据相位,CRC 界定符(首个)采样点处切回(6.6.11.5 NOTE)
控制场IDE + r0 + DLC(CBFF)IDE + FDF + res + BRS + ESI + DLC(FBFF);FEFF 中 IDE 在仲裁场
CRCCRC_15,15 位CRC_17(数据 ≤16 字节)或 CRC_21(>16 字节);FD 帧 CRC 相关位流含 stuff count 与动态填充位、不含固定填充位(6.6.11.5)
位填充动态填充(SOF 至 FCRC)仲裁相位动态填充(SOF 至数据场);数据相位固定填充(FD CRC 字段,6.6.13)
远程帧RTR 位区分无远程 FD 帧

三个标志位

FDF 决定”这是什么帧”(隐性 = FD/XL),BRS 决定”数据段跑多快”(隐性 = 切换),ESI 报告”发送方状态如何”(隐性 = error-passive)。FDF 对应经典帧的 r0/r1 位位置;经典节点把隐性 FDF 读作保留位违例,判格式错误并触发错误帧——“仲裁兼容”不等于”全网络兼容”:同一网络要么全支持 CAN FD,要么分网/分时部署。

经典 CAN 帧(CBFF/CEFF)要点(6.6.10)

  • CBFF 仲裁字段:ID(28)…ID(18) + RTR;CEFF:ID(28)…ID(18) + SRR(隐性)+ IDE(隐性)+ ID(17)…ID(0) + RTR。RTR 隐性 = 远程帧,显性 = 数据帧;同标识符下数据帧优先于远程帧(6.6.10.2)。
  • 控制字段:IDE/r1(显性)+ r0(显性)+ DLC(4 位)(图 14);CBFF 中 IDE 显性、CEFF 中 r1 与 FD 帧 FDF 对应,FD 容错节点在该位收到隐性时检测协议异常事件(6.6.10.3)。
  • CRC 字段:FCRC(CRC_15,15 位)+ CRC 界定符(1 个隐性位)(6.6.10.5)。
  • 经典 CAN 帧从 SOF 到 FCRC 采用动态位填充(6.6.13.2)。

协议异常事件(6.6.17.2)

FD 容错节点在控制字段的 res 位检测到隐性(预期显性)时,若协议异常处理启用则检测协议异常事件、禁用则按格式错误(6.6.11.3)。协议异常事件的反应:错误计数器不变、启用硬同步、节点发送隐性位并进入总线再整合状态(6.6.17.2)——这是 FD 帧与 XL 帧共存网络中的关键容错路径。

ACK 与 EOF 规则(6.6.11.6/6.6.11.7/6.6.15)

  • 接收端在 ACK slot 内把发送端的隐性位覆盖为显性;FD 帧中所有节点接受最长 2 位的重叠 ACK slot 显性相位为有效 ACK(补偿接收端间相位偏移);
  • ACK delimiter 为隐性,与 CRC 界定符一起把 ACK slot 夹在两个隐性位之间;
  • EOF 为 7 个隐性位;接收端帧在 EOF 倒数第二位无错误即视为有效,发送端需到 EOF 结束无错误才算有效(6.6.15.2)。

对设计的意义

  • 对控制器(嵌入式):解码器必须按 FDF/res/BRS/ESI 解析帧类型、协议异常事件与速率切换边界;DLC 非连续映射决定 CRC 引擎选 17 位还是 21 位多项式;发送器在 BRS 之后、CRC 界定符之前以数据相位速率工作,需要两套位定时与 TDC 支持;帧校验时须先丢弃固定填充位再算 CRC。
  • 对收发器(模拟 IC):帧格式本身不由收发器解释,但 BRS 造成的”仲裁速率 ↔ 数据速率”切换要求收发器传播延迟对称性与环回延迟稳定(否则高速数据相位无法可靠采样);错误帧要求收发器能把 6 个显性位强驱动到总线。帧结构是推导位定时与同步物理层需求的上游输入。

常见误区

  • 误区一:“FD 帧有远程帧” —— FD 不存在远程帧(6.6.11.1);RTR 位在 FD 帧中由 RRS 位取代,RRS 发送显性、接收端接受显性或隐性(6.6.11.2)。
  • 误区二:“DLC 9 表示 9 字节” —— DLC 0-8 直映,9-15 非连续映射到 12/16/20/24/32/48/64 字节(表 5);经典帧 9-15 全部截断为 8 字节。
  • 误区三:“数据相位从 BRS 位开始、到 ACK 结束” —— FD 数据相位自 **BRS 位采样点(检测为隐性)**开始,至 CRC 界定符首个采样点结束(7.3.2);ACK/EOF 始终以仲裁速率传输。
  • 误区四:“CRC 界定符固定 1 位” —— 发送端发 1 个隐性位,但接受端接受 1 或 2 个隐性位;接收端在第一个 CRC 界定符位后发送其 ACK 位(6.6.11.5)。
  • 误区五:“经典与 FD 帧可以长期混跑” —— 仲裁场兼容,但经典节点把隐性 FDF 判为格式错误并触发错误帧;同网络要么全 FD,要么分网/分时。

参见