【江科大CAN】1. 基础理论知识
CAN总线技术解析与硬件设计要点 摘要:本文系统介绍了CAN总线技术及其硬件实现方案。主要内容包括:(1)CAN总线采用差分信号传输,实际应用中需共地连接以确保稳定性;(2)通过对比UART、I2C、SPI等通信协议,突出CAN在多节点、高可靠性和长距离传输方面的优势;(3)详细解析高速CAN与低速CAN的硬件设计差异,包括终端电阻配置(高速CAN需120Ω匹配电阻,低速CAN采用2.2kΩ偏置电
了解汽车网络
传送门:
车载网络结构(车内)-基础概念
五大汽车总线技术:CAN总线、LIN总线、FlexRay总线、MOST总线及车载以太网
目录导航
0.CAN简介

说明:
虽然差分信号各设备不共地可以使用,但是这可能会让收发器承受较高的共模电压。在实际应用中,为了安全和稳定,CAN通信一般还是会共地的共地,即,再额外使用一根线,把各设备的GND连接在一起。
此外,如果除了传递信号,还需要为设备传递供电电源。那么就需要再加一根电源正的线路CAN_H,CAN_L电,电源正,电源负(GND)这4根线一起构成完整的供电和通信线路。
- 广播式:一个设备发送,其他设备都能收到,接收方根据报文ID决定用不用这个数据
- 请求式:数据发送方不会主动广播自己的数据,只有接到接收方发出的请求,发送方才会发数据,这样一个数据的传输就需要先请求再接收两个过程

以下是UART、I2C、SPI和CAN协议的对比总结:
1. 基础特性对比
| 特性 | UART | I2C | SPI | CAN |
|---|---|---|---|---|
| 通信类型 | 异步(无时钟) | 同步(共享时钟) | 同步(共享时钟) | 异步(基于帧) |
| 全/半双工 | 全双工(独立收发线) | 半双工(单数据线) | 全双工(双数据线) | 半双工(差分总线) |
| 设备数量 | 点对点(仅2设备) | 多从设备(理论128+) | 多从设备(需片选线) | 多节点(多主架构) |
| 拓扑结构 | 点对点 | 总线型(共享SDA/SCL) | 总线型(带片选线) | 总线型(差分线) |
2. 硬件与传输细节
| 特性 | UART | I2C | SPI | CAN |
|---|---|---|---|---|
| 线数 | 2线(TX/RX) | 2线(SDA/SCL) | 3线+片选(SCK/MOSI/MISO) | 2线(CAN_H/CAN_L,差分信号) |
| 速率 | 低(通常≤115.2 kbps) | 标准模式:100 kbps 高速:3.4 Mbps |
高(可达数十Mbps) | 最高1 Mbps(线长↑则速率↓) |
| 寻址方式 | 无地址(点对点) | 7/10位从机地址 | 片选信号选中从机 | 消息ID标识符(11/29位) |
| 错误检测 | 奇偶校验(可选) | ACK/NACK机制 | 无原生校验(依赖应用层) | 强校验(CRC、ACK、帧检查) |
| 冲突处理 | 不适用(点对点) | 主设备控制无冲突 | 主设备选择从机 | 多主仲裁(ID优先级竞争) |
3. 应用场景
- UART:简单调试、短距离通信(如PC与单片机)。
- I2C:板内低速设备互联(传感器、EEPROM)。
- SPI:高速外设(显示屏、FLASH存储器)。
- CAN:高可靠性场景(汽车、工业控制)。
4. 优缺点总结
-
UART
- 优点:简单、全双工。
- 缺点:无多设备支持,速率低。
-
I2C
- 优点:多设备、少线数。
- 缺点:速率受限,需上拉电阻。
-
SPI
- 优点:高速、全双工。
- 缺点:线数多(设备增加时需更多片选线)。
-
CAN
- 优点:高可靠性、多主架构、长距离。
- 缺点:协议复杂,成本较高。
关键区别速记
- 速率:SPI > I2C > CAN(短距离)> UART
- 复杂度:CAN > I2C > SPI > UART
- 可靠性:CAN(带自动重传、错误检测) > 其他
- 设备扩展:CAN(多主)≈ I2C > SPI > UART(仅点对点)
实际选择需根据速度、设备数量、抗干扰需求等场景权衡。
汽车内部CAN拓扑图

动力CAN网络
如图右下角,发动机,自动变速箱,底盘,转向,制动等实时性要求较高的部件,一般采用500kdps的CAN速率
车身CAN网络
与车身部分相关,网关也在其中,会将自适应灯,仪表板,空调,车门等部分接入CAN网络,其中有些部分的下属分支会采样LIN总线来控制下属模块。
组合仪表CAN网络
针对在汽车前端如驾驶室的组合仪表,需要接收到来自各个部件的CAN信息并显示在仪表上
诊断CAN网络
在对车身进行诊断时,也会单独接一路CAN总线出来
一.硬件电路
1.1 基本电路

一、所有CAN节点的通用硬件规则
步骤①:控制器 → 收发器 → 总线
所有设备必须通过CAN收发器接入总线!主控芯片(比如STM32)内部有CAN控制器,控制器只负责协议层,干不了体力活。想连总线必须外挂收发器芯片(例如TJA1050)!
为什么?因为控制器的TX/RX是TTL电平且驱动能力弱,根本扛不住总线上的干扰。所以必须靠收发器实现两件事:把TTL电平转成差分信号,同时增强驱动能力。
步骤②:接线顺序别搞反
- 控制器侧:CPU的TX引脚 → 收发器TX引脚,CPU的RX引脚 → 收发器RX引脚,无需交叉!
- 总线侧:收发器CAN_H接总线CAN_H,CAN_L接总线CAN_L,极性一致即可,所有节点并联到总线上。
二、高速CAN的专属规则(闭环总线)
必备特征➊:头尾加120Ω电阻
高速总线必须是闭环!最后一个节点的CAN_H和CAN_L之间要并联120Ω电阻。原理就像水管堵头:
- 阻抗匹配:高频信号遇到断头会反射回来,和原信号叠加导致波形畸变。120Ω的电阻代表总线特性阻抗,能吸收信号防止反射(类似于在管道末端装缓冲垫)。
- 隐性电压维稳:没人发数据时,120Ω电阻把CAN_H和CAN_L压差拉到0V(逻辑"1"),确保总线处于静默状态。
显性/隐性实操演示:
- 发"0"(显性):收发器强行拉高CAN_H,拉低CAN_L,产生2V压差。
- 发"1"(隐性):收发器直接摆烂不管,120Ω电阻自动把两线压差归零,根本不用动手!
常见错误:忘了加电阻 → 信号跳变时波形疯狂振荡,数据错乱!
三、低速CAN的特殊处理(开环总线)
特征➊:单边2.2kΩ电阻
低速总线(容错CAN)是开环结构!只在总线一端接2.2kΩ电阻(另一端悬空),为什么能防反射?因为低速信号边沿缓,反射问题不严重。这个电阻实际上是偏置电阻,提供一个默认的静默电平。
隐性状态差异:
没有120Ω电阻的暴力归零手段,隐性状态电平靠收发器内部电路维持,抗干扰能力比高速CAN弱。
重要警示:
- 低速CAN不能混用高速收发器!例如TJA1050只能用于高速,低速要用TJA1055(带内部偏置)。
- 速度差距极大:高速CAN支持1Mbps,低速一般≤125kbps。
四、总线物理特征必须牢记
双绞线非选配:
- CAN_H和CAN_L必须双绞!差分信号抗干扰的核心就是靠双绞抵消磁场干扰。
- 单股平行线距离一长必出问题,别不信邪!
拓扑禁忌:
- 高速CAN严禁分叉!所有节点必须在一条主干线上,像糖葫芦一样串起来(手拉手拓扑)。
- 星型/树型拓扑会破坏阻抗连续性 → 信号反射警告!
五、终极重点:为什么能总线仲裁?
硬件决定了规则:显性电平(0)优先级碾压隐性(1)。若两个节点同时发数据:
- 某个bit发"0"的节点会强行覆盖发"1"的节点,后者自动退出发送。
- 这一切都依赖收发器和终端电阻的配合,硬件设计错了一切白搭!
总结一句话:CAN总线的稳定性和仲裁功能,全藏在硬件电路这些细节里!
疑惑点:125 Kbps CAN属于低速还是高速?
核心结论:
-
125 Kbps CAN 明确属于低速/容错CAN (Low-Speed / Fault-Tolerant CAN)。
- 遵循标准: ISO 11898-3。
- 物理层: 使用专用的低速/容错CAN收发器 (如 TJA1054, TJA1055)。
- 特性: 牺牲速度,换取更强的抗干扰能力、容错能力(支持单线工作)和更低的电磁辐射(EMI)。
- 典型应用: 汽车车身控制系统(门窗、座椅、空调、灯光等),对实时性要求不高但对可靠性和故障容忍度要求高的场景。
-
“高速CAN理论下限125Kbps”的说法不准确,是误解。
- 标准无定义: ISO 11898-2(高速CAN)标准没有规定最低工作速率。
- 技术可行性: 高速CAN控制器和收发器技术上可以在很低速率(如10 Kbps, 50 Kbps)工作。
- 工程实践来源: 这个说法源于高速CAN收发器的物理特性:
- 高速收发器针对**中高波特率(如50Kbps - 1Mbps)**优化。
- 在远低于125 Kbps(尤其<50Kbps)时,其固有的快速信号边沿可能导致信号振荡/反射等问题,增加设计难度和潜在错误风险。
- 因此,125 Kbps 常被视为一个工程经验上的“安全且易于实现的低速率起点” 使用高速收发器,但这不是硬性技术下限。
- 最佳实践: 如果应用速率在 125 Kbps 或更低,强烈推荐使用低速/容错CAN (ISO 11898-3)。它在低速段提供更好的鲁棒性、容错性和设计便利性,是规范且优化的选择。
一句话总结:
125 Kbps 是低速/容错CAN的标准速率,不属于高速CAN。所谓“高速CAN理论下限125Kbps”是误解,源于高速收发器在极低速率下的工程挑战;实际低速应用应首选低速/容错CAN方案。
补充说明常见速率梯度:
- 高速CAN (ISO 11898-2): 典型速率 1 Mbps, 500 Kbps, 250 Kbps。偶尔也见 125 Kbps(需注意潜在信号挑战,非最优选)。
- 低速/容错CAN (ISO 11898-3): 标准速率范围 40 Kbps - 125 Kbps(常见 125 Kbps, 83.3 Kbps, 50 Kbps)。
1.2 CAN电平标准

CAN 总线电平标准详解
我们接下来分析 CAN 总线的电平标准。如前所述,CAN 总线采用差分信号传输数据,即通过两根线(CAN_H 和 CAN_L)之间的电压差(Vdiff = VCAN_H - VCAN_L)来表示数据位(1 或 0)。
1. 高速 CAN 电平标准
- 逻辑 1 (隐性电平): 当 Vdiff ≈ 0 V(即 CAN_H 和 CAN_L 对地电压均约为 2.5 V)时,表示逻辑 1。此状态称为隐性电平。
- 逻辑 0 (显性电平): 当 Vdiff ≈ 2 V(例如 CAN_H ≈ 3.5 V, CAN_L ≈ 1.5 V)时,表示逻辑 0。此状态称为显性电平。
为什么逻辑 1 对应隐性,逻辑 0 对应显性?
这个定义看似反直觉(通常认为 1 代表“有”或“活动”,应为显性),但有其设计原因:
- 总线状态本质:
- 隐性状态 (逻辑 1): 表示总线处于“空闲”或“默认”状态。此时两根线电压相等(无电压差),信号线“收紧”(趋向相同电位),不需要设备主动驱动。这是总线的自然、被动状态。
- 显性状态 (逻辑 0): 表示总线被某个设备主动驱动以传输数据。此时两根线产生显著电压差(如 2 V),信号线“张开”(电位分离)。这是需要设备干预的“活动”状态。
- 电路设计惯例: 总线默认状态=CAN隐性电平=逻辑1:对于CAN总线来说,默认状态是隐性电平,而对于一般电路来说默认状态是高电平1,所以在CAN总线里面,隐性电平为逻辑1。
- 线与逻辑: CAN 总线具有“线与”特性。当多个节点同时发送时,显性电平 (逻辑 0) 会覆盖隐性电平 (逻辑 1)。这与数字电路中“0 强于 1”(低电平有效,或开漏输出下拉时)的常见设计原则一致。
简单来说:显隐性描述的是CAN总线的状态;1和0,是为了与电路约定俗成的规则对应。
波形表示方式
- 差分电平表示: 精确绘制 CAN_H 和 CAN_L 两条线各自的电压波形。
- 逻辑电平表示: 为了简化时序图的绘制(画两根线较繁琐),并且因为总线实际只有隐性(1)/显性(0)两种有效状态,常用单根线的高低电平来象征性地表示总线的状态:
- 高电平 代表 隐性状态 (逻辑 1) -> 总线空闲/默认
- 低电平 代表 显性状态 (逻辑 0) -> 总线活动/数据发送
- 重要提示: 逻辑电平图上的“高/低”并非表示 CAN 总线上传输的是单端的高低电平信号。它仅代表此时总线是处于“收紧”的隐性状态(逻辑 1)还是“张开”的显性状态(逻辑 0)。实际物理层传输的始终是差分信号。
2. 低速/容错 CAN 电平标准
低速 CAN 的电平规定原理与高速 CAN 相同,但参数不同:
- 逻辑 1 (隐性电平): Vdiff ≈ -1.5 V (例如 CAN_L ≈ 3.25 V, CAN_H ≈ 1.75 V)
- 逻辑 0 (显性电平): Vdiff ≈ 3 V (例如 CAN_L ≈ 1 V, CAN_H ≈ 4 V)
高速与低速 CAN 设计差异分析
- 电平幅度: 低速 CAN 显性电平的差分幅度更大(3V vs 2V),隐性电平也有反向偏置(-1.5V)。这增大了逻辑 0 和逻辑 1 之间的电压差“行程”。
- 目的: 增大电压差行程是为了增强抗干扰能力和信号在更长距离传输时的鲁棒性。即使线路上存在一定的压降,较大的差分电压仍能清晰地区分逻辑状态。
- 隐性状态差异: 低速 CAN 在隐性状态时,CAN_H 和 CAN_L 电压不相等(这与高速 CAN 隐性时电压相等不同)。
- 终端电阻影响: 由于低速 CAN 隐性状态下两线电压不等,其不能像高速 CAN 那样在总线两端使用一个单一的、连接 CAN_H 和 CAN_L 的终端电阻(通常为 120Ω)。高速 CAN 使用这种电阻是为了在隐性状态(两线等电位)时形成电流回路,并帮助总线在显性驱动结束后快速、稳定地回归到隐性状态(电压相等)。这种快速回归是高速 CAN 能实现高传输速率的关键因素之一。低速 CAN 回归隐性状态相对较慢,因此其最大传输速率较低。
疑惑点:为什么低速CAN要“增大电压差行程”来应对压降?线路上存在一定的压降 ?
核心结论:
“线路上存在一定的压降” 是一个在电子工程和电力传输中非常基础且重要的概念。它指的是 电压(或电势差)在电流流过导体(如电线、电缆、PCB走线)时,沿着导体长度方向逐渐降低的现象。
以下是详细的解释:
-
根本原因:导体的电阻
- 任何实际的导线(如铜线、铝线)都不是理想导体,它们本身具有一定的电阻。
- 根据欧姆定律 (V = I * R),当电流
I流过具有电阻R的导体时,就会在导体两端产生一个电压降V。 - 这个电压降
V的方向与电流方向相反,表现为从电源正极出发,沿着导线流向负载,电压值逐渐降低。
-
物理过程:能量转换
- 电流流过电阻时会做功,将一部分电能转换成热能(焦耳热)。
- 正是这部分被消耗掉的能量,导致了电压沿着导线长度的降低。导线越长或电阻越大(或电流越大),产生的热量越多,电压降就越大。
-
类比理解:水流系统
- 想象一条长长的水管(代表导线)连接水泵(代表电源)和水龙头(代表负载)。
- 水泵提供水压(代表电压),推动水流(代表电流)流过水管。
- 水管壁本身对水流有摩擦阻力(代表电阻)。水流克服阻力前进时,水压会沿着水流方向逐渐降低。当你打开水龙头时,水龙头处的水压肯定低于水泵出口处的水压。这个水压的损失就是“压降”的类比。
-
在信号传输(如CAN总线)中的具体表现和影响:
- 信号源发送端: 驱动芯片(CAN收发器)在总线(CAN_H和CAN_L)上产生一个目标差分电压
V_diff_sent(例如低速CAN显性状态目标为3V)。 - 信号接收端: 接收芯片需要检测总线上的实际差分电压
V_diff_received。 - 压降的产生: 当信号电流流过具有电阻的总线电缆(尤其是长距离传输时)时,根据欧姆定律
V_drop = I_signal * R_wire:I_signal:传输信号所需的电流。R_wire:导线的总电阻(与导线长度、截面积、材料有关)。
- 结果: 接收端实际测量到的差分电压
V_diff_received会低于发送端发出的目标电压V_diff_sent。即:V_diff_received ≈ V_diff_sent - V_drop - 负面影响:
- 信号幅度减小: 接收端看到的信号“强度”变弱了。如果压降过大,
V_diff_received可能降低到接近甚至低于接收器能够可靠识别逻辑状态(1或0)的阈值电压。 - 误码风险增加: 原本清晰的逻辑“0”(显性,大正压差)可能因为压降变得不够“显性”,容易被噪声干扰,或者在接收端被误判为逻辑“1”(隐性,小或负压差)。反之亦然。
- 传输距离受限: 压降是限制信号能够可靠传输的最大距离的关键因素之一。
- 信号幅度减小: 接收端看到的信号“强度”变弱了。如果压降过大,
- 信号源发送端: 驱动芯片(CAN收发器)在总线(CAN_H和CAN_L)上产生一个目标差分电压
-
为什么低速CAN要“增大电压差行程”来应对压降?
- 低速CAN设计用于更长距离的传输,这意味着潜在的压降
V_drop会更大。 - 通过显着增大逻辑“0”(显性)和逻辑“1”(隐性)之间的目标电压差
V_diff_sent(例如从高速CAN的2V增大到低速CAN的3V或更大范围),即使经过长距离传输产生了可观的压降V_drop(比如0.5V甚至1V),接收端测量到的实际电压差V_diff_received仍然足够大。 - 这个“足够大”的
V_diff_received确保了:- 逻辑“0”和逻辑“1”之间仍有清晰可辨的电压差。
- 接收器能可靠地区分两种状态。
- 系统对压降和噪声具有鲁棒性,降低了误码率。
- 低速CAN设计用于更长距离的传输,这意味着潜在的压降
总结:
“线路上存在一定的压降” 就是指 由于导线本身的电阻,当电流(信号电流或电源电流)流过它时,沿着导线方向电压会逐渐降低。在长距离信号传输(如汽车CAN总线、工业现场总线、电力传输)中,这是一个必须考虑的关键因素,因为它会削弱信号强度,影响系统可靠性和最大传输距离。设计时(如低速CAN)通过增大初始信号幅度(电压差)来预留“余量”,就是为了抵消这种压降带来的负面影响。
1.3 CAN收发器-TJA1050(高速CAN)

CAN收发器(TJA1050)内部结构与功能详解
理解CAN设备需要通过CAN收发器连接总线后,我们进一步分析收发器的核心功能和工作机制。以TJA1050高速CAN收发器为例(8引脚封装),其框图清晰地展示了内部结构。
1. 核心功能概述
- 接口转换: 连接微控制器(逻辑电平:TXD, RXD)与物理CAN总线(差分信号:CAN_H, CAN_L)。
- 信号方向:
- 发送(TX): 将控制器输出的逻辑信号(TXD) 转换为驱动CAN总线的差分信号。
- 接收(RX): 将CAN总线上的差分信号转换为控制器可识别的逻辑信号(RXD)。
- 总线状态管理: 提供隐性状态偏置,并包含保护机制(显性超时、热关断)。
2. 引脚功能简述
- GND, VCC (5V): 电源与地。
- TXD, RXD: 连接微控制器的CAN控制器模块(逻辑电平接口)。
- CAN_H, CAN_L: 连接物理CAN总线(差分信号接口)。
- Vref (可选): 参考电压输出,通常可悬空。
- S (可选): 模式选择引脚(高速模式 / 静默模式)。内部有下拉电流源,悬空时默认输入低电平(高速模式)。
3. 发送路径 (逻辑信号 -> 差分信号)
- 输入驱动 (TXD):
- 当 TXD = 1 (高电平,逻辑1 / 隐性):
- 内部驱动器关闭输出级。
- CAN_H 和 CAN_L 不被驱动,总线状态由外部终端电阻决定(呈现隐性电平,Vdiff ≈ 0V)。
- 当 TXD = 0 (低电平,逻辑0 / 显性):
- 内部驱动器激活输出级。
- 上管导通: 将 CAN_H 拉高(趋向 VCC)。
- 下管导通: 将 CAN_L 拉低(趋向 GND)。
- 在 CAN_H 和 CAN_L 之间产生显著电压差 (≈2V),总线呈现显性电平。
- 当 TXD = 1 (高电平,逻辑1 / 隐性):
- 内部偏置电阻: 内部电阻网络(描述中的“中拉电阻”)将 CAN_H 和 CAN_L 偏置到约 0.5 * VCC (≈2.5V) 的共模电压。这有助于在总线隐性状态下稳定总线电压(与终端电阻共同作用),但其阻值较大,稳定总线的主要作用仍由外部终端电阻 (通常 120Ω) 承担。
4. 接收路径 (差分信号 -> 逻辑信号)
- 差分接收器: 持续监测 CAN_H 和 CAN_L 之间的电压差 (Vdiff)。
- 内部比较与电平转换:
- 当检测到显性电平 (Vdiff ≈ 2V, 逻辑0) 时,接收器输出低电平 (0)。
- 当检测到隐性电平 (Vdiff ≈ 0V, 逻辑1) 时,接收器输出高电平 (1)。
- 输出驱动 (RXD): 内部电平转换电路(描述中的“两个管”构成反相器)将接收器的输出驱动到RXD引脚:
- 总线显性 (逻辑0) -> RXD 输出低电平 (0)
- 总线隐性 (逻辑1) -> RXD 输出高电平 (1)
5. 关键保护与辅助功能
- 显性超时定时器 (TXD Dominant Timeout):
- 问题: 如果控制器故障导致 TXD 持续为低 (显性),收发器会持续驱动总线为显性状态,阻塞整个总线通信。
- 保护机制: 该定时器监控 TXD 低电平持续时间。若超过设定时间(典型值~1ms),收发器强制释放总线(等效于 TXD=1),使总线回归隐性状态,防止总线锁死。
- 输入钳位 (TXD 悬空处理): 内部电路确保若 TXD 引脚悬空,其输入被钳位为逻辑高电平 (隐性),防止不确定状态导致总线误操作。
- 热关断保护 (Thermal Shutdown): 检测芯片结温。若温度超过安全阈值,强制关闭输出驱动器,断开收发器与总线的连接,防止芯片损坏并避免干扰总线。
- 模式选择 (S 引脚): 选择工作模式:
- 高速模式 (S=低电平,默认): 正常高速通信模式。
- 静默模式 (S=高电平): 接收功能正常,发送功能被禁用(TXD 输入被忽略,输出驱动器关闭)。适用于仅需监听总线的节点。
6. 收发器行为总结
- TXD=1 (高电平) / TXD悬空: 收发器不驱动总线。总线由终端电阻维持隐性状态 (逻辑1)。
- TXD=0 (低电平): 收发器主动驱动总线,产生显性状态 (逻辑0) 的差分信号。
- 显性超时: TXD=0 持续时间过长时,收发器自动停止驱动总线,恢复隐性状态。
- 总线状态 -> RXD: 总线显性 -> RXD=0 (低电平);总线隐性 -> RXD=1 (高电平)。
1.4 CAN物理层特性

二.帧格式

注:远程帧==遥控帧
2.1 数据帧

数据帧概述:
数据帧是CAN总线上设备主动发送数据的通信单元,采用广播方式传输。例如,在课程初始示例中,按下某设备的按键,该设备便会向总线广播一条消息(也称为报文,即Message)。该消息以数据帧格式存在。下图展示了数据帧的具体格式:
数据帧分为标准格式和扩展格式。在CAN总线标准制定初期,仅存在标准格式;扩展格式是为满足更多标识符需求而后续增加的。扩展格式通过增加ID位数,支持更多种类的标识符。
标准格式详解:
首先解析标准格式数据帧结构,结合图例说明:
- 图例说明:
- 灰色区域 (D): 表示“显性电平”(Dominant),逻辑值0。该区域必须发送显性电平0。
- 紫色区域 (D/R): 表示该位可以是显性电平0(D)或隐性电平1(R),具体值取决于发送的数据。
- 白色区域 (R): 表示“隐性电平”(Recessive),逻辑值1。该区域必须发送隐性电平1。
- 应答位 (ACK Slot): 该特殊位由灰色(发送方)和白色(接收方)各占一半。发送方在此位必须发送隐性电平1,而接收方必须发送显性电平0。这意味着发送方释放总线(输出隐性1),接收方则主动拉低总线(输出显性0),以此向发送方发送应答信号。
- 数字标注: 图中数字(如11位、18位、1位、4位等)表示相应字段所占的比特位数。
数据帧时序分析:
- 总线空闲状态 (Idle): 数据帧传输前,总线必须处于空闲状态。空闲时总线为隐性电平(逻辑1,图中白色)。
- 帧起始 (SOF - Start of Frame): 数据帧第一位为显性电平0(图中灰色低电平)。其作用类似于串口通信的起始位:
- 打破空闲: 总线空闲时为隐性1,所有设备均不驱动总线。发送数据帧必须以显性0开头,主动拉低总线。
- 标识帧开始: 若第一位发送隐性1,则与空闲状态无法区分,接收方无法识别新帧开始。因此,显性0起始位明确标识一帧数据的开始,并告知接收方:后续时间内,若总线为隐性1,表示发送的就是逻辑值“1”,而非总线空闲。
- 仲裁段 (Arbitration Field):
- 报文标识符 (Identifier - ID): 紧接SOF后,标准格式ID为11位。ID值(如1010101)决定了该段波形(显/隐序列)。ID的作用至关重要:
- 区分功能: 标识数据帧的功能含义。
- 优先级仲裁: 当多个设备同时发送时,依据仲裁规则(ID值小的优先级高)决定发送顺序。ID值大的帧需等待总线空闲后重试。不同功能的数据帧必须分配不同ID,否则仲裁机制无法区分相同ID帧的发送顺序(仲裁规则详见第四章)。
- 远程传输请求位 (RTR - Remote Transmission Request): 占据1位。在数据帧中,此位必须为显性0,用于区分遥控帧(Remote Frame, RTR必须为隐性1)。
- 仲裁段组成: ID + RTR 共同构成仲裁段。仲裁主要依赖ID值,RTR参与仲裁的目的在于:若相同ID的数据帧和遥控帧发生冲突,数据帧(RTR=0)优先级高于遥控帧(RTR=1)。数据帧与遥控帧可使用相同ID。
- 类比I²C: 此段设计理念与I²C总线相似。I²C起始后发送7位从机地址+1位读写位(R/W)。CAN的11位ID(指定报文功能)+ RTR位(区分数据写入/远程请求读取)与之异曲同工。I²C的多主机仲裁也基于从机地址+读写位。关键区别在于:CAN摒弃了“从机地址”概念,改为分配“报文ID”。优势在于同一报文可被多个设备同时接收。若规定设备仅接收固定ID的报文,则CAN的报文ID功能即等同于I²C的从机地址。
- 报文标识符 (Identifier - ID): 紧接SOF后,标准格式ID为11位。ID值(如1010101)决定了该段波形(显/隐序列)。ID的作用至关重要:
- 控制段 (Control Field):
- 标识符扩展位 (IDE - Identifier Extension): 1位。在标准帧中,原CAN 1.2的保留位 r1 被重新定义为标识符扩展位 (IDE)。用于区分标准格式(IDE=显性0)与扩展格式(IDE=隐性1)。此位必不可少,否则接收方无法判断后续按何种格式解析。
- 保留位 r0: 1位,必须为显性0。目前未使用,为未来协议升级预留空间。
- 数据长度码 (DLC - Data Length Code): 4位,指示数据段包含的有效数据字节数(1-8字节)。例如:
- 发送1字节:DLC=0001 (显显显隐)
- 发送8字节:DLC=1000 (隐显显显)
- DLC=0 表示数据段无有效字节(虽可行,但实际传输数据时长度通常大于0)。
- 数据段 (Data Field): 长度由DLC指定(0-64位,即0-8字节)。发送方需确保DLC值与实际发送的数据字节数严格对应。数据段长度必须是8位(1字节)的整数倍。
- CRC段 (CRC Field):
- 循环冗余校验码 (CRC - Cyclic Redundancy Check): 15位。对SOF起始至数据段结束(含)的所有位进行CRC计算,生成校验码。
- CRC界定符 (CRC Delimiter): 1位,必须为隐性1。作为CRC段结束标志,并为后续ACK段做准备。
- 校验原理: 接收方对相同数据范围计算CRC,并与接收到的CRC值比对。若不一致,则判定传输错误。CRC校验漏检率极低,可靠性远高于串口通信中的奇偶校验。
- ACK段 (ACK Field):
- ACK槽 (ACK Slot): 1位。
- 发送方行为: 释放总线,输出隐性1。
- 接收方行为: 若正确接收到帧(通过CRC校验),则在此位主动驱动总线为显性0。
- ACK界定符 (ACK Delimiter): 1位,必须为隐性1。接收方必须在此位释放总线(输出隐性1),将总线控制权交还发送方。
- 应答机制:
- 发送方在ACK槽位读取总线状态:若为显性0,表明至少有一个接收方正确接收;若为隐性1,则表明无接收方应答,发送失败(可配置重发)。
- 关键点1: 允许多个接收设备同时拉低ACK槽(输出显性0)。
- 关键点2: ACK应答发生在帧传输结束前(EOF之前)。接收方在收到CRC段后即完成帧接收,并在ACK槽位短暂获得总线控制权进行应答,之后发送方才完成整个帧的发送(EOF)。
- 界定符作用: CRC界定符确保发送方在ACK槽前释放总线;ACK界定符确保接收方在应答后及时释放总线,实现控制权平稳交接。
- ACK槽 (ACK Slot): 1位。
- 帧结束 (EOF - End of Frame): 7位隐性1。作用类似于串口停止位,标志数据帧传输结束。
标准格式设计思路总结:
核心目标是设计承载数据的波形:
- 数据载体: 包含数据段。
- 长度可变: 引入DLC指定数据段长度。
- 功能标识与仲裁: 添加ID标识功能,结合RTR区分数据写入/远程读取请求。
- 数据完整性: 添加CRC校验。
- 传输确认: 添加ACK应答机制确认接收方存在。
- 未来兼容: 预留保留位(r0, r1)。[现在r1->IDE]
- 版本区分: r1被赋予IDE功能,区分标准/扩展格式。
- 帧界定: SOF标识开始,EOF标识结束。

扩展格式详解:
扩展格式旨在解决标准格式11位ID不足的问题,同时需兼容原有标准。
- 结构特点:
- 保留标准格式的11位基本ID(Base ID)。
- 新增18位扩展ID(Extended ID)。
- 替代远程请求位 (SRR - Substitute Remote Request): 1位,位于基本ID后、IDE前。在扩展帧中必须为隐性1。其存在主要是为兼容仲裁规则(仲裁先比较ID,后比较RTR),确保标准帧在与同Base ID的扩展帧仲裁时胜出(标准帧的RTR位位置在扩展帧中是SRR位,标准帧RTR=0显性 优于 扩展帧SRR=1隐性)。标准帧中此位是RTR。
- 标识符扩展位 (IDE): 1位,在扩展帧中必须为隐性1(标准帧中为显性0)。
- 远程传输请求位 (RTR): 1位,位置移至IDE之后。在数据帧中仍必须为显性0。
- 兼容性设计: 接收方在收到IDE位之前(即基本ID和SRR位),无法区分帧格式,但此部分两种格式结构相同,无需区分。收到IDE位后:
- IDE=显性0:按标准格式解析后续内容。
- IDE=隐性1:按扩展格式解析后续内容(存在18位扩展ID和移动后的RTR)。
- 控制段及后续: IDE位之后的r0、DLC、数据段、CRC段、ACK段、EOF与标准格式完全相同。其中扩展格式中的r1位(原IDE位置)恢复为保留位(与r0一起),为未来进一步升级预留空间。
- 仲裁段组成: 扩展帧的仲裁段为:11位Base ID + SRR位 + IDE位 + 18位Extended ID + RTR位。
数据帧各字段功能总结:
| 字段 | 缩写 | 全称 | 功能描述 | 备注 |
|---|---|---|---|---|
| 帧起始 | SOF | Start of Frame | 标识数据帧开始,显性电平(0)打破总线空闲。 | |
| 仲裁段 | ||||
| 标识符 (标准) | ID | Identifier | 11位,标识报文功能,决定仲裁优先级。 | |
| 标识符 (扩展) | ID | Identifier | 11位基本ID + 18位扩展ID,提供更多标识符空间。 | |
| 远程传输请求位 | RTR | Remote Transmission Req. | 1位。数据帧=显性0;遥控帧=隐性1。区分帧类型,参与仲裁。 | 在扩展帧中位置后移。 |
| 标识符扩展位 | IDE | ID Extension | 1位。标准帧=显性0;扩展帧=隐性1。区分帧格式。 | 标准帧中原为保留位r1。 |
| 替代远程请求位 | SRR | Substitute Remote Request | 1位(仅扩展帧存在)。必须为隐性1。保证同基本ID的标准帧仲裁优先级更高。 | 位于扩展帧基本ID后、IDE前。在标准帧中此位置是RTR位。 |
| 控制段 | ||||
| 保留位 | r1, r0 | Reserved | 各1位。标准帧r1=IDE位;扩展帧r1保留。r0必须显性0。为未来升级预留。 | 体现协议设计的远瞻性。 |
| 数据长度码 | DLC | Data Length Code | 4位。指定数据段包含的有效数据字节数 (0-8)。 | |
| 数据段 | Data | Data Field | 0-8字节 (0-64位) 有效载荷数据。长度由DLC指定。 | 长度必须是字节(8位)的整数倍。 |
| CRC段 | ||||
| 循环冗余校验码 | CRC | Cyclic Redundancy Check | 15位。校验SOF至数据段结束的所有位。 | 高可靠性校验。 |
| CRC界定符 | - | CRC Delimiter | 1位。必须隐性1。标志CRC段结束。 | 发送方释放总线,为ACK槽做准备。 |
| ACK段 | ||||
| ACK槽 | - | ACK Slot | 1位。发送方释放总线(隐性1);接收方正确接收后拉低总线(显性0)应答。 | 允许多个接收方同时应答。 |
| ACK界定符 | - | ACK Delimiter | 1位。必须隐性1。接收方释放总线,标志ACK段结束。 | 接收方交出总线控制权。 |
| 帧结束 | EOF | End of Frame | 7位隐性1。标志数据帧传输结束。 |
数据帧发展历史:
- CAN 1.2: 仅存在单一数据帧格式(即后来的标准格式)。IDE位当时为保留位r1(固定显性0)。11位ID在当时足够使用。帧结构规整:仲裁段(ID + RTR) -> 控制段(r1 + r0 + DLC) -> 数据段 -> CRC段 -> ACK段 -> EOF。
- CAN 2.0: 因ID需求增长,引入扩展格式。为区分新旧格式,协议将标准格式中的保留位r1重新定义为IDE位。扩展帧通过增加18位扩展ID和SRR位(保证仲裁兼容性)来扩展地址空间,同时复用IDE位后的r1作为保留位。
- 兼容性代价: 扩展帧的结构不如标准帧规整优雅(ID被拆分,存在无实质功能的SRR位)。这类似于软件升级时遗留的“死代码”(Dead Code)现象——为保持向后兼容性,协议逐渐变得复杂。虽然硬件协议的更新周期远长于软件,但最终也可能被全新设计所替代。
2.2 遥控帧

遥控帧概述:
遥控帧(Remote Frame)用于实现请求式数据传输。其用途是:当接收设备需要获取特定数据时,主动向总线发送遥控帧以请求该数据。
工作原理与使用场景:
- 数据广播的局限性: CAN总线上的数据主要依靠发送设备主动广播(通常以固定周期发送)。这种方式存在潜在问题:
- 若发送方未能及时广播数据,接收方无法获取。
- 若数据使用频率低,周期性广播会造成总线资源浪费。
- 若广播间隔过长,偶尔需要该数据的设备无法及时获取。
- 遥控帧的解决方案: 对于使用频率较低或按需使用的数据,可采用遥控帧机制:
- 接收方发起请求: 需要数据的设备(接收方)广播一个遥控帧,该帧包含所需数据的报文ID。
- 发送方响应数据: 总线上拥有该ID数据的设备(发送方)收到遥控帧后,会立即(或根据配置)通过一个携带有效数据的数据帧(使用相同ID)广播响应。
- 接收方获取数据: 请求方接收此数据帧,从而获得所需数据。
- 请求-响应流程: 一次完整的按需数据传输需要两个步骤:接收方发送遥控帧(请求) -> 发送方响应数据帧(应答)。
- 适用场景: 遥控帧机制适合使用频率低但偶尔需要集中使用的数据。它避免了周期性广播的浪费。
- 不适用场景: 对于使用频率高的数据,采用遥控帧请求反而不合适,因为每次请求(遥控帧)和响应(数据帧)都会占用总线资源。此时,由发送方进行周期性广播(数据帧)通常是更高效的选择。
遥控帧格式定义:
遥控帧的时序结构与数据帧高度相似,关键区别在于:
- RTR位 (Remote Transmission Request): 遥控帧的RTR位必须为隐性电平1(数据帧的RTR位为显性电平0)。这是区分两种帧类型的核心标志。
- 数据段缺失: 遥控帧不包含数据段(Data Field)。因为它本身是请求,不携带有效载荷。
- 其他字段: 帧起始(SOF)、仲裁段(ID)、控制段(IDE, r0, DLC)、CRC段、ACK段、帧结束(EOF)等部分的结构和规则与数据帧完全相同。
请求-响应流程详解:
- 请求发起: 请求设备广播一个遥控帧。该帧的:
- ID字段: 设置为它需要请求的数据对应的报文ID。
- RTR位: 设置为隐性1(标识此为遥控帧)。
- DLC字段: DLC字段:设置为期望响应的数据帧应包含的数据长度(0-8字节)。发送方在响应时,其数据帧的DLC值应与此值匹配,以确保接收方能正确解析预期长度的数据。
- 响应触发: 拥有该ID数据的设备(发送方)接收到此遥控帧。
- 数据响应: 发送方随后(通常在总线空闲后)广播一个数据帧。该帧的:
- ID字段: 与接收到的遥控帧ID相同。
- RTR位: 设置为显性0(标识此为数据帧)。
- 数据段: 包含请求方所需的有效数据(长度通常匹配遥控帧的DLC)。
- 仲裁优先级: 当请求(遥控帧)和响应(数据帧)恰好同时尝试发送时,由于数据帧的RTR位为显性0,而遥控帧的RTR位为隐性1,根据CAN总线仲裁规则(先比较ID,ID相同再比较RTR),相同ID的数据帧优先级高于遥控帧。因此,数据帧将赢得仲裁并优先发送,遥控帧退避等待重试。这确保了响应数据能优先送达。
总结:
遥控帧是CAN协议实现按需数据传输的关键机制。它通过设置RTR=1且省略数据段来区别于数据帧。接收设备通过广播遥控帧(指定ID)来请求数据,拥有该数据的设备则通过广播数据帧(相同ID)进行响应。这种机制优化了低频率数据的传输效率,避免了不必要的周期性广播开销。
2.3 错误帧(了解)

错误帧概述:
错误帧(Error Frame)是CAN总线协议中用于错误检测与通知的机制。其核心用途是:当总线上的任一设备检测到传输错误时,立即向所有其他设备广播错误帧,通知错误发生,并强制终止当前正在传输的数据帧或遥控帧。
错误帧的核心作用:
- 错误通知: 向总线所有参与者宣告检测到错误。
- 强制终止: 通过发送特定的错误标志(Error Flag)序列主动破坏当前帧的波形,确保该帧被所有设备识别为无效并丢弃。
- 促进重发: 终止错误帧后,发送方(在满足错误计数规则下)通常会尝试自动重发该数据帧或遥控帧。
错误检测机制:
总线上所有设备在接收数据的同时,都会实时监督总线波形。一旦检测到以下任一错误类型:
- 位错误 (Bit Error): 发送方在发送显性位(0)时监听到总线为隐性(1),或发送隐性位(1)时监听到总线为显性(0)(仲裁期间和ACK槽位除外)。
- 填充错误 (Stuff Error): 违反位填充规则(连续6个相同电平位)。
- CRC错误 (CRC Error): 接收方计算的CRC校验值与接收到的CRC值不匹配。
- 格式错误 (Form Error): 检测到固定格式位(如帧结束EOF、界定符Delimiter)出现非法电平。
- 应答错误 (ACK Error): 发送方在ACK槽位未检测到显性电平(0)(即无任何接收方应答)。
检测到错误的设备将立即发起错误帧的发送。
错误帧结构:
错误帧由两部分组成:
- 错误标志 (Error Flag):
- 主动错误标志 (Active Error Flag): 由处于主动错误状态 (Active Error State) 的设备发出。该标志为连续6位显性电平 (0)。
- 被动错误标志 (Passive Error Flag): 由处于被动错误状态 (Passive Error State) 的设备发出。该标志为连续6位隐性电平 (1)。
- 错误界定符 (Error Delimiter): 紧接在错误标志之后,由8位隐性电平 (1) 组成。
错误标志的工作原理与影响:
- 主动错误标志 (6位显性0):
- 发出显性电平(0)即表示驱动总线为低电平。
- 基于CAN总线的“线与”(Wired-AND)物理特性:只要有一个设备驱动总线为显性(0),总线即呈现显性状态(0)。显性位(0)总是覆盖隐性位(1)。
- 因此,主动错误标志(6个连续的0)会强制覆盖总线上的任何正常传输波形,导致当前帧的数据被破坏,所有设备都能识别到错误。
- 被动错误标志 (6位隐性1):
- 发出隐性电平(1)即表示释放总线(不主动驱动,呈现高阻态)。
- 处于被动错误状态的设备检测到错误时发送此标志。
- 由于它仅释放总线(输出隐性1),不会主动驱动总线为低电平(0),因此不会破坏其他正常设备发送的数据帧波形。
- 它的主要作用是:当该设备自身是发送方且检测到错误时,通过发送被动错误标志来中断自身的数据发送,并通知错误。它不影响其他设备发送的正确帧。
错误标志的重叠 (Superposition):
- 当一个设备发出错误标志(尤其是主动错误标志)时,可能触发其他检测到相同或不同错误的设备也同时发出错误标志。
- 多个设备的错误标志会在总线上叠加。对于主动错误标志(显性0),叠加会延长总线被拉低的时间(0位到最多12位,甚至更长)。对于被动错误标志(隐性1),叠加没有额外效果。
- 图中标注的“0到6位延长”即表示这种由多个设备错误标志叠加导致的错误标志持续时间延长的可能性。
错误界定符的作用:
- 在错误标志(无论实际长度)之后发送8位隐性电平(1)。
- 提供一段稳定且可预测的隐性电平时间段。
- 标志错误帧的结束。
- 为总线从错误状态恢复到空闲状态或准备下一帧传输提供必要的间隔时间。
错误状态与节点行为:
- 初始状态: 设备上电后默认处于主动错误状态。
- 状态转换: 设备根据其发送/接收错误计数器的值(由协议定义的规则管理)在主动错误状态、被动错误状态和总线关闭状态之间转换。详细规则将在第五章介绍。
- 核心区别:
- 主动错误状态: 设备检测到错误时发送主动错误标志 (6位显性0),会破坏当前总线传输。
- 被动错误状态: 设备检测到错误时发送被动错误标志 (6位隐性1),不会通过驱动总线来破坏当前波形。但当它被其他设备检测到时(表现为连续6个隐性位,违反位填充规则),会被识别为一个错误帧(被动错误标志),宣告有错误发生,并可能导致当前帧被发送方或检测到该错误标志的其他设备终止。
| 节点错误状态 | 检测到错误时的行为 | 错误标志类型 | 对总线传输的影响 |
|---|---|---|---|
| 主动错误状态 | 发送连续6位显性电平(0) | 主动错误标志 | 强制终止当前总线传输,破坏当前帧 |
| 被动错误状态 | 发送连续6位隐性电平(1) | 被动错误标志 | 不破坏其他正确帧;若自身是发送方则中断发送 |
| 总线关闭状态 | 脱离总线,无法发送或接收任何帧 | 不发送错误标志 | 无 |
总结:
错误帧是CAN总线高可靠性的关键机制之一。它通过设备主动监督总线、检测错误并立即发送错误标志(主动或被动)来通知所有节点,强制终止无效传输,并促进错误恢复(通常是重发)。理解错误帧的结构(标志+界定符)及其在不同节点错误状态下的行为差异(主动标志破坏总线,被动标志不破坏总线但中断自身发送),是掌握CAN总线错误处理机制的基础。
2.4 过载帧(了解)

过载帧 (Overload Frame) 概述:
过载帧(Overload Frame)是CAN总线协议中一种由接收设备(Receiver)主动发起的流量控制机制。其主要用途是:当接收方因内部处理能力不足(例如缓冲区满、CPU负载过高等)而无法及时处理持续涌入的总线数据时,通过发送过载帧来强制延缓发送方(Transmitter)的数据传输速率,从而避免数据丢失并平衡总线负载。
过载帧的工作原理与目的:
- 问题背景: 在广播式通信(如数据帧)中,发送方主动控制发送节奏,接收方无法直接请求发送方减速。
- 过载帧的解决方案: 当接收方不堪重负时:
- 发起中断: 接收方广播一个过载帧。
- 强制延缓: 过载帧的波形结构与错误帧类似,同样包含能破坏当前总线传输的标志序列。这会强制中断发送方正在发送的帧。
- 触发重发与延迟: 被中断的发送方会(根据协议规则)稍后自动重试发送被破坏的帧。
- 间接调速: 通过周期性插入过载帧来反复中断和延迟发送方的传输,接收方有效地降低了实际到达其自身的数据流速率,为其内部处理争取了时间。
- 负载平衡: 该机制有助于防止接收方因数据过载而崩溃或丢失数据,从而维持总线通信的整体稳定性。
- 设计意图: 过载帧提供了一种接收方间接调控发送方速率的非直接反馈机制。
过载帧格式定义:
过载帧的时序结构高度相似于错误帧,核心区别在于其产生条件和目的:
- 过载标志 (Overload Flag):
- 由发起过载帧的接收方发出。
- 格式为连续6位显性电平 (0)(与主动错误标志相同)。
- 作用: 驱动总线为显性状态(0),强制覆盖并破坏当前正在传输的帧(无论数据帧、遥控帧还是其他),通知所有节点接收方过载。
- 过载界定符 (Overload Delimiter): 紧接在过载标志之后,由8位隐性电平 (1) 组成(与错误界定符相同)。
- 作用: 标志过载帧结束,提供总线恢复隐性状态的时间。
关键点:波形相似性
- 过载标志 (6位显性0) 在物理层上与主动错误标志完全相同。
- 过载界定符 (8位隐性1) 在物理层上与错误界定符完全相同。
- 核心差异: 错误帧由错误检测(位错、填充错、CRC错等)触发;而过载帧由接收方内部资源不足触发。接收方主动选择发送过载帧作为一种流量控制手段,而非错误响应。
过载帧的影响与发送方响应:
- 当前帧中断: 被过载帧破坏的当前传输帧会被所有节点(包括原发送方)视为无效并丢弃。
- 发送方行为: 被中断的发送方将:
- 检测到传输被破坏(类似检测到错误)。
- 其错误计数器可能会受到影响(具体规则较复杂,通常影响小于严重错误)。
- 在满足协议规则(如帧间隔后)自动重发被中断的帧。
- 速率调节效果: 如果接收方持续过载,它会重复发送过载帧。每次过载帧都会导致发送方重发被中断的帧并经历额外的延迟(帧间隔、可能的仲裁等待)。这种反复的中断和重试显著降低了发送方数据实际成功送达接收方的有效速率,从而缓解了接收方的处理压力。
| 特性 | 过载帧 (Overload Frame) | 错误帧 (Error Frame) |
|---|---|---|
| 触发条件 | 接收方内部处理能力不足 (非错误状态) | 设备检测到总线传输错误 (5种错误类型之一) |
| 发起方 | 接收方 (感到过载的设备) | 任何检测到错误的设备 (发送方或接收方) |
| 核心目的 | 流量控制:间接降低发送方有效数据速率 | 错误处理:通知错误、终止无效传输、促重发 |
| 波形结构 | 6位显性0 (过载标志) + 8位隐性1 (过载界定符) | 6位显/隐标志 (取决于状态) + 8位隐性1 (错误界定符) |
| 主动标志作用 | 强制中断当前传输,实现流量控制 | 强制终止当前传输,宣告错误发生 |
| 对错误计数器影响 | 通常较小 (视具体实现和频率) | 显著增加 (是节点错误状态转换的主要依据) |
总结与定位:
- 过载帧是CAN总线协议中用于接收方主导的流量控制机制。
- 它通过主动破坏当前总线传输(发送6位显性过载标志)来强制中断发送方,并利用发送方的自动重发机制和重发延迟,间接达到降低数据流速率、缓解接收方处理压力的目的。
- 其波形虽与错误帧(主动错误标志部分)相似,但触发原因(接收方过载 vs. 检测到总线错误)和设计目标(流量控制 vs. 错误恢复)有本质区别。
- 理解其作为间接流量控制手段的本质及其与错误帧的区别即可。其内部计数器规则等细节可在深入协议实现时再研究。
2.5 帧间隔

帧间隔 (Interframe Space - IFS) 概述:
帧间隔(Interframe Space, IFS)是CAN总线协议中用于分隔连续传输的数据帧或遥控帧的固定时间段。其核心作用是在前一帧(数据帧、遥控帧或错误帧)结束(EOF)之后、下一帧开始(SOF)之前,提供一个必需的间隔期。
帧间隔的作用:
- 帧分隔: 明确标识前一帧的结束和下一帧的开始,确保接收设备能够正确解析连续的帧。
- 总线状态恢复: 为总线提供一个短暂的稳定期(隐性电平),确保所有节点有足够时间准备接收或发送下一帧。
- 错误状态处理: 其具体长度会根据发送节点的错误状态进行调整,以限制不可靠节点对总线的影响。
帧间隔的结构:
帧间隔由两个主要部分组成:
- 间隔段 (Intermission): 固定为 3位隐性电平 (1)。所有节点(无论错误状态)在发送或接收完一帧后,都必须等待并监听到至少3位的隐性电平(总线空闲),才能开始发送下一帧。
- 总线空闲 (Bus Idle): 在间隔段之后,总线保持隐性电平(1)的时间段。此段的长度是可变的,取决于是否有节点要发送新帧。关键点在于:节点被允许开始发送新帧的时间点(即SOF的起始点)取决于其自身的错误状态。
帧间隔长度与节点错误状态的关系:
节点被允许在间隔段结束后开始发送新帧的具体时间,由其当前的错误状态决定:
| 节点错误状态 | 允许开始发送新帧的时间点 | 帧间隔中附加要求 | 目的 |
|---|---|---|---|
| 主动错误状态 (Active Error State) | 在检测到 3位隐性电平(间隔段结束)后,立即可以开始发送SOF。 | 无附加段。 | 正常节点享有平等的总线访问权限。 |
| 被动错误状态 (Passive Error State) | 在检测到 3位隐性电平(间隔段结束)后,必须额外等待8位隐性电平的时间(称为“延迟传输”段),之后才能开始发送SOF。 | 附加 8位隐性电平的“延迟传输”(Suspend Transmission) 段。 | 限制不可靠节点的总线访问优先级: • 确保被动错误状态节点在总线空闲后,需等待更长时间(额外8位)才能尝试发送。 • 在此期间,处于主动错误状态(更可靠)的节点可以抢先获得总线访问权并开始发送。 • 有效降低频繁出错的节点干扰总线正常通信的概率。 |
总结与学习建议:
- 帧间隔核心功能: 提供必要的分隔(3位间隔段),并依据节点可靠性(错误状态)管理其访问总线的优先级。
- 主动错误状态节点: 享有标准访问权限(间隔段结束即可发送)。
- 被动错误状态节点: 访问权限受限(间隔段结束后需额外等待8位“延迟传输”时间才能发送),以减少其对总线的潜在干扰。
- 其他帧类型: CAN协议还定义了错误帧(Error Frame)和过载帧(Overload Frame)用于处理错误和总线过载情况。这些机制,连同帧间隔在不同错误状态下的细节以及各种意外状态的处理,共同构成了CAN总线复杂而强大的错误管理和恢复系统。
- 学习路径建议: 对于初学者,应掌握基本的数据传输,可以在理解基础通信流程后,根据实际需要再进行深入研究。
位填充:

位填充 (Bit Stuffing) 概述:
位填充是CAN总线协议中,在数据帧或遥控帧发送到物理总线之前,由发送方执行;以及在从总线接收数据之后,由接收方执行的一项强制性编码规则。其核心目的是确保总线波形具有足够的电平跳变(边沿),以解决长时间电平恒定带来的潜在问题。
位填充规则:
- 发送方规则:
- 在发送有效数据位(从SOF到CRC,但不包括CRC界定符、ACK段、EOF和帧间隔)时:
- 每当连续发送了5个相同电平位(5个显性0或5个隐性1)后:
- 必须自动插入(填充)一个相反电平的位(称为填充位,Stuff Bit)。
- 插入填充位后,重新开始对连续相同电平位的计数(从0开始)。
- 接收方规则:
- 在接收数据位(从SOF到CRC)时:
- 每当连续接收到5个相同电平位后:
- 预期下一个位必须是填充位(即与前5位相反的电平)。
- 接收方会自动移除这个填充位。
- 移除填充位后,重新开始对连续相同电平位的计数(从0开始)。
- 关键点:
- 填充位不包含在原始有效数据中,仅用于物理层传输编码。
- 发送方插入填充位,接收方移除填充位,确保原始有效数据在通信两端完全一致。
- 填充规则: 位填充规则适用于:帧起始 (SOF) 到 CRC值 (15位) 结束,包含仲裁段、控制段、数据段和CRC值本身。不适用于CRC界定符、ACK段、帧结束 (EOF) 和帧间隔 (IFS)。
位填充的核心作用:
- 提供定时信息与再同步(核心作用):
- 问题: 长时间连续相同电平(如64位隐性1)会导致波形无跳变。接收方依赖电平跳变(边沿)来:
- 精确定位位边界(确定何时采样)。
- 执行时钟再同步(调整内部时钟相位以补偿发送/接收时钟偏差,确保在位的中间采样)。
- 解决方案: 位填充强制引入电平跳变(每5个相同位后插入相反位)。
- 效果: 保证在有效数据部分,连续相同电平位数不超过5位。接收方能频繁检测到边沿,持续校正采样点位置,显著提高长帧传输的可靠性,防止累积的时钟偏差导致位采样错误。
- 问题: 长时间连续相同电平(如64位隐性1)会导致波形无跳变。接收方依赖电平跳变(边沿)来:
- 标志错误帧与过载帧的特异性:
- 问题: 如何区分正常数据和错误/过载帧?错误帧和过载帧的标志位是连续6个显性电平 (0)。
- 解决方案: 经过位填充的正常数据流中,不可能出现连续6个相同电平位(因为第5个相同位后必插入相反位)。
- 效果: 一旦检测到连续6个或更多个相同电平位,接收方立即识别出这是错误帧或过载帧的标志,而非正常数据。这为错误/过载检测提供了清晰、可靠的物理层特征。
- 防止误判总线空闲:
- 问题: CAN协议规定,检测到连续11个隐性电平 (1) 即认为总线空闲。原始数据段可能包含长串隐性1(如全0xFF数据),易被误判为空闲。
- 解决方案: 位填充确保在有效数据部分,连续隐性1位数不超过5位。
- 效果: 正在传输的数据帧/遥控帧期间,不可能出现连续11个隐性1,从而避免其他节点误判总线空闲并发起新传输导致冲突。
总结:
位填充是CAN总线物理层可靠性的基石:
- 发送方插入填充位,接收方移除填充位,确保原始数据无损传输。
- 通过强制引入电平跳变(每5个相同位后插入相反位):
- 提供丰富的定时边沿,使接收方能精确定位位边界并执行时钟再同步。
- 确保正常数据流中连续相同电平不超过5位,为错误帧/过载帧(连续6个相同电平)提供特异性标识。
- 防止有效数据传输期间出现连续11个隐性1,避免被误判为空闲状态。
虽然增加了传输开销(插入填充位),但其带来的可靠性收益远大于代价,是CAN协议高鲁棒性的关键设计之一。
波形示例
波形实例分析方法:
使用示波器双通道分别测量CAN_H和CAN_L对地电压,通过差分运算获得总线电平波形。捕获步骤如下:
- 探头连接: 示波器通道1接CAN_H,通道2接CAN_L,探头接地端均连接STM32开发板共地点。
- 触发设置: 配置为下降沿触发(对应SOF起始位)。
- 数据生成: 按下按键触发STM32发送预设帧结构。
- 波形解析:
- 在波形图中标注位边界判定线,提取二进制数据流。
- 根据CAN协议帧格式和位填充规则进行解码,还原原始数据。
实例1:标准数据帧(ID=0x555, DLC=1, Data=0xAA)
- 波形特征:
- 总线空闲: 起始前为连续隐性电平(逻辑1)。
- 帧起始 (SOF): 显性电平(0),打破空闲状态。
- 仲裁段:
- ID (11位):
101 0101 0101→ 十六进制0x555(最高位MSB先发)。波形呈现对应的334结构,344含义:0x为十六进制前缀,一个十六进制=4位,ID最多11位,所以第一个5就只能分解成101) - RTR位: 显性0(标识数据帧)。
- ID (11位):
- 控制段:
- IDE位: 显性0(标准格式)。
- r0位: 显性0(保留位)。
- DLC (4位):
00(1)01→ 长度1字节(注意:此处因前5位连续0触发位填充,插入填充位1,实际波形为0 0 1 0 1,解析时移除填充位得0 0 0 1)。
- 数据段 (1字节):
1010 1010→ 十六进制0xAA(MSB先发)。 - CRC段 (15位): 包含自动计算的校验码(发送端生成)。注:CRC计算基于原始数据(不含填充位)。段内存在位填充(因连续5个0插入填充位
1)。 - CRC界定符: 隐性1(发送方释放总线)。
- ACK段:
- ACK槽: 显性0(由接收方驱动,表示应答有效)。
- ACK界定符: 隐性1(接收方释放总线)。
- 帧结束 (EOF): 7位隐性1。
- 验证: 波形完全符合标准数据帧格式,位填充机制正常运作。
实例2:标准数据帧(ID=0x666, DLC=2, Data=0x12 0x34)
- 关键差异:
- ID (11位):
110 0110 0110→ 十六进制0x666(有效范围0x000 - 0x7FF)。 - DLC (4位):
0(1)010→ 长度2字节(解析时移除连续5个0触发的填充位1)。 - 数据段 (2字节):
- 字节1:
0001 0010→0x12 - 字节2:
0011 0100→0x34
- 字节1:
- ID (11位):
- 核心演示点: 数据段长度可变性(DLC=2时数据段为16位)。
实例3:扩展数据帧(ID=0x0789ABCD, DLC=1, Data=0x56)
- 波形特征:
- 仲裁段:
- Base ID (11位): 标准部分ID。
- SRR位: 隐性1(替代RTR位)。
- IDE位: 隐性1(标识扩展格式)。
- Extended ID (18位): 扩展部分ID,与Base ID组合成完整29位ID
0x0789ABCD(因为ID是29位的,并不是4的整数倍,所以扩展ID号的范围0x0000 0000 - 0x1FFF FFFF)。 - RTR位: 显性0(数据帧)。
- 控制段:
- r0位: 显性0(保留位)。
- DLC (4位):
00(1)01→ 长度1字节。
- 数据段 (1字节):
0101 0110→0x56。 - 后续字段: CRC段、CRC界定符、ACK段、EOF格式与标准数据帧一致。
- 仲裁段:
- 注意: 29位ID范围上限为
0x1FFFFFFF,无法表示0x6789ABCD(需确保ID值有效)。本实例ID0x0789ABCD在有效范围内。
实例4:标准遥控帧(ID=0x088, DLC=1)
- 波形特征:
- 仲裁段:
- ID (11位):
000 1000 1000→ 十六进制0x088(有效范围0x000 - 0x7FF)。 - RTR位: 隐性1(标识遥控帧)。
- ID (11位):
- 控制段:
- IDE位: 显性0(标准格式)。
- r0位: 显性0(保留位)。
- DLC (4位):
000(1)1→ 表示请求数据的预期长度为1字节(遥控帧无有效载荷),(1)标识位填充。
- 数据段: 不存在。
- CRC段: 包含位填充特例
- 仲裁段:
- 核心演示点:
- 遥控帧通过RTR=1标识。
- DLC在遥控帧中指示期望响应的数据长度(本例为1字节)。
- 位填充的二次插入机制在实际波形中的体现。
三.位同步
接收方数据采样

