2、CAN总线基础:CAN协议起源、ISO 11898标准、CAN 2.0A/B与CAN FD的区别、物理层与数据链路层概述

CAN(Controller Area Network,控制器局域网络)总线诞生于20世纪80年代中期,由德国博世公司(Bosch)为汽车内部多ECU(电子控制单元)之间的可靠通信而设计。在CAN出现之前,汽车线束采用点对点模拟信号连接,随着电喷、ABS、安全气囊等电子系统逐步普及,线束数量急剧膨胀,整车重量和故障率同步上升。CAN总线以“多主从、差分双线、短帧广播、载波监听/冲突仲裁”为核心设计思想,一举解决了传统布线方式的成本、重量和可靠性问题。如今,CAN不仅是汽车动力、底盘、车身、信息娱乐系统的骨干网络,也广泛覆盖工业控制、医疗设备、轨道交通和航空电子领域。本章围绕CAN的协议起源、ISO 11898标准体系、CAN 2.0A/B与CAN FD的差异,以及物理层与数据链路层的核心机制展开,为后续抓包与报文解析打下基础。

CAN总线协议体系与分层结构 协议起源 Bosch 1986 多主/差分/短帧 ISO 11898 -2: 高速CAN -3: 低速容错CAN CAN 2.0A/B 11位/29位标识符 经典帧 8字节 CAN FD 64字节/可变速率 ISO 11898-1:2015 物理层(ISO 11898-2) • 差分双线:CAN_H / CAN_L • 显性电平:CAN_H≈3.5V,CAN_L≈1.5V • 隐性电平:CAN_H≈2.5V,CAN_L≈2.5V • 终端电阻:120Ω × 2(总线两端) 数据链路层(ISO 11898-1) • 帧类型:数据帧/远程帧/错误帧/过载帧 • 仲裁机制:ID优先级 + 显性位覆盖 • 错误处理:位错误/填充错误/CRC/ACK • 位填充:连续5个相同位后插入反相位 CAN 2.0A / CAN 2.0B / CAN FD 核心差异 特性 CAN 2.0A CAN 2.0B CAN FD 标识符 11位 11/29位 11/29位 数据长度 ≤8字节 ≤8字节 ≤64字节 速率 固定(≤1Mbps) 固定(≤1Mbps) 仲裁≤1Mbps,数据≤8Mbps

2.1 CAN协议起源与设计动机

1986年,博世公司在SAE(汽车工程师学会)大会上首次发布了CAN串行总线协议。当时汽车电子面临的核心矛盾是:传感器、执行器和控制器数量激增,传统线束每增加一个信号就需要一对铜线,一辆高端轿车的线束总长可超过2公里,重量超过40公斤。这不仅增加油耗,还带来装配困难、接插件可靠性下降和电磁干扰耦合等问题。CAN的设计目标非常明确:用一对双绞线承载所有ECU之间的数字通信,通过广播式短帧传输,使每个节点都能实时获取所需信号,同时具备多主竞争、错误检测和自动重发能力。

CAN协议在设计上有几个关键决策,深刻影响了后续所有车载网络架构:

  • 多主从架构:任何节点在总线空闲时都可以发起发送,不需要中央调度器,提高了系统冗余性。
  • 非破坏性位仲裁:多个节点同时发送时,ID值越小优先级越高,高优先级帧不受干扰地继续发送,低优先级节点自动退避。
  • 短帧设计:经典CAN数据帧最多携带8字节有效载荷,配合CRC校验和位填充机制,确保单帧错误不会污染大量数据。
  • 差分信号传输:CAN_H和CAN_L两根线以差分方式传输,共模干扰被有效抑制,适合汽车发动机舱等强电磁干扰环境。

从工程实践角度看,理解CAN的起源有助于抓包分析时建立正确的“帧思维”。例如,当你看到总线上出现大量ID为0x0A的报文时,不应将其视为“数据流”,而应理解为“某个节点周期性广播的状态帧”。这种以帧为单位的通信模型,与以太网的字节流模型有本质区别。

2.2 ISO 11898标准体系

ISO 11898是CAN总线的国际标准化文件,它并非单一标准,而是一个系列。当前课程涉及的版本主要包括:

标准编号内容范围典型应用
ISO 11898-1数据链路层与物理信令(含CAN FD)所有CAN节点软件协议栈
ISO 11898-2高速CAN物理层(125kbps~1Mbps)动力总成、底盘控制
ISO 11898-3低速容错CAN物理层(≤125kbps)车身舒适系统、诊断
ISO 11898-5低功耗高速CAN物理层部分新能源车型

ISO 11898-2定义了高速CAN的电气特性,包括显性/隐性电平、位时间、同步段、采样点位置等。ISO 11898-3则针对车身控制等对成本敏感、速率要求不高的场景,允许单线故障时继续通信。ISO 11898-1在2015年修订后正式纳入CAN FD(Flexible Data-rate)协议,成为当前新车型的主流选择。

在抓包工作中,明确车辆采用的高速CAN还是低速容错CAN至关重要。高速CAN的终端电阻为120Ω,总线空闲时CAN_H和CAN_L均为2.5V;低速容错CAN的终端电阻通常为2.2kΩ,隐性电平为0V/5V(单线模式)。如果使用错误的物理层配置抓包,可能完全无法解析出有效报文。

