number headings: auto, first-level 2, max 6, 1.1
2 CAN总线简介
CAN总线全称为Controller Area Network Bus,即控制器局域网总线。其由BOSCH公司制定和开发,其主要应用于汽车、工业控制等嵌入式领域。其最主要的特征是可靠性、易拓展性。
CAN总线协议主要涵盖了OSI/ISO七层网络协议中的传输层、数据链路层和物理层。
- 其传输线路为差分线路,使用
CAN_H
和 CAN_L
两根差分线路,电气连接较为简洁,抗干扰性较高。
- 其按照传输速度可以分为如下两种:
- 高速CAN总线,协议标准为ISO11898,传输速率为125kbps~1Mbps,传输距离小于40m。
- 低速CAN总线,协议标准为ISO11519,传输速率为10kbps~125kbps,传输距离小于1km。
- 其物理层特性与RS-485一致,为异步、半双工通信协议。
- 可挂载多设备,支持多个设备之间相互通信,多设备同时请求总线时通过仲裁决定传输顺序。
- 支持11位/29位报文ID,用于区分消息功能,以及确定优先级。
- 可以配置为指定长度的数据载荷:
- CAN Classical支持配置为 Bytes
- CAN FD(Flexible Data-Rate)支持配置为 Bytes
- 传输时有两种模式:
- 广播式传输
- 请求式传输
- 有应答、CRC校验、位填充、位同步、错误处理等传输可靠性机制,可靠性极强。
3 电气特性及其规定
如上文所述,协议规定了CAN总线有高速CAN总线和低速CAN总线两种,其电气连接模型分别如各子章节所述。
3.1 高速CAN总线电气特性及规定
3.1.1 电气连接示意图及其基本规定
如下图为高速CAN总线的电气示意图。

- 多个CAN设备之间并行连接,且CAN控制器和CAN总线之间需要使用CAN收发器进行转换。需要注意高低速CAN总线差分线路电平规定不同。
- 其两端需要添加120欧的终端电阻,用于保持这组差分线在空闲状态下电平一致,以及防止回波反射。
- 因此高速CAN总线又叫闭环CAN总线。
- 其总线上最多连接30个单元。
3.1.2 高速CAN总线电平规定
和大多数通信协议一样,当其需要传输逻辑 "1" 时,其GPIO其实什么都不需要做,此时 。此时的电平又被称为 "隐形电平" 。其示意图如下:

其具体的电平要求为:
电平项 |
逻辑1最低值 |
逻辑1标准值 |
逻辑1最大值 |
逻辑0最低值 |
逻辑0标准值 |
逻辑0最大值 |
CAN_H |
2.00 |
2.50 |
3.00 |
2.75 |
3.50 |
4.50 |
CAN_L |
2.00 |
2.50 |
3.00 |
0.50 |
1.50 |
2.25 |
V(H-L) |
-0.5 |
0.00 |
0.05 |
1.50 |
2.00 |
3.00 |
3.2 低速CAN总线电气特性及规定
3.2.1 电气连接示意图及其基本规定
如下图为低速CAN总线的电气示意图。

- 多个CAN设备之间并行连接,且CAN控制器和CAN总线之间需要使用CAN收发器进行转换。需要注意高低速CAN总线差分线路电平规定不同。
- CAN_H和CAN_L的一端添加一个2.2k欧的终端电阻,用于防止回波反射。
- 其总线上最多连接20个单元。
3.3 位填充
位填充是CAN总线的数据段和CRC段的数据填装方式。仅在这两个段使用。
位填充本质上仍然是物理层的编码特性。其规定:
当CAN总线上连续出现5个相同的电平时,会自动追加一个相反的电平位。
发送方需要自动追加,接收方需要自动剔除。
类似于计算机网络中的4B/5B编码(但不同):
2.2.3.1.6 4B/5B编码
定义:
在比特流中插入额外的比特以打破一连串的0或者1,即用5Bit来编码4Bit的数据,随后再进行传输,因此称作4B/5B编码,传输效率为80%。
编码对应表(部分):