挂载在CAN总线上的所有设备,初始都默认为接收方。当某一设备需要广播数据时,它会主动转变为发送方,通过驱动总线电平(拉低或释放) 来产生特定的波形。该波形的编码规则遵循第二章定义的帧格式。
那么,当发送方产生波形后,所有接收方如何准确地采样并判断每个数据位是‘1’还是‘0’呢?这正是本章要探讨的核心问题。
首先需要明确的是,CAN总线没有专用的时钟线。 总线上所有设备必须预先约定并严格保持相同的波特率(数据传输速率),以此确定每个数据位的位时长。例如,若波特率设定为 1 Mbps,则所有设备都认为一个数据位的时长固定为 1 微秒。
基于此约定:
- 发送方会按照约定的位时长,在固定时间间隔输出每个数据位。
- 接收方同样按照约定的位时长,在固定时间间隔采样总线电平,从而读取数据位。
关键要求:
- 速率一致性: 所有设备在整个通信过程中必须保持完全一致的传输速率。
- 持续传输: 波形传输必须连续,中途不能有任何停顿。传输一旦开始,必须完成整个帧。
理想采样状态:
在理想情况下,接收方能精确地在每个数据位的中心点附近(如下图所示红线位置)进行采样。此时总线电平状态稳定,接收方可以准确地读取到发送方发出的每一位数据。
实际采样点调整:
- 采样点并非必须位于数据位的绝对正中心(如示意图所示)。CAN总线允许配置采样点的具体位置。
- 实践中,通常会将采样点配置在数据位中心偏后的位置,甚至接近数据位结束的时刻。这是因为在数据位后期,信号电平通常更为稳定。
- 采样点的精确位置可以根据具体硬件特性和项目要求进行微调。
接收方数据采样遇到的问题

