原文:https://www.canfd.net/canbasic.html

1 概述与应用

CAN(Controller Area Network,控制器局域网)最早为解决汽车中多控制器串行通信而设计,采用ISO 11898系列标准:

  • ISO 11898‑1定义了数据链路层和帧格式;

  • ISO 11898‑2定义高速CAN(最高1 Mb/s),常用于发动机、电机等实时性要求高的设备;

  • ISO 11898‑3定义低速CAN(最高125 kb/s),用于车身灯光、门控等低速控制。

在ISO 11898基础上,SAE J1939(250 kb/s)广泛应用于商用车和工程机械;乘用车则常由OEM基于ISO 11898自定义更高层协议。CAN网络通常通过网关将动力系统、车身电子和诊断仪(OBD/UDS)等子网连接起来,虽然有更高性能的协议出现,但因低成本及可靠性,CAN仍占据汽车网络主流地位。

2 基本特征

  1. 差分双绞线:CAN_H和CAN_L双绞线差分传输,抗共模干扰能力强。

  1. 多主广播:任何节点随时可发送报文,报文以ID而非物理地址标识,各节点根据ID筛选处理。

  2. 无损仲裁:当多节点同时发送时,通过“非破坏性按位仲裁”决定优先级(ID值越小优先级越高),其它节点自动退让,无需重传。

  3. 灵活接收滤波:各节点可设置接受ID列表,减少CPU负担。

  4. 远程帧支持:节点可发送远程帧(RTR)请求特定ID的数据,数据源节点收到后响应数据帧。

  5. 强健错误检测:集成位填充、CRC、格式检测、应答检测等多种错误检测机制,并通过错误计数器进行故障隔离与总线管理。

3 CAN分层结构

CAN协议遵循简化的OSI模型,主要包括:

  • 物理层(ISO 11898‑2/‑3):差分电平、连接方式、同步方法;

  • 数据链路层(ISO 11898‑1):帧格式、仲裁、错误检测与纠正、总线管理;

  • 应用层及以上:由J1939、UDS、OBD等协议定义。

4 物理层

  • 物理连接:双绞线拓扑,末端需各并联120 Ω终端电阻;

  • 电平与同步:隐性位(逻辑1)为两线电平接近,显性位(逻辑0)为CAN_H上升、CAN_L下降,实现差分检测;

  • 速率与距离:高速CAN最高1 Mb/s可覆盖数十米,250 kb/s和500 kb/s常用于几十到上百米的网络布局。

5 消息帧结构

  1. 数据帧:包括起始位(SOF)、仲裁场(11位或29位ID)、控制场(DLC)、数据场(0–8 字节)、CRC场、ACK场、结束位(EOF)。

  2. 远程帧:与数据帧结构类似,但不含数据场,用于请求数据。

  3. 错误帧:由检测错误的节点发送,包含错误标志(6 显性位或6 隐性位)和错误界定符(8 隐性位)。

  4. 过载帧:用于通知发送节点延迟,下游节点发送过载标志和过载界定符。

  5. 帧间隔:每帧结束后发送3 位隐性位(ITM)后进入总线空闲,错误被动节点还会额外发送8 隐性位暂停 .

6 非破坏性按位仲裁

CAN使用NRZ编码,显性位(0)覆盖隐性位(1)。当多个节点同时发送ID字段时,所有节点逐位比较总线电平,隐性位节点在检测到显性位后停止发送并转为接收,直至总线空闲后再重新竞争。

显性电平用逻辑“0”表示显性位,隐性电平用逻辑“1”表示隐性位, 总线仲裁中遵循线与逻辑,显性电平覆盖隐性电平,被覆盖的节点将竞争失败,转为接收节点。

7 位填充与CRC

  • 位填充:若在SOF至CRC序列中出现5个连续同极性位,自动插入1位相反极性位,以保证同步。接收端同样执行去填充操作。

  • CRC校验:使用15位多项式(x¹⁵+x¹⁴+x¹⁰+x⁸+x⁷+x⁴+x³+1)对SOF至数据域进行模2运算,接收端复算并比对CRC序列,检测传输差错。

共有3个填充位,其中第3个填充位之前的5个连续的相同极性位包含了第2个填充位,因此填充位也被视为总线数据,判断是否出现连续5个相同极性位。

8 故障检测与总线管理

CAN定义五种错误类型:位错误、位填充错误、CRC错误、应答错误、格式错误。每节点维护发送错误计数器(TEC)和接收错误计数器(REC),根据错误计数器值可处于:

  • 主动错误(Error Active):可正常发送错误帧;

  • 被动错误(Error Passive):发送被动错误帧并在后续等待;

  • 离线(Bus Off):当TEC>255时隔离节点,需手动或自动恢复才能重新参与总线。 故障界定和节点状态转换通过预设阈值和错误标志来实现 .

9 使用控制器收发CAN报文

多数CAN控制器(如RapidECU)提供多通道,可通过软件API:

  1. 设置波特率(常用125/250/500 kbps或1 Mb/s);

  2. 发送报文:指定通道、ID、帧类型、数据长度及数据内容;

  3. 接收报文:配置过滤器与缓冲区,触发方式或轮询方式获取指定ID的报文。