简单分析可知,4Bit共有16种编码,而5Bit有32种编码。因此5Bit的额外16种编码被用来做控制码或保留码。
在CAN总线中,位填充的示例如下:
环节 |
数据示例1 |
数据示例2 |
发送方欲发送: |
100000110 |
10000011110 |
发送方实际发送: |
1000001110 |
1000001111100 |
接收方实际接收: |
1000001110 |
1000001111100 |
接收方收到: |
100000110 |
10000011110 |
- 当总线上已经发送5个相同bit后,无论欲发送的下一位是否反转,立刻插入一位相反电平位(示例1)。
- 插入的相反电平位也要计入"5个相同bit"判定条件的计数(示例2)。
填充位的作用:
- 增加波形的定时信息,利于接收方执行"再同步",防止波形长时间无变化,导致接收方不能精确掌握数据采样时机。
- 将正常数据流与"错误帧"和"过载帧"区分开,标志"错误帧"和"过载帧"的特异性。
- 保持CAN总线在发送正常数据流时的活跃状态,防止被误认为总线空闲。
具体可以结合总线编码章节进行理解。
3.4 CAN总线收发器原理框图
一个常见的CAN总线收发器的原理框图如下图所示:

仅需注意如下几点:
- 当CAN控制器使用TXD发送数据时,不影响RXD的接收。
- CAN总线有"线与"特性,总线上只要有一个设备发送逻辑"0",则整个总线都表现为逻辑"0"。
- 因此CAN控制器在发送数据的同时也在接收数据,这个特性称之为"回读机制"。但是由于线与特性,收到的数据可能与发送的不同(总线仲裁章节中,非破坏性仲裁依赖的硬件特性)。
4 CAN总线编码
4.1 CAN总线帧的种类
- 数据帧:用于发送单元向接收单元传送数据的帧。
- 遥控帧:用于接收单元向具有相同ID的发送单元请求数据的帧。
- 错误帧:用于当检测出错误时向其它单元通知错误的帧。
- 过载帧:用于接收单元通知其尚未做好接收准备的帧。
- 帧间隔:用于将数据帧及遥控帧与前面的帧分离开来的帧。
其中,数据帧和遥控帧的帧ID有11位和29位两种,分别称作标准格式和拓展格式。
4.1.1 数据帧

注:
- 上图中"D"表示显性,即逻辑0、Dominant
- 上图中"R"表示隐形,即逻辑1、Recessive
- 上图中"D/R"表示取决于具体的数据值
- 上图每种帧正中的数字"1"、"11"、"4"、"0-64"等表示帧长度,而不表示数字
4.1.1.1 标准格式
在CAN总线数据帧的标准格式下,帧的各个结构分别为:
所述段 |
帧结构(按时间顺序) |
总线电平 |
长度 |
含义 |
|
0. 传输开始之前,总线空闲 |
逻辑"1" |
N/A |
总线空闲 |
起始段 |
1. 帧起始(SOF) |
逻辑"0" |
1 |
|
仲裁段 |
2. 帧ID |
取决于帧ID数据 |
11 |
|
仲裁段 |
3. 远程请求标志位(RTR) |
逻辑"0" |
1 |
表示不需要请求远程数据。 用于区分数据帧和遥控帧。 类似于I2C地址中的读写位。 |
控制段 |
4. ID扩展标志位(IDE) |
逻辑"0" |
1 |
用于表示ID长度是否需要扩展。 标准格式的IDE始终为0,扩展格式始终为1。 在扩展格式出现前,该位为预留位r0。 |
控制段 |
5. 预留位(r0) |
逻辑"0" |
1 |
预留位,在扩展格式出现前,该为为r1。 |
控制段 |
6. 数据段长度(DLC) |
取决于数据段长度 |
4 |
表示数据段的字节数,二进制,值为 。 |
数据段 |
7. 数据段(DATA) |
取决于数据 |
字节 |
其数据段长度一定是8的倍数,因为是以Byte为单位。 |
CRC段 |
8. CRC段 |
CRC校验值 |
15 |
从SOF到DATA的CRC校验码。 |
CRC段 |
9. CRC界定符 |
逻辑"1" |
1 |
|
ACK段 |
10.ACK位槽 |
发送者为"1" 接受者为"0" |
1 |
做ACK应答,以及表明发送和接收身份。 发送包和接收包不一样,表明接收成功。 |
ACK段 |
11.ACK界定符 |
逻辑"1" |
|
|
帧结束 |
12.帧结束(EOF) |
逻辑"1" |
7 |
触发总线空闲。 由于长度为7,一次 |
- 远程请求标志位(RTR):
- 在CAN Classical中,支持配置为 Bytes,当四位RTR值大于等于8时,均表示8Byte。
- 在CAN FD中,支持配置为 Bytes。
- 对应表如下表所示(ISO 11898-1 Table 5):