在实际应用中,接收方进行采样时会面临多种挑战。下面我们分析两个典型问题及其解决方案:
问题一:采样点初始位置未对齐
- 现象描述: 即使发送方和接收方约定相同的波特率(例如1 Mbps,位时长1 μs),接收方也按1 μs间隔采样,但采样点可能未对准数据位的中心区域。如图所示,采样点可能恰好落在数据位的跳变沿(边沿)附近。
- 后果: 在跳变沿附近采样,总线电平处于不稳定状态,导致无法可靠判断数据位是‘1’还是‘0’,甚至可能完全无法获取有效数据。
- 核心原因: 接收方采样时钟的初始相位未与发送方的数据位对齐。
- 解决方案: 利用总线上的第一个显性电平跳变沿(通常对应帧起始SOF) 作为时间基准。接收方检测到此跳变沿后,延迟约半个位时长(如0.5 μs)再进行第一次数据采样。后续采样则继续按照固定的位时长间隔进行。这样,采样点便被对齐到数据位的中心区域。
- 对应概念: 此解决方案的核心思想即为CAN协议中的硬同步(Hard Synchronization)。
问题二:时钟误差积累导致采样点逐渐漂移
- 现象描述: 初始采样点正确对齐(如通过硬同步)。然而,由于发送方与接收方的本地时钟存在微小误差(例如,发送方实际位时长1.0 μs,接收方采样间隔1.05 μs),采样点会随着数据位的累积而逐渐偏离预定位置(如逐渐向数据位边沿甚至外部漂移)。
- 后果: 初期采样可能正确,但随着漂移加剧,采样点最终会落入不稳定区域,导致后续数据位采样错误。
- 核心原因: 设备间微小的固有时钟频率偏差(非人为配置错误),在长数据帧(可达上百位)传输过程中产生累积效应。
- 解决方案: 在数据传输过程中,利用后续出现的正常数据位跳变沿作为参考点。当检测到采样点位置相对于最近的跳变沿发生了可察觉的偏移(提前或滞后)时:
- 若接收方采样偏慢(采样点滞后),则临时缩短下一次采样前的等待时间(采样间隔)。
- 若接收方采样偏快(采样点超前),则临时延长下一次采样前的等待时间(采样间隔)。
- 通过这种动态调整,将后续的采样点位置“拉回”到理想区域附近。
- 对应概念: 此解决方案的核心思想即为CAN协议中的再同步(Resynchronization)。
总结同步机制:
通过理解上述两个问题(初始对齐和漂移补偿)及其解决方案(硬同步和再同步),我们就掌握了CAN协议中确保接收方能准确采样每个数据位(即实现位同步) 的核心方法。
学习位时序(Bit Timing)
在深入探讨硬同步和再同步的具体实现规则之前,我们需要理解位时序的概念。如前所述,采样点位于一个数据位电平稳定期的某处(通常在两次跳变沿之间),并且其位置需要具备可调节性(前移或后移)以满足同步需求。为此,CAN协议将一个数据位的位时长进一步细分为多个更小的、可配置的时间段。这就是位时序结构。
3.1位时序

