4. CAN总线协议基础:CAN 2.0与CAN FD的区别、CAN帧结构、位时序与仲裁机制

在嵌入式网关开发中,CAN(Controller Area Network)总线是连接车辆电子控制单元(ECU)与网关的核心通信媒介。本章从协议底层出发,系统讲解CAN 2.0与CAN FD的差异、帧结构分类、位时序参数以及非破坏性仲裁机制,为后续设备树中CAN控制器节点配置与驱动集成奠定理论基础。

4.1 CAN 2.0 与 CAN FD 的核心区别

CAN 2.0(包括2.0A与2.0B)是经典CAN协议,最大数据场为8字节,固定位速率1 Mbps。CAN FD(Flexible Data-Rate)在CAN 2.0基础上扩展了数据场长度(最多64字节),并在数据段引入可变位速率,显著提升吞吐量。两者在物理层兼容,但数据链路层存在关键差异。

关键提示: CAN FD 节点可以接入 CAN 2.0 网络,但 CAN 2.0 节点无法正确解析 CAN FD 帧的扩展数据段,因此混合组网时需通过设备树或驱动配置“CAN FD 使能”标志。
对比维度 CAN 2.0(经典CAN) CAN FD(灵活数据速率)
数据场长度 0 ~ 8 字节 0 ~ 64 字节
位速率 固定速率(最高 1 Mbps) 仲裁段固定 + 数据段可变(最高 8 Mbps)
帧格式 标准帧(11位ID)/ 扩展帧(29位ID) 兼容标准/扩展ID,新增FDF、BRS标志位
CRC校验 15位 CRC 17位(≤16字节)或 21位(>16字节)CRC
错误状态 无额外状态位 新增ESI(错误状态指示)位
向后兼容 — 物理层兼容,数据链路层需显式支持
工程建议: 在网关驱动中,若硬件支持 CAN FD,建议在设备树中设置 bosch,mram-cfg 或 can-transceiver 节点以启用 FD 模式;若仅需 CAN 2.0,则保持默认配置以降低功耗与延迟。
CAN 2.0 与 CAN FD 帧结构对比 CAN 2.0 数据帧(标准格式) SOF 11位 ID RTR IDE r0 DLC 数据场(0~8B) CRC ACK EOF CAN FD 数据帧(标准格式) SOF 11位 ID RTR IDE FDF BRS ESI DLC 数据场(0~64B) CRC ACK CAN FD 新增 FDF(FD格式)、BRS(位速率切换)、ESI(错误状态指示)位,数据段支持可变速率

4.2 CAN 帧结构详解

CAN总线定义了四种帧类型:数据帧、远程帧、错误帧和过载帧。其中数据帧和远程帧由用户层生成,错误帧和过载帧由硬件控制器自动处理。理解帧结构是配置CAN控制器寄存器与解析设备树中“can-transceiver”时序参数的前提。

4.2.1 数据帧(Data Frame)

数据帧用于发送节点向总线广播数据。标准格式(CAN 2.0A)使用11位标识符,扩展格式(CAN 2.0B)使用29位标识符。帧结构包括:帧起始(SOF)、仲裁场、控制场、数据场、CRC场、应答场(ACK)和帧结束(EOF)。

4.2.2 远程帧(Remote Frame)

远程帧用于请求其他节点发送具有相同ID的数据帧。远程帧的RTR位为隐性(1),且数据场为空。接收节点收到远程帧后,若本地有对应ID的数据,则发送数据帧响应。

4.2.3 错误帧(Error Frame)

当节点检测到总线错误时,主动发送6个连续显性位(主动错误标志)或6个连续隐性位(被动错误标志),随后是8个隐性位的错误界定符。错误帧由硬件自动生成,驱动层通过读取错误计数器(TXERR、RXERR)获取状态。