- 帧结束(EOF)长度为7个逻辑"1",违背了位填充规则,因此这种控制段就用这个原则来区分数据段。
4.1.1.2 拓展格式
扩展格式总体与标准格式一致,其主要在于总裁段和控制段有所不同
所述段 |
帧结构(按时间顺序) |
总线电平 |
长度 |
含义 |
... |
|
|
|
|
仲裁段 |
1. 帧ID(前11位) |
取决于帧ID数据 |
11 |
前11位帧ID |
仲裁段 |
2. 替代远程请求(SRR) |
逻辑"1" 与RTR电平不同 |
1 |
由于标准格式优先级大于拓展格式, 因此该位为1,原理可见章节"非破坏性仲裁"。
|
仲裁段 |
4. ID扩展标志位(IDE) |
逻辑"1" |
1 |
表示为扩展格式。 如果不兼容拓展格式的老设备会由于该位为1而忽略该数据帧。 |
仲裁段 |
5. 帧ID(后18位) |
取决于帧ID数据 |
18 |
后18位帧ID |
仲裁段 |
6. 远程请求标志位(RTR) |
逻辑"0" |
1 |
... |
控制段 |
7. 新的预留位(r1) |
逻辑"0" |
1 |
|
控制段 |
8. 新的预留位(r0) |
逻辑"0" |
1 |
|
控制段 |
9. 数据段长度(DLC) |
... |
4 |
... |
4.1.2 遥控帧
4.1.2.1 标准格式
- 远程请求标志位(RTR)为逻辑"1"。
- 遥控帧无数据段,用于在请求式传输中主动请求其他设备的数据。
4.1.3 错误帧
- 位错误
- 错误填充
- CRC校验错误
- 格式错误
- 应答错误
时,所有设备都会发出错误帧来破坏总线上的数据传输,并告知其他所有设备该帧错误。
错误帧结构如下图所示:

如基本电气规定所述,CAN总线拥有"线与"特性,即总线上只要有一个设备发出逻辑"0",则总线上的数据就会被定义为逻辑"0"。
而上图中的:
- 被动错误标志:当主动错误出现过于频繁,则设备会进入被动错误状态,会发逻辑"1"破坏自己发送的数据(懒得管总线命令,自己也闭嘴了)。
- 主动错误标志:出于主动错误状态的设备会发出主动错误标志,会连续使用6个逻辑"0"拉开总线
- 上图中错误标志后半的"0~6"是延长时间,当一个设备发出错误标志后其他设备也会连带着发送错误标志,导致时间差,因此最多就是6位的错误重叠,即12位的错误部分。
- 随后的8个错误界定符为逻辑"1",只有配合上后续的帧间隔才能保证连续的逻辑"1"大于等于11个。而连续11个逻辑"1"恰巧为总线空闲状态的判定条件。
4.1.4 过载帧
过载帧表示接收设备尚未做好接收准备。其通常是在发送方数据量过大时,接收方发出。
过载帧结构如下图所示:

其和错误帧定义一致,只是产生条件不同。
4.1.5 帧间隔
帧间隔用于将数据帧和遥控帧与前面的帧分开(在未出现异常时,总线上只会有这两种帧)。
帧结构如下:

帧间隔也分为主动错误状态和被动错误状态:
- 主动错误状态的帧间隔为3位
- 被动错误状态的真间隔为3位+8位延迟传输。延迟传输会将设备至于仲裁不利的处境。
4.2 位同步规则
正如CAN总线简介章节,CAN总线是异步总线,其没有固定的时钟线。CAN总线设备之间的通信需要提前约定好固定的波特率才能互相通信。
由于是异步通信,因此若长时间不进行时钟同步的话,会由于设备自身的时钟误差以及温漂等原因造成设备间时钟同步出现问题。
CAN总线中集成了对应的同步机制,其同步后有如下的特性:
- 要求发送方以固定时长输出一个数据位,接收方以固定时长接收一个数据位。
- 接收方采样点位于数据位正中(但是具体可以进行调节),例如:

而CAN总线中一共给出了两种同步方式:
- 硬件同步:硬同步的核心思想是以第一个跳变沿为参考,对齐第一次的数据采样点,其用于避免起始时钟误差。
- 再同步:再同步的核心思想是以正常数据位的跳变沿为参考,当发生微小偏差时,则缩短或延长单次的采样间隔,其用于解决时钟累计误差(由于CAN总线报文通常很长,经常数百字节,所以要考虑时钟累计误差)。
这些同步方式将在位时序的学习后进行学习。
4.2.1 位时序
上面简单地介绍了两种同步的核心思想,这两种同步方式都离不开将每一位所使用的时间进一步进行细分。而这种细分及其对应的时序关系就叫做位时序。
CAN总线将每一个位所占用的时间划分为如下的时段:
- 同步段(SS),固定位1Tq。理想情况下SOF的跳变沿发生在此段。
- 传播时间段(PTS),可以自行指定为1~8Tq。用于吸收网络的物理延迟,为网络的物理延迟的两倍。
- 相位缓冲段1(PBS1),可以自行指定为1~8Tq。PBS1和PBS2用于调节采样点所在的相位。
- 相位缓冲段2(PBS2),可以自行指定为2~8Tq
上述时间单位Tq定义为最小时间单位(Time Quantum)。上述时间段长度参数在CAN配置时预设调节,不可进行动态调节。用于动态调节周期长度的参数是再同步补偿宽度(SJW),会在运行时的再同步阶段用于动态调节PBS1和PBS2的长度,即SJW约定了PBS的调节限幅。
而采样时间被规定在PBS1和PBS2之间:

注:
- 网络的物理延迟=发送单元的输出延迟+总线上信号的传播延迟+接收单元的输入延迟
4.2.2 硬件同步(即硬同步)
正如父章节所述,硬同步的核心思想是以第一个跳变沿为参考,对齐第一次的数据采样点,其用于避免起始时钟误差。
每一个CAN设备都有一个位时序计时周期,当接收方收到SOF的跳变沿时,其硬件会将计时周期拨回SS段。
硬件同步仅在SOF的下降沿有效。经过硬同步后,设备已经不存在起始时钟误差。
4.2.3 再同步
正如父章节所述,再同步的核心思想是以正常数据位的跳变沿为参考,当发生微小偏差时,则缩短或延长单次的采样间隔,其用于解决时钟累计误差。
再同步机制使得每当检测出边沿时,根据SJW值通过加长PBS1段,或缩短PBS2段,以调整同步。但如果发生了超出SJW值的误差时,最大调整量不能超过SJW值。
4.4 CAN总线仲裁
CAN总线是一个单工信号线,同一时间只能有一个设备的单向数据传输。当多个设备需要同时发送数据时,则就需要引入仲裁规则来保证数据的有序传输。
CAN总线仲裁的基本规则有如下两个:
- 先占先得:先占用CAN总线的设备先使用总线。
- 非破坏性仲裁:当两个报文同时传送时,报文ID小的设备先使用总线
4.4.1 总线的基本状态
如上文CAN总线编码的若干规定,CAN总线有如下的若干状态及其判定条件:
- 空闲状态:任何设备检测到连续的11个逻辑"1",即11个连续的隐性电平,则此时总线会被认为是空闲状态。
4.4.2 CAN总线仲裁的基本原则
4.4.2.1 先占显得原则
当且仅当设备判定到总线出于空闲状态时,设备才可以使用CAN总线发送数据帧/遥控帧。但是错误帧和过载帧不受此限制。
4.4.2.2 非破坏性仲裁
当两个报文同时传送时,应当根据非破坏性仲裁的原则,让报文ID小的设备先使用总线。
一个常见的场景就是:设备A占用总线发送数据的过程中,设备B、C也进入了总线等待区。当设备A传输完毕后,设备B和C就会同时申请使用CAN总线。
正如CAN总线的电气特性所规定,CAN总线有"线与"特性和"回读"机制:
- 一个CAN控制器在发送数据时,也会同时"回读"发送时刻的CAN总线电平状态
- 由于"线与"特性,在CAN总线上只要有一个设备发送逻辑"0",整个总线就会表现为逻辑"0"
因此,当CAN总线同时传输两个报文的报文ID时,CAN总线总是表现出低地址的报文ID。
这也是非破坏性的原理和特性。
4.4.3 CAN总线仲裁所表现出的特性
- 错误帧和过载帧优先级最高,同时会破坏CAN总线上正在传递的数据。
- 不同报文ID时,低报文ID的报文优先级高(即使分别是数据帧和遥控帧,因为DTR位置在报文ID后)。
- 同一报文ID的数据帧优先级大于遥控帧,因为遥控帧DTR为逻辑"1"而数据帧为逻辑"0"。
- 在标准格式的前11位ID与拓展格式的前11位ID一致时,标准格式的报文优先级比拓展格式的报文高,因为拓展格式的两种报文的替代远程请求(SRR)恒为1,且ID扩展标志位(IDE)恒为1。注意:
- 当且仅当前11位ID一致时,标准格式的报文优先级才会比拓展格式的报文高。
- 仅依靠SRR仅能判定前11位一致时,标准格式的数据帧大于拓展格式的所有帧。后续的IDE的判定才能完全保证上述特性。