这就是所谓的位时序(Bit Timing)。其核心目的是灵活配置采样点的位置,使其能够精准地对准数据位电平稳定区域(通常为中心附近)。为此,CAN协议将一个数据位的位时长(Bit Time)进一步细分为四个段:
- 同步段(Synchronization Segment, SS):固定为 1 Tq。
- 传播时间段(Propagation Time Segment, PTS):可配置,范围为 1 到 8 Tq。
- 相位缓冲段1(Phase Buffer Segment 1, PBS1):可配置,范围为 1 到 8 Tq。
- 相位缓冲段2(Phase Buffer Segment 2, PBS2):范围为 1 到 8 Tq(通常建议最小值为 2 Tq)。
最小时间单位(Tq):
- Tq(Time Quantum)是构成这些段的最小时间单位。
- Tq 的绝对时长由用户在程序配置中设定(例如,设定 Tq = 0.5 μs)。
- 一个数据位的总时长(位时长)即为所有段 Tq 数之和乘以 Tq 时长。
位时序的作用与同步机制:
- 定义采样点位置: 采样点位于 PBS1 段结束的时刻(即 PBS1 与 PBS2 的交界处)。
- 同步基准: SS 段被设计为期望的总线电平跳变沿(边沿)出现的区域。
- 如果检测到的总线跳变沿正好落在 SS 段内,表明接收设备的位时序与发送波形同步。
- 如果检测到的跳变沿出现在 SS 段之外(例如在 PTS、PBS1 或 PBS2 段),则表明存在失步。此时,需要利用硬同步(针对帧起始 SOF 边沿)或再同步(针对帧内数据位边沿) 机制来调整接收设备的位时序(主要是调整内部计数器),将后续的跳变沿“拉回”到 SS 段内,从而恢复同步。
各段功能详解:
- 同步段(SS): 用于检测和实现同步。跳变沿落在此段内表示同步。
- 传播时间段(PTS):
- 目的: 补偿信号在物理网络上的传播延迟。
- 延迟来源: 包括发送单元输出延迟(信号从控制器驱动到总线的时间)、总线信号传播延迟(信号在电缆上传输的时间)和接收单元输入延迟(信号从总线进入接收器的时间)。
- 设计原则: PTS 的时长应设置为大于或等于上述所有延迟总和的两倍。这为信号在网络上传播并稳定提供了足够的时间裕量。
- 相位缓冲段1(PBS1)与相位缓冲段2(PBS2):
- 核心功能: 共同定义采样点的位置。
- 采样点位置: 采样点位于 PBS1 段的结束点(即 PBS1 与 PBS2 的交界处)。
- 调节采样点: 通过调整 PBS1 和 PBS2 的 Tq 数量,可以灵活地前移或后移采样点:
- 增加 PBS1 的 Tq 数(相对 PBS2)会使采样点后移。
- 增加 PBS2 的 Tq 数(相对 PBS1)会使采样点前移。
配置示例与采样点位置:
- 示例1:SS=1Tq, PTS=3Tq, PBS1=3Tq, PBS2=3Tq (总位时长=10Tq)。采样点在 PBS1 结束处(第 1+3+3 = 7Tq 处)。
- 示例2:SS=1Tq, PTS=2Tq, PBS1=3Tq, PBS2=4Tq。采样点在 PBS1 结束处(第 1+2+3=6Tq 处)。由于 PBS1 占比相对较小,采样点位置靠前。
- 示例3:SS=1Tq, PTS=4Tq, PBS1=3Tq, PBS2=2Tq。采样点在 PBS1 结束处(第 1+4+3=8Tq 处)。由于 PBS1 占比相对较大,采样点位置靠后。
配置建议:
- 实际项目: 通常遵循项目规范或所用 CAN 控制器/收发器推荐值。这确保了网络中所有节点配置兼容。
- 实验环境: 可以尝试不同的配置(特别是 PBS1/PBS2 的比例),观察对采样稳定性的影响。在信号质量良好且稳定的情况下,采样点位置的微小变化(靠前或靠后)影响可能不大。 但在有噪声或长距离网络中,优化采样点位置至关重要。
注意:此章的“秒表”即指接收机内部的位时间计数器
3.2 硬同步