避坑指南: 在设备树中配置CAN控制器时,若未正确设置“sample-point”和“prop-seg”参数,可能导致位采样偏移,进而频繁触发错误帧。建议使用CAN总线分析仪(如PCAN-View)验证位时序配置。
CAN 帧类型分类 CAN 帧类型 数据帧 Data Frame 远程帧 Remote Frame 错误帧 Error Frame 过载帧 Overload Frame 数据帧和远程帧由应用层触发;错误帧和过载帧由CAN控制器硬件自动管理,驱动通过中断或状态寄存器感知

4.3 位时序与采样点

CAN总线的位时序由四个段组成:同步段(Sync_Seg)、传播段(Prop_Seg)、相位缓冲段1(Phase_Seg1)和相位缓冲段2(Phase_Seg2)。采样点位于Phase_Seg1与Phase_Seg2之间。位时序参数直接影响总线通信的稳定性和最大速率。

段名称 作用 典型长度(Tq)
Sync_Seg 同步所有节点时钟边沿 1 Tq
Prop_Seg 补偿物理传输延迟 1 ~ 8 Tq
Phase_Seg1 采样前相位缓冲,可被SJW延长 1 ~ 8 Tq
Phase_Seg2 采样后相位缓冲,可被SJW缩短 1 ~ 8 Tq
SJW(同步跳转宽度) 最大相位调整步长 1 ~ 4 Tq
采样点计算公式: 采样点位置 = (Sync_Seg + Prop_Seg + Phase_Seg1) / (Sync_Seg + Prop_Seg + Phase_Seg1 + Phase_Seg2) × 100%。推荐采样点范围为 75% ~ 87.5%,常用值为 80% 或 87.5%。
CAN 位时序结构(单Bit周期) t Sync 1 Tq Prop_Seg 1~8 Tq Phase_Seg1 1~8 Tq 采样点 Phase_Seg2 1~8 Tq SJW 可延长 Phase_Seg1 SJW 可缩短 Phase_Seg2 位时间 = (Sync_Seg + Prop_Seg + Phase_Seg1 + Phase_Seg2) × Tq;采样点位置决定总线抗干扰能力

4.4 非破坏性仲裁机制

CAN总线采用载波监听多路访问/冲突检测(CSMA/CD)结合非破坏性逐位仲裁(Non-Destructive Bitwise Arbitration)机制。当多个节点同时发送时,ID值越小(显性位越多)的帧优先级越高,仲裁失败的节点自动转为接收模式,不破坏总线数据。

  • 显性位(Dominant): 逻辑0,电平为差分高(CAN_H > CAN_L),可覆盖隐性位。
  • 隐性位(Recessive): 逻辑1,电平为差分低(CAN_H ≈ CAN_L),被显性位覆盖。
  • 仲裁过程: 每个节点在发送ID位时监听总线电平,若发送隐性位但读到显性位,则判定仲裁失败,立即停止发送。
  • 优先级规则: 标准帧(11位ID)优先级高于扩展帧(29位ID);数据帧(RTR=0)优先级高于远程帧(RTR=1)。
驱动集成要点: 在设备树中配置CAN控制器时,无需显式设置仲裁逻辑(由硬件实现),但需确保“bus-off”恢复策略(如自动恢复或手动复位)与仲裁失败后的错误计数器联动。
CAN 非破坏性逐位仲裁流程 节点A(ID=0x100) 节点B(ID=0x200) 节点C(ID=0x300) CAN 总线(逐位仲裁) 仲裁胜出:节点A(ID最小) 节点B、C自动转为接收模式 仲裁过程中无数据破坏,失败节点在总线空闲后自动重发

4.5 本章小结

本章从CAN 2.0与CAN FD的协议差异出发,深入解析了数据帧、远程帧、错误帧的结构与用途,并详细说明了位时序的四个段及采样点计算方法,最后阐述了非破坏性逐位仲裁机制。这些知识是后续设备树中CAN控制器节点配置(如bosch,mram-cfg、can-transceiver时序参数)以及驱动层中断处理、错误恢复策略实现的直接理论基础。