2.3 CAN 2.0A/B与CAN FD的区别

CAN 2.0A和CAN 2.0B是博世在1991年发布的协议版本,两者的核心差异在于标识符长度。CAN 2.0A仅支持11位标准标识符,最多2048个不同ID;CAN 2.0B同时支持11位标准帧和29位扩展帧,扩展帧的ID空间大幅增加,适用于复杂网络。CAN FD则是在CAN 2.0B基础上发展而来的增强版,主要解决两个痛点:

  • 数据长度不足:经典CAN单帧最多8字节,传输ECU升级固件或标定数据时需要大量帧,效率低下。
  • 速率瓶颈:经典CAN最高1Mbps,在高速控制闭环中带宽紧张。

CAN FD的关键改进包括:

  1. 可变数据长度:单帧最多64字节,减少帧头开销和总线占用时间。
  2. 双速率模式:仲裁段(ID、控制位)仍使用标准速率(如500kbps),数据段可切换至更高速率(如2Mbps或5Mbps),通过BRS(Bit Rate Switch)位控制。
  3. 更长的CRC:使用17位或21位CRC,适应更长数据段,降低漏检率。

从抓包解析角度,CAN FD帧与经典CAN帧在格式上有明显区别。经典CAN帧的DLC(数据长度码)为4位,最大表示8;CAN FD帧的DLC同样为4位,但通过编码扩展可表示12、16、20、24、32、48、64字节。此外,CAN FD帧在控制场中增加了FDF位(FD Format Indicator)和BRS位,解析时必须识别这些标志位才能正确计算位速率和帧长度。

实战场景:某新能源车型OBD接口的6号和14号引脚(高速CAN)上,使用CANoe抓取到一段混合流量。其中ID为0x365的报文DLC=8,数据段速率500kbps;ID为0x1A0的报文DLC=64,数据段速率2Mbps。若使用经典CAN解析工具,0x1A0会被误判为错误帧或解析失败。正确做法是启用CAN FD解析模式,并配置仲裁段和数据段的不同波特率。

2.4 物理层与数据链路层概述

物理层解决的是“如何在线上传输0和1”的问题,数据链路层解决的是“如何组织成有意义的帧并保证可靠传输”的问题。两者在抓包分析中分别对应示波器波形观察和CAN协议分析仪解码。

物理层核心要点:

  • 差分电平:显性位(逻辑0)时CAN_H≈3.5V、CAN_L≈1.5V,差分电压约2V;隐性位(逻辑1)时两线均为2.5V,差分电压为0V。
  • 位同步:每个节点通过同步段(SYNC_SEG)和相位缓冲段(PHASE_SEG1/2)调整采样点,确保在多位流中准确采样。
  • 终端电阻:高速CAN总线两端必须各接一个120Ω电阻,用于匹配阻抗、抑制反射。测量总线终端电阻时,应在节点断电状态下测量CAN_H与CAN_L之间的阻值,正常应为60Ω(两个120Ω并联)。

数据链路层核心要点:

  • 帧格式:数据帧由帧起始(SOF)、仲裁场、控制场、数据场、CRC场、ACK场和帧结束(EOF)组成。
  • 位填充:在SOF到CRC场之间,若连续出现5个相同电平,则自动插入1个反相位填充位。接收端在解码时自动移除填充位。抓包时若发现连续6个以上相同位,说明存在填充错误。
  • 错误处理:节点检测到位错误、填充错误、CRC错误、格式错误或ACK错误时,会发送错误帧(6个显性位),并可能进入总线关闭状态。

经验提醒:在抓包前,务必确认总线的波特率、终端电阻和物理层类型。使用万用表测量CAN_H与CAN_L之间的电阻,若为60Ω左右说明终端电阻正常;若为120Ω说明可能只有一端有终端电阻;若接近0Ω则可能存在短路。这些基础检查能避免大量无效抓包。

2.5 常见误区与总结复盘

初学者在理解CAN基础时容易陷入几个误区,这里逐一澄清:

误区正确理解
CAN总线空闲时电压为0V高速CAN空闲时CAN_H和CAN_L均为2.5V,差分电压为0V
CAN ID越大优先级越高ID数值越小,仲裁优先级越高
CAN FD完全兼容经典CAN经典CAN节点无法解析CAN FD帧,混合网络中需使用CAN FD节点
DLC=8表示数据场一定为8字节经典CAN中DLC=8表示8字节,但DLC=0~7时数据场长度等于DLC值;CAN FD中DLC编码更复杂

总结本章,CAN协议从Bosch的原始提案发展到ISO 11898标准体系,经历了从经典CAN到CAN FD的演进。物理层的差分信号设计和数据链路层的帧结构、仲裁、错误处理机制,共同构成了抓包分析的理论基础。在实际操作中,工程师需要根据车辆网络类型选择正确的物理层配置和协议解析模式,才能准确获取报文数据。下一阶段的学习将围绕CAN报文的具体帧结构展开,包括ID、DLC、数据场、CRC等字段的逐位解析方法。