硬同步(Hard Synchronization) - “初始对表”
- 核心问题: 接收方第一次采样点没对齐(易采到边沿)。
- 触发时刻: 仅当检测到帧起始(SOF)的显性跳变沿(如同发送方打响“发令枪”)。
- “秒表”机制详解:
- 每个CAN设备内部都有一个位时间计数器(想象成一个顺时针转动的秒表),转一圈(1个周期)就是一个数据位的时长(位时长)。
- 理想状态: 所有设备的“秒表”时刻同步(指针位置一致)。发送方在它“秒表”转到SS段时改变总线电平(开始新位),接收方在它“秒表”转到PBS1结束点(采样点)采样,就能正好采到数据位中间。
- 同步动作: 当接收方检测到SOF跳变沿(发送方在其SS段打响的“发令枪”)时:
- 它立即将自己的“秒表”指针强行拨回到SS段的起始位置(0点)。
- 因为发送方产生此跳变沿时,它的“秒表”必然正在SS段。
- 效果: 所有接收设备在SOF时刻完成“初始对表”,它们的“秒表”与发送方在SS段起点同步启动。
- 关键特点:
- 只发生在报文开头(SOF)。
- 解决的是起始相位对齐问题(“表”的初始位置)。
- 如果所有设备时钟绝对精准(“秒表”转速相同),一次硬同步后,后续采样点永远正确。
3.3 再同步

再同步(Resynchronization) - “途中微调”
- 核心问题: 设备间时钟有微小误差(“秒表”转速略有快慢)。即使初始对表完美,随着时间(位数)累积,接收方的“秒表”指针位置会逐渐偏离发送方,导致采样点漂移出错。
- 触发时刻: SOF之后,普通数据位的每一个跳变沿(如同途中设置的“检查点”)。
- “秒表”机制与SJW(调速旋钮限位器):
- 检测偏差: 接收方在每个数据位跳变沿(“检查点”)检查:这个沿应该出现在我“秒表”的SS段内。如果它出现在SS段之前(接收方“秒表”走慢了)或之后(接收方“秒表”走快了),说明累积了误差。
- SJW - 最大补偿量: SJW (Resynchronization Jump Width) 像“调速旋钮的限位器”,决定了单次最多能调整多少“秒表”刻度(1-4 Tq)。用户配置此值。
- 补偿动作(“拧旋钮调速”):
- 情况1:接收方“秒表”走快了(跳变沿出现在SS段之后):
- 在当前位,增加当前位相位缓冲段1(PBS1)的持续时间(相当于让当前位时间变长)。
- 效果: 后续采样点位置后移,向中心靠近。
- 情况2:接收方“秒表”走慢了(跳变沿出现在SS段之前):
- 在当前位,减少当前位相位缓冲段2(PBS2)的持续时间(相当于让当前位时间变短)。。
- 效果: 后续采样点位置前移,向中心靠近。
- 情况1:接收方“秒表”走快了(跳变沿出现在SS段之后):
- 补偿规则(“限位器起作用”):
- 实际误差值
e(Tq) <= SJW:补偿eTq(误差多少补多少)。 - 实际误差值
e(Tq) > SJW:只补偿 SJW Tq(最多拧到限位器位置)。
- 实际误差值
- SJW限制的目的(“防误调过度”):
- 防噪声干扰: 限制单次最大补偿量,防止总线上的短暂噪声毛刺(假“检查点”)导致接收方“秒表”剧烈错乱。
- 适应合理误差: 时钟误差本身很小,SJW 提供安全、渐进的补偿范围。
- SJW 配置建议:
- “秒表”准(时钟精度高):SJW 小点(1-2 Tq,拧得少)。
- “秒表”不太准(时钟精度低):SJW 大点(3-4 Tq,能多拧点)。
- 权衡: SJW 太小补偿不够;SJW 设置过大可能使接收机对总线上的噪声毛刺(虚假边沿)过于敏感,导致不必要的或过度的同步调整,反而破坏稳定性。。
3.4 波特率

波特率(Bit Rate)计算
- 定义: 数据传输速率,单位为 比特每秒(bps)。在CAN总线(二进制NRZ编码)中,波特率(Baud Rate)等同于比特率(Bit Rate)。
- 公式:
波特率 (bps) = 1 / 位时长 (秒) - 位时长(Bit Time)计算:
位时长 = (SS_Tq + PTS_Tq + PBS1_Tq + PBS2_Tq) * TqSS_Tq= 同步段长度(固定 1 Tq)PTS_Tq= 传播时间段长度(1-8 Tq)PBS1_Tq= 相位缓冲段1长度(1-8 Tq)PBS2_Tq= 相位缓冲段2长度(2-8 Tq)Tq= 时间量子的绝对时长(秒),由用户配置(如 0.5 μs)。
- 示例计算:
- 配置: SS=1 Tq, PTS=3 Tq, PBS1=3 Tq, PBS2=3 Tq, Tq=0.5 μs
- 位时长 = (1 + 3 + 3 + 3) * 0.5 μs = 10 * 0.5 μs = 5.0 μs
- 波特率 = 1 / 5.0 μs = 1 / (5.0 * 10⁻⁶ s) = 200,000 bps = 200 kbps
- 反推配置:
若目标波特率为 125 kbps (位时长 = 8 μs),需选择Tq和各段Tq数,使(SS_Tq + PTS_Tq + PBS1_Tq + PBS2_Tq) * Tq = 8 μs。配置方案不唯一(例如 Tq=1 μs, 总 Tq 数=8;或 Tq=0.5 μs, 总 Tq 数=16 等),需满足各段长度范围约束。
四.仲裁
接下来,我们将进入本课程的第四章,主题是总线的资源分配规则。通过前几章的学习,我们已经掌握了在总线上实现完整数据收发流程的方法。然而,相信大家也注意到当前设计存在一个关键问题:当多个设备同时需要发送数据时,如何分配总线资源? 解决这一冲突问题,正是本章的核心学习目标。
4.1 多设备同时发送遇到的问题

问题根源在于:总线通常只有一对差分信号线,同一时刻仅允许一个设备作为发送方操作总线。那么,当多个设备同时产生发送需求时,应如何协调资源分配?请看图示说明:
假设设备A需要发送一个数据帧,它尝试占用总线并开始驱动信号线,从而在总线上产生图示的上方波形(例如:拉低电平开始传输)。这个发送过程需要持续一段时间。
关键冲突场景:如果在此期间(例如图中所示时间点),设备B也试图发送数据(即驱动总线产生图示的下方波形),且该行为未被约束,将会发生什么?
此时,总线上的实际信号将是两个设备驱动波形的“线与”(Wire-AND)叠加结果。根据线与逻辑的特性:
- 只要任意一个设备拉低总线(显性状态,通常代表逻辑0),总线即呈现显性状态。
- 只有当所有设备都释放总线(输出高阻态,不驱动)时,总线才呈现隐性状态(通常代表逻辑1)。
因此,在设备A和设备B同时驱动的情况下,叠加后的波形必然与任一设备的预期波形都不符,导致双方的数据帧均被破坏,无法成功发送。
接下来,我们将学习解决资源冲突的思路:制定资源分配规则,依次满足多个设备的发送需求,确保同一时刻只有一个设备操作总线。本章的核心就是CAN总线的资源分配规则。
该规则包含两部分:1. 先占先得规则 和 2. 非破坏性仲裁规则。它们分别对应资源冲突的两种典型场景:
- 第一种冲突场景(图示情况):一个设备发送波形的中途,另一个设备想要开始新的发送。即一个设备已是发送方且波形已发送一部分时,另一个设备能否“半路抢占”?这种情况相对简单,直接禁止抢占即可。
- 第二种冲突场景(复杂):两个(或多个)设备的波形起始位置对齐,即它们在同一时刻都想要开始发送波形。此时无法用“先来后到”判定顺序,处理难度较大。但CAN总线设计了一种巧妙的规则——非破坏性仲裁来解决此问题。该规则能让同时发起请求的设备决出胜负,且不影响获胜设备的正常数据传输。具体设计稍后分析。
4.2 资源分配规则1 - 先占先得

资源分配规则一(先占先得) 解决上述第一种冲突场景,规则如下:
- 若当前已有设备正在操作总线发送数据帧或遥控帧,则其他任何设备不得同时发送数据帧或遥控帧。 因此,一旦一个设备开始传输波形,后续设备再急迫也不能中途打断。类比STM32中断优先级,CAN总线只有“响应优先级”(非破坏性仲裁处理同时到来),没有“抢占优先级”(不允许中途打断)。因为中途抢占必然导致“线与”叠加,双方数据损坏(两败俱伤)。
- 特例:其他设备可以发送错误帧或过载帧来主动破坏当前数据。这两种帧本身就是用于破坏数据的。
- 设备如何判断当前是否有设备在发送?靠以下规则:
- 任何设备检测到连续11个隐性电平,即认为总线空闲。只有在总线空闲时,设备才能开始发送数据帧或遥控帧。 设备会“自知之明”,总线空闲才尝试发送;总线不空闲(即有设备正在发送),则不去打扰。
- 一旦有设备开始发送数据帧或遥控帧,总线即处于活跃状态,必然不会出现连续11个隐性电平。 其他设备检测到总线不空闲,就无法开始新发送。同时,由于发送的波形会进行位填充,总线波形不可能出现连续5个以上相同数据位,更不可能出现连续11个隐性电平。因此,其他设备自然也不会破坏当前发送。
- 此设计也揭示了位填充的第三个重要作用:保持CAN总线在发送正常数据流时的活跃状态,防止被误判为总线空闲。若无位填充,当数据段发送8个
0xFF(全隐性位)时,总线上将出现连续64位隐性电平,易导致其他设备误判总线状态。
- 此设计也揭示了位填充的第三个重要作用:保持CAN总线在发送正常数据流时的活跃状态,防止被误判为总线空闲。若无位填充,当数据段发送8个
规则应用图示:设备A正发送波形,中途时刻设备B也想发送。但B检测到总线非空闲(前11位非全隐性),故无法立即发送,必须等待。B需等待A的帧结束(ACK界定符1隐性位 + EOF 7隐性位 + 帧间间隔至少3隐性位,共至少11隐性位),直至检测到总线空闲。此时,B才会尝试发送其波形。
为何是“尝试”发送? 因为等待A结束的设备可能不止B(如还有C、D)。当A结束总线空闲时,B、C、D会同时尝试发送。对于这些同时到来的设备,规则一(先占先得)无法判定顺序(因它们“同时”开始)。此时,就需要资源分配规则二(非破坏性仲裁) 来裁决。
4.3 资源分配规则2 - 非破坏性仲裁

非破坏性仲裁规则(核心):
- 若多个设备的发送需求同时到来(或通过等待而同时到来),则CAN总线协议将依据其仲裁段(ID号 + RTR位)进行非破坏性仲裁。ID号(含RTR)小的设备优先级高,赢得总线控制权;ID号大的设备优先级低,仲裁失利,将转入接收状态,等待下一次总线空闲时再尝试发送。
- 执行仲裁的前提:多个设备同时尝试开始发送波形(即波形起始对齐)。时间片重叠(中途打断)由规则一处理,不属于仲裁范畴。
- “同时”的两种情况:
- 真正同时到来:总线原空闲,多个设备恰巧同时发起发送请求。
- 因等待而同时到来:设备A占用总线期间,设备B、C、D陆续有发送需求并等待;A结束总线空闲时,B、C、D同时开始尝试发送。这种情况更普遍。若总线繁忙设备多,仲裁会频繁发生。
- 仲裁依据:仲裁段(主要是ID号,还包括RTR位)。ID号(含RTR)小的优先级高。因此,重要消息通常分配小ID号以保证优先发送;非重要消息分配大ID号,冲突时需等待。
仲裁如何执行?
实现非破坏性仲裁依赖两个关键硬件特性:
- 线与特性:
- 总线上任一设备发送显性电平(0),总线即呈现显性(0)。
- 只有所有设备都发送隐性电平(1),总线才呈现隐性(1)。
- 逻辑表达:
0 AND X = 0(X为任意值);1 AND 1 AND ... = 1。 - 此特性源于硬件设计(拉低总线为显性0,释放为隐性1,总线默认上拉至1)。
- 回读机制:
- 每个设备发送一位数据后,必须读回总线当前电平状态。
- 目的:确认自身发送的电平是否真实呈现在总线上。
- 关键现象:发送
1(隐性)但读回0(显性),说明总线上有其他设备在发送0(显性),自身数据被“覆盖”。这对仲裁至关重要。
非破坏性仲裁过程详解:
- 规则:仲裁段数据位从前到后逐位比较。首次出现差异的位,发送
1(隐性)的设备仲裁失利。 - 过程(以两设备单元1、单元2为例):
- 两者同时开始发送,起始帧(SOF)均为显性
0-> 总线显性0-> 双方读回0(匹配)-> 继续发送。 - 发送ID高位,双方均发
0-> 总线显性0-> 双方读回0(匹配)-> 继续发送。 - 发送ID某位,双方均发
1-> 总线隐性1-> 双方读回1(匹配)-> 继续发送。 - 发送ID某位,单元1发
1(隐性),单元2发0(显性):- 总线呈现显性
0(线与特性)。 - 单元2读回
0(匹配自身发送)-> 继续发送。 - 单元1读回
0(与自身发送的1不匹配) -> 单元1感知冲突(有其他设备发送0),仲裁失利 -> 单元1主动停止发送,转为接收状态。
- 总线呈现显性
- 单元2(胜利者)继续发送后续位,每次发送后读回总线状态,若匹配则继续。
- 两者同时开始发送,起始帧(SOF)均为显性
- 为何单元1失利?
- 其数据已被破坏(发送
1但总线是0),继续发送无意义。 - 它通过回读感知到冲突并主动退出。
- 单元2未感知冲突(发送与读回始终匹配),故继续发送。
- 其数据已被破坏(发送
- 多设备仲裁:原理相同。所有设备逐位发送并回读。一旦某位发送
1但读回0,该设备即失利退出。最终必然只剩一个胜出者完成仲裁段,后续发送无冲突。 - 为何ID号小的优先级高? ID号越小,其二进制中
1(隐性)出现的位置越靠后。仲裁规则是“首次差异位发1者失利”。因此,ID号中1出现得越早,越容易在差异位发送1而失利(优先级低);1出现得越晚,越晚失利(优先级高)。极端例子:全0ID(总是发显性)冲突时必赢;全1ID(总是发隐性)冲突时必输。 - 位填充是否影响仲裁? 会。位填充作用于帧起始、仲裁场、控制场、数据场、CRC序列,故仲裁场内也执行位填充。但填充位不会改变原始ID号的优先级排序。原因在于:若填充可能改变A、B优先级,则A、B在填充位前的原始位必须相同;而原始位相同时,A、B需填充的位置和值也相同,故填充位本身不会引入差异或改变相对优先级。
- 为何称“非破坏性”? 对仲裁胜出者而言,其发送过程未被中断或破坏(因它全程未感知冲突,发送/读回始终匹配)。对失利者,它们伴随胜出者发送直至首次出现差异且自身发
1的位才退出,且退出是主动静默的,未破坏胜出者已成功发送的位。最终只有胜出者完整走出仲裁段。
接下来,我们再看两个细节问题:数据帧与远程帧的优先级,以及标准格式与扩展格式的优先级。
4.4 数据帧与远程帧的优先级 & 标准格式与扩展格式的优先级

- 数据帧与远程帧的优先级
- 结论:当数据帧与远程帧的ID号完全相同时,数据帧的优先级高于远程帧。
- 强调:此规则仅适用于ID号相同的情况。若ID号不同,则直接按ID号大小决定优先级。
- 仲裁场景:相同ID号的数据帧和远程帧可能发生仲裁。例如:
- 设备A发出一个远程帧,请求某个ID号的数据。
- 同时,设备B正好要发出该相同ID号的数据帧。
- 此时,两者ID相同但帧类型不同,需进行仲裁。
- 注:相同ID号的两个数据帧或两个远程帧不允许同时出现,因其仲裁段完全相同,无法仲裁。
- 仲裁过程(图示):
- 单元一(发远程帧)与单元二(发数据帧)ID号完全相同。
- 两者逐位发送ID段(11位),每次回读总线状态均与自身发送位匹配,故无法分出胜负。
- 仲裁段最后一位是RTR位:远程帧RTR定义为
1(隐性),数据帧RTR定义为0(显性)。 - 在此位:单元一发
1(隐性),单元二发0(显性)-> 总线呈现0(显性)。 - 单元一发
1但读回0-> 感知冲突 -> 仲裁失利 -> 转入接收状态。 - 单元二发
0读回0(匹配)-> 继续发送剩余帧。
- 结论验证:因RTR位定义(数据帧显性
0> 远程帧隐性1),故ID相同时数据帧优先级更高。 - 合理性:符合常识——当设备请求数据(远程帧)而该数据已产生(数据帧)时,应让数据帧优先发送。
- 结论:当数据帧与远程帧的ID号完全相同时,数据帧的优先级高于远程帧。

- 标准格式与扩展格式的优先级
- 结论:当标准格式帧(11位ID)与扩展格式帧(29位ID)的高11位ID完全相同时,标准格式帧的优先级高于扩展格式帧。
- 关键前提:扩展帧的**SRR位(替代远程请求位)必须始终为
1(隐性)**以保证此规则。 - 强调:若高11位ID不同,则在此段即可分出胜负。
- 关键前提:扩展帧的**SRR位(替代远程请求位)必须始终为
- 仲裁过程(标准数据帧 vs 扩展数据帧,图示):
- 单元一(发扩展数据帧)与单元二(发标准数据帧)的高11位ID完全相同。
- 两者逐位发送高11位ID段,每次回读均匹配,无法分出胜负。
- 下一位:单元一(扩展帧)发送SRR位(固定为
1,隐性),单元二(标准帧)发送RTR位(数据帧为0,显性)。 - 在此位:单元一发
1(隐性),单元二发0(显性)-> 总线呈现0(显性)。 - 单元一发
1但读回0-> 仲裁失利 -> 转入接收状态。 - 单元二继续发送。
- 结论验证:因SRR固定为
1(隐性)而标准帧RTR为0(显性),故高11位ID相同时标准帧优先级更高。 - 复杂边界案例(标准远程帧 vs 扩展数据帧):
- 假设:高11位ID相同。
- 标准帧是远程帧(RTR=
1),扩展帧是数据帧。 - 高11位ID段:相同,无法分出胜负。
- 下一位(标准帧RTR位 vs 扩展帧SRR位):
- 标准远程帧RTR=
1(隐性)。 - 扩展数据帧SRR=
1(隐性)。 - 两者均发
1-> 总线1-> 双方读回匹配 -> 仍无法分出胜负。
- 标准远程帧RTR=
- 再下一位(标准帧IDE位 vs 扩展帧IDE位):
- 标准帧(无论类型)IDE位=
0(显性,表示标准帧)。 - 扩展帧IDE位=
1(隐性,表示扩展帧)。 - 标准帧发
0(显性),扩展帧发1(隐性)-> 总线0(显性)。 - 扩展帧发
1但读回0-> 仲裁失利 -> 转入接收状态。 - 标准帧继续发送。
- 标准帧(无论类型)IDE位=
- 分析:此案例非常“惊险”,仲裁过程一直持续到标准帧的IDE位才决出胜负(标准帧胜出)。虽然标准帧的仲裁段(到RTR位)已结束,但扩展帧的仲裁段(包含IDE位)仍在进行,故不会出错。
- 结论:当标准格式帧(11位ID)与扩展格式帧(29位ID)的高11位ID完全相同时,标准格式帧的优先级高于扩展格式帧。
总结:扩展格式的引入确实增加了CAN协议的复杂性,使理解难度上升。但幸运的是,整个仲裁机制设计逻辑闭环,运行时不会产生意外错误。
至此,第四章 CAN总线的资源分配规则与仲裁机制内容全部结束。CAN总线的基础知识也即将完成,下一章我们将讲解CAN总线的错误处理机制。
五.错误处理
接下来,我们进入本课程的第五章,主题是CAN总线的错误处理机制。错误处理机制是CAN总线额外的安全保障机制,其核心目的是:当某个设备检测到总线上的帧传输出错时,能够主动发出错误帧通知所有设备,使大家丢弃错误帧,避免受到错误数据的影响。
注:即使没有错误处理设计,CAN总线在理想条件下也能完成数据收发。但在实际工业环境中(尤其是干扰强的场合),数据位传输随时可能出错。因此,设计完善的错误处理机制对于保障系统可靠性至关重要。本章将探讨CAN总线如何应对各种错误情况。
5.1错误类型

CAN总线定义了五种错误类型:
-
位错误 (Bit Error):
- 定义:比较设备输出的电平与总线实际电平(不含填充位),当两者不一致时检测到的错误。
- 原理:源于回读机制。设备发送一位数据后,会采样读回总线上的实际电平,并与自身发送的电平进行对比。
- 一致:发送成功。
- 不一致:发生位错误。
- 特例排除:
- 仲裁段:发送
1(隐性)但读回0(显性)视为仲裁失利,不是位错误。 - ACK槽:发送方(发隐性
1)读回显性0视为有效应答,不是位错误。
- 仲裁段:发送
- 检测范围:数据帧、远程帧、错误帧、过载帧的所有位(基本覆盖所有帧类型的所有位置)。
- 检测单元:发送单元(主要)和接收单元(仅在驱动总线时检测,如发送ACK、错误帧等)。
-
填充错误 (Stuff Error):
- 定义:在需要执行位填充的段内(SOF到CRC序列),连续检测到6个相同电平时检测到的错误。
- 原理:正常位填充机制下,波形不可能出现连续5个以上相同电平。出现连续6个相同电平,表明位填充机制失效或数据被破坏。
- 检测范围:数据帧和远程帧的SOF(起始帧)、仲裁场、控制场、数据场、CRC序列。
- 排除:CRC界定符、ACK槽、ACK界定符、EOF(固定格式位,不进行位填充)。
- 检测单元:发送单元和接收单元。
-
CRC错误 (CRC Error):
- 定义:接收单元根据接收到的数据(SOF到数据段)计算出的CRC值,与接收到的CRC序列不同时检测到的错误。
- 原理:发送方根据帧内容计算CRC校验码并发送。接收方重新计算CRC,若计算结果与收到的CRC序列不匹配,则表明数据传输过程中发生错误。
- 检测范围:数据帧和远程帧的CRC序列。
- 检测单元:接收单元。
-
格式错误 (Form Error):
- 定义:检测到固定格式的位段出现相反电平时检测到的错误。
- 固定格式位段示例:
- 数据帧/远程帧的:CRC界定符(固定隐性
1)、ACK界定符(固定隐性1)、EOF(固定7个隐性1)。 - 错误帧/过载帧的:界定符(固定隐性
1)。
- 数据帧/远程帧的:CRC界定符(固定隐性
- 原理:这些位置的电平值在协议中是强制规定的。检测到非规定电平,表明帧结构被破坏。
- 检测范围:上述固定格式位段。
- 检测单元:接收单元。
-
ACK错误 (ACK Error / Acknowledgment Error):
- 定义:发送单元在ACK槽中检测到隐性电平(
1) 时检测到的错误。 - 原理:发送方在ACK槽释放总线(输出隐性
1)。至少应有一个有效接收方在该槽位拉低总线(输出显性0)作为应答。发送方读回0表示成功;读回1表示无接收方应答。 - 检测范围:ACK槽。
- 检测单元:发送单元。
- 定义:发送单元在ACK槽中检测到隐性电平(
错误检测与通知流程:
- 当发送单元或接收单元检测到上述五种错误之一时,会立即主动发出错误帧,破坏当前正在传输的帧。
- 发出错误帧的行为称为错误通知。其核心思想是:“无论其他设备是否检测到该错误,我检测到了,必须立即终止并废弃当前帧”。
- 错误帧产生后,当前帧传输终止并被丢弃。总线在错误帧结束后回归空闲状态,设备可重新开始新的传输。
错误处理机制的意义:
- 使每个CAN设备都成为“检察官”,形成分布式监控。
- 一旦错误发生,一个或多个设备会通过错误帧快速通知全网。
- 即使某些设备未检测到原始错误,收到错误帧后也能得知传输失败并丢弃错误数据,避免错误数据被使用。
潜在风险与应对:
- 错误通知机制赋予了每个设备破坏数据传输的能力。若某个设备自身故障(如持续误判错误),可能不断发出错误帧干扰正常通信。
- 为防止此类问题,CAN协议引入了错误状态机制(Error States)。该机制根据设备的错误计数将其置于不同状态(主动错误状态、被动错误状态、总线关闭状态),限制其发送错误帧的频率和能力,从而保护总线不被单一故障设备完全阻塞。
5.2 错误状态
在学习错误状态机制前,我们先简要回顾错误帧、过载帧和帧间隔的格式(后续内容会用到):
-
错误帧 (Error Frame):
- 由6位错误标志 + 8位错误界定符组成。
- 错误标志分为两种:
- 主动错误标志 (Active Error Flag):6个连续的显性位 (
0)。根据线与特性,它会强制拉低总线,破坏当前正在传输的任何帧。 - 被动错误标志 (Passive Error Flag):6个连续的隐性位 (
1)。它释放总线,不会干扰当前正在传输的帧(因为发隐性1即不驱动总线)。
- 主动错误标志 (Active Error Flag):6个连续的显性位 (
- 错误界定符 (Error Delimiter):固定为8个连续的隐性位 (
1),标志错误帧结束。
-
过载帧 (Overload Frame):
- 结构与错误帧类似。
- 过载标志 (Overload Flag):6个连续的显性位 (
0)(仅一种形式)。 - 过载界定符 (Overload Delimiter):固定为8个连续的隐性位 (
1)。
-
帧间隔 (Interframe Space - IFS):
- 位于连续发送的数据帧或远程帧之间,用于分隔。
- 主动错误状态设备:帧间隔为3个隐性位 (
1)。 - 被动错误状态设备:帧间隔为3个隐性位 (
1) + 8个隐性位 (1) 的延迟传送段 (Suspend Transmission)。
错误状态机制:
CAN总线定义了三种错误状态,用于管理设备的可靠性并限制其破坏能力:
-
主动错误状态 (Error Active State):
- 初始状态:所有设备初始均处于此状态。
- 行为:设备正常参与通信。检测到错误时,发出主动错误标志(6显性
0),能有效破坏当前帧。 - 权限:具有完全的错误通知能力(破坏性强)。
-
被动错误状态 (Error Passive State):
- 行为:设备仍能正常参与通信(发送和接收)。检测到错误时,只能发出被动错误标志(6隐性
1),不能破坏当前帧(仅“报告”错误)。 - 权限:错误通知能力受限(破坏性弱)。
- 意义:表示该设备可靠性较低(频繁报告错误),收回其破坏数据的权利。
- 行为:设备仍能正常参与通信(发送和接收)。检测到错误时,只能发出被动错误标志(6隐性
-
总线关闭状态 (Bus Off State):
- 行为:设备完全不能参与通信(既不能发送,也不能接收或应答)。
- 意义:让严重故障设备**“冷静”并退出总线**,防止其持续干扰。
状态评定标准与转移规则:
每个设备内部维护两个错误计数器:
- TEC (Transmit Error Counter) - 发送错误计数器:
- 设备在发送时每检测到一个错误,TEC 增加。
- 设备成功完成一次发送(无错误直到ACK槽结束),TEC 减小。
- REC (Receive Error Counter) - 接收错误计数器:
- 设备在接收时每检测到一个错误,REC 增加。
- 设备成功完成一次接收(接收到有效帧直到EOF结束),REC 减小。
状态转移依据计数器值:
- 主动错误状态 → 被动错误状态:
- 当 TEC > 127 或 REC > 127 时转移。
- 原因:设备(发送或接收)错误报告过于频繁,相对正常传输次数太多,可靠性降低。
- 被动错误状态 → 主动错误状态:
- 当 TEC ≤ 127 且 REC ≤ 127 时转移。
- 原因:设备经过多次成功传输,错误计数器降低,可靠性恢复。
- 被动错误状态 → 总线关闭状态:
- 当 TEC > 255 时转移。
- 原因:设备在被动状态(已不太可靠)仍持续在发送中报告大量错误,表明其发送功能可能严重故障。
- 注:仅 TEC > 255 触发此转移,REC值不影响。因为接收问题(高REC)但不发送,对总线干扰较小。
- 总线关闭状态 → 主动错误状态:
- 恢复条件:设备检测到总线上出现 128次 连续11位隐性位 (
1)(即感知到128次“总线空闲”信号)。 - 结果:设备 TEC 和 REC 清零,满血复活回到主动错误状态。
- 设计考虑:虽然故障设备可能继续干扰,但考虑到其数据可能重要,给予其 “冷静期” 后重新接入的机会。如果仍故障,将再次进入错误状态循环。
- 恢复条件:设备检测到总线上出现 128次 连续11位隐性位 (
5.3 错误计数器

TEC (发送错误计数器) 和 REC (接收错误计数器) 增减规则详解:
-
接收单元检测到错误时:
- REC + 1 (视为小错误)。
-
接收单元在发送完错误标志后,检测到的第一个位为显性电平时:
- REC + 8 (视为大错误)。 (此规则基于实践考虑的特殊情况)。
-
发送单元在输出错误标志时:
- TEC + 8 (视为大错误)。
-
发送单元或接收单元在发送主动错误标志或过载标志时,检测到位错误:
- TEC + 8 (发送单元) 或 REC + 8 (接收单元)。
- 原因:设备在发送错误通知(错误帧/过载帧)本身时又出错,表明其可靠性极低。
-
发送单元或接收单元在特定边界情况下检测到错误 (实践中考虑的特殊情况):
- 发送时检测到错误:TEC + 8。
- 接收时检测到错误:REC + 8。
总结增加规则:除接收单元检测到普通错误 (规则1) REC仅加1外,其他所有检测到的错误均导致TEC或REC直接加8。因此,错误计数器的容错能力相当有限。
-
发送单元成功完成一次正常发送(直到ACK槽结束)时:
- TEC - 1 (减到0后不再减少)。
- 设计特点:一次错误 (通常加8) 需要八次成功发送才能抵消。这促使设备谨慎报告错误。
-
接收单元成功完成一次正常接收(直到EOF结束)时:
- 若 1 ≤ REC ≤ 127,则 REC - 1。
- 若 REC > 127,则 REC 直接减至 127。
- 若 REC = 0,则不再减少。
- 设计特点:
- 对接收错误相对宽容 (REC > 127 时成功接收一次即降至127)。
- 若设备因 REC > 127 进入被动错误状态,则 成功接收一次即可满足 REC ≤ 127 条件,使其立刻恢复为主动错误状态 (需同时满足 TEC ≤ 127)。
-
处于总线关闭状态的设备,检测到128次连续11位隐性电平(即128次总线空闲)时:
- TEC = 0, REC = 0。
- 设备直接恢复到主动错误状态。
5.4 波形示例
错误帧波形实例分析 (以ACK错误为例):
-
正常传输波形 (主动错误状态,有ACK应答):

- 波形特征:符合标准帧格式,ACK槽位呈现显性电平(
0)(接收方应答)。 - 结束标志:7位EOF隐性电平(
1) + 3位帧间隔隐性电平(1)。 - 总线空闲判定:ACK界定符(
1) + EOF(1x7) + 帧间隔(1x3) = 连续11位隐性电平 -> 总线空闲,下一帧可开始。
- 波形特征:符合标准帧格式,ACK槽位呈现显性电平(
-
ACK错误波形 (主动错误状态):

- 产生条件:总线仅挂接一个设备(发送方无接收方应答)。
- 错误点:在ACK槽位,发送方释放总线(期望显性
0应答),但总线呈现隐性电平(1)(无应答)。 - 错误响应:发送方(主动错误状态)在ACK槽的下一位立即输出主动错误标志 (6个连续显性位
000000)。 - 后续:错误标志后跟8位错误界定符 (隐性
1) + 3位帧间隔 (隐性1)。 - 波形特征:连续6个显性
0是错误帧的明显标志。正常数据流不会出现连续6个相同位。 - 总线空闲判定:错误界定符(
1x8) + 帧间隔(1x3) = 连续11位隐性电平 -> 总线空闲。 - EOF设计思考:为何EOF需7位隐性电平?可能为错误标志叠加预留空间,避免错误帧未及处理数据帧已结束。
-
ACK错误波形 (被动错误状态):

- 状态转移:设备初始为主动状态。连续16次发送均无应答(ACK错误) -> 每次错误导致 TEC+8 -> 16次后 TEC=128 -> 转入被动错误状态。
- 错误响应:检测到ACK错误后,发送被动错误标志 (6个连续隐性位
111111)。 - 帧间隔差异:被动错误状态设备需在3位帧间隔 (隐性
1) 后,额外增加 8位延迟传送 (隐性1),之后才能开始下一帧。 - 影响:被动状态设备发起传输延迟。若主动状态设备同时检测到总线空闲,将直接抢占总线(被动设备因延迟无法参与仲裁)。
点击链接学习下一章🐱🚀:【江科大CAN】STM32 CAN外设
更多推荐



所有评论(0)