乐于分享
好东西不私藏

汽车软件行业——总线协议都吃不透,职业瓶颈会来得比你想得快

汽车软件行业——总线协议都吃不透,职业瓶颈会来得比你想得快

还没真正搞懂CAN帧结构?调试时总被错误帧绊住?来看看汽车电子工程师的必背知识点——CAN总线:帧、仲裁、错误与位时序

一、先理解地基:CAN物理层与基本通信规则

在背复杂的协议之前,我们先建立两个最底层的物理概念。它们会贯穿后面所有帧结构和错误处理的理解。

1. 总线的两种逻辑状态:显性与隐性

CAN总线采用差分信号进行传输,两根线分别叫 CAN_H 和 CAN_L。总线电平只有两种:显性电平 和 隐性电平。这两个词必须形成肌肉记忆:显性对应逻辑“0”,隐性对应逻辑“1”。为什么这么设计?因为总线执行的是“线与”逻辑。只要有一个节点输出显性,总线就呈现显性;只有所有节点都输出隐性,总线才呈隐性。所以,显性永远优先于隐性。这个优先级规则,是整个仲裁机制的铁律。

以高速CAN(ISO11898)为例,典型差分电压:显性时压差 约 2V,隐性时接近0V。低速容错CAN(ISO11519-2)电平不同,但也是基于显性/隐性逻辑。记住一个关键数据:高速CAN在1Mbit/s时总线最大长度40米,降低速度可以延长距离。这在系统布线时是重要的约束条件。

2. 多主控制与CSMA/CA

CAN协议是多主总线,没有任何一个节点是固定主机。总线空闲时,所有单元都可以主动发起通信。这是CAN获得高实时性和灵活性的基础。当多个节点同时开始发送时,CAN采用 CSMA/CA(载波侦听多路访问/冲突避免) 方式解决冲突,具体手法就是下一章要细讲的“非破坏性逐位仲裁”。ID越小(显性位越多)的报文优先级越高,这就是为什么动力系统报文的ID一般较小。

【必背知识点】
• 显性 = 逻辑0 = 优先;隐性 = 逻辑1。
• CAN是多主总线,基于ID仲裁优先级。
• 高速CAN(ISO11898):最高1Mbps,总线最长40m。

二、深入协议心脏:帧的种类与数据帧的7个段

CAN通信依靠5种类型的帧:数据帧、遥控帧、错误帧、过载帧、帧间隔。其中数据帧和遥控帧又分为标准格式(11位ID)和扩展格式(29位ID)。我们围绕最核心的数据帧展开,它的结构直接决定了报文如何被发送、仲裁、校验和确认。

2.1 数据帧的7个段——按位场拆开看

一个标准数据帧由以下部分顺序构成:

(1) 帧起始(SOF):1个显性位。它告诉全网“我要开始说话”。所有节点对这个显性位进行硬同步,内部位时间重新对齐。记住:SOF是唯一一个出现在每帧起始的显性位,总线空闲后第一个显性位会被所有节点识别为帧起始。

(2) 仲裁段:标准格式包含11位ID和RTR位。扩展格式包含29位ID(基本ID+扩展ID)、SRR位、IDE位和RTR位。ID是从高位往低位逐位发送。仲裁段逐位比较:发送节点每发出一个位就会回读总线电平,如果自己发的是隐性,回读到显性(说明有更高优先级的报文来了),则立即失去仲裁,自动转为接收方。这个逐位“掰手腕”的过程不会破坏任何数据。RTR位用于区分数据帧(显性)和遥控帧(隐性)。扩展帧的SRR位永远为隐性,IDE位在扩展帧中为隐性、标准帧中为显性,从而保证了标准帧在ID相同的情况下比扩展帧优先。

(3) 控制段:包含IDE位(仅标准格式)、保留位r0/r1和4位DLC(数据长度码)。DLC指示数据段的字节数,有效值0~8,对应关系需要背:DLC=0→0字节,DLC=1→1字节……DLC=8→8字节。9~15是不允许使用的,但接收方不会报错。

(4) 数据段:0~8个字节数据,MSB(最高位)先发送。这是实际传递的负载。

(5) CRC段:由15位CRC序列和1个隐性CRC界定符组成。CRC计算范围覆盖从帧起始到数据段结束的无填充位流,采用多项式 \( X^{15} + X^{14} + X^{10} + X^{8} + X^{7} + X^{4} + X^{3} + 1 \)。这是协议中最重要的错误检测手段,任何一位翻转都会导致接收方计算出的CRC值与序列不匹配,从而触发错误帧。

(6) ACK段:包含ACK槽和ACK界定符。发送节点在ACK段发出2个隐性位。正确收到报文的接收节点会在 ACK槽发出显性位覆盖隐性位,这就是“应答”。发送节点如果在ACK槽检测到显性,就知道至少有一个接收方成功接收。注意,只有接收方参与应答,发送方自己不应答。

(7) 帧结束:7个连续隐性位,标志此帧传输结束。之后可能有帧间隔或其他帧。

2.2 遥控帧与错误帧的要点

遥控帧:请求另一个节点发送数据的帧。其结构与数据帧几乎相同,区别在于:RTR位为隐性,没有数据段,DLC的内容表示请求的数据长度。当同一个ID的数据帧和遥控帧同时竞争时,数据帧因为RTR显性而获胜。

错误帧:检测到任何错误(位错误、填充错误、CRC错误、格式错误、ACK错误)的节点会发送错误帧来污染总线,让所有节点都知道出错了。错误帧由 错误标志(6个显性或隐性位)+ 错误界定符(8个隐性位) 组成。主动错误状态的节点发6个显性位作为主动错误标志,由于位填充规则被破坏,其他节点很容易检测到。错误帧发送后,原来发送帧的节点会自动启动重传,无需软件干预。

过载帧:接收节点需要延迟时发送,格式类似于错误帧(6显性+8隐性)。帧间隔用于分隔不同的帧,由3个隐性位的间歇场和总线空闲组成。如果前一帧的发送者是“错误被动”节点,其后还要插入8个隐性位的“延迟传送”。

2.3 位填充——为什么不能连续6个相同位?

从SOF到CRC序列(不含CRC界定符)之间,如果检测到5个连续的相同电平,发送器会自动插入一个相反的电平位作为填充位。接收方收到后会做相反操作去除填充位。这个机制的目的是提供足够的沿跳变,保证同步。如果在需要位填充的区域检测到第6个相同电平位,就会触发填充错误。错误帧和过载帧本身会故意违反填充规则来让大家识别。

【必背知识点】
• 数据帧7段顺序:SOF→仲裁→控制→数据→CRC→ACK→EOF。
• SOF = 1显性位;EOF = 7隐性位;ACK槽被接收器写显性。
• CRC多项式:\( X^{15}+X^{14}+X^{10}+X^{8}+X^{7}+X^{4}+X^{3}+1 \)。
• 位填充区域:SOF~CRC序列,遇5个连续相同位插入补码位。
• 标准格式11位ID,扩展格式29位ID;标准帧IDE=显性,扩展帧IDE=隐性。

三、错误管理机制:从检测到故障界定的闭环

CAN的高可靠性很大程度上来自其严密的错误检测与恢复体系。是面试和实际故障诊断的高频区。

3.1 五种错误类型

错误类型
检测条件
检测者
位错误
发送的位电平与监视到的总线电平不一致(仲裁段和ACK槽的特殊情况除外)。
发送节点(特定条件下接收节点也可检测)
填充错误
在位填充区域内,连续检测到6个相同电平位。
所有节点
CRC错误
接收方计算的CRC值与接收到的CRC序列不一致。
接收节点
格式错误
固定格式位场(如CRC界定符、ACK界定符、EOF)出现非法电平。
接收节点
应答错误
发送节点在ACK槽未检测到显性位。
发送节点

注意:多种错误可能同时发生。一旦检测到错误,节点就会在下一位或ACK界定符后开始发送错误标志(CRC错误稍有延迟)。

3.2 错误状态与计数器——故障界定的核心

每个CAN控制器内部都维护两个错误计数器:发送错误计数器(TEC)和接收错误计数器(REC)。根据它们的值,节点处于三种状态之一:

  • 主动错误状态
    (TEC ≤ 127 且 REC ≤ 127):正常参与通信,检测到错误时发送主动错误标志(6个显性位)。
  • 被动错误状态
    (TEC 或 REC 在128~255):仍可收/发报文,但发错误时只能用被动错误标志(6个隐性位),发送后还需在帧间隔中插入8个隐性的延迟传送,避免过度干扰总线。
  • 总线关闭状态
    (TEC ≥ 256):节点被彻底隔离,驱动器和接收器都不会对总线产生影响。

错误计数增减规则——需要重点记忆:

  • 接收方检测到错误(非位错误在错误标志期间)时,REC +1
  • 接收方在发送完错误标志后检测到的第一个位为显性时,REC +8
  • 发送方输出错误标志时,TEC +8
  • 发送方在主动错误标志或过载标志期间检测到位错误,TEC +8;接收方类似情况,REC +8
  • 检测到连续14个显性位(主动错误标志叠加等),之后每多8个连续显性位,相关计数器再+8。
  • 报文成功发送(获得应答且无错误),TEC -1(但不会小于0)。
  • 报文成功接收(直到ACK间隙无错误,且成功应答),若1≤REC≤127,REC -1;若REC=0则保持不变;若REC>127则将其设置为119~127之间的值。
  • 总线关闭的节点检测到总线上连续128次11个隐性位后,可以重新变回主动错误状态,同时TEC和REC清零。

【必背知识点】
• 主动错误标志:6显性位;被动错误标志:6隐性位;错误界定符:8隐性位。
• TEC ≥ 128或REC ≥ 128 → 进入被动错误状态。
• TEC ≥ 256 → 进入总线关闭状态,输出驱动器禁能。
• 成功发送一次:TEC -1;成功接收一次且1≤REC≤127:REC -1。
• 总线关闭恢复条件:检测到128次连续的“11个隐性位”序列。

3.3 位时序与同步——保证波特率和采样精度的关键

CAN的每一位时间被划分为4个可配置的段:同步段(SS)、传播时间段(PTS)、相位缓冲段1(PBS1)和相位缓冲段2(PBS2)。这些段由最小时间单位 时间份额(Tq) 构成。典型配置如1位=10Tq。采样点位于PBS1的末尾,是读取总线电平并决定位值的位置。正确设置采样点可以保证在信号最稳定时获取数据,通常设置在75%~80%的位置。

同步机制分为两种:

  • 硬同步:
    总线空闲后检测到第一个隐性到显性的跳变沿(即SOF),接收节点强制将自己的内部位时间从同步段重新开始。不依赖SJW。
  • 再同步:
    帧传输过程中遇到隐性到显性的沿时,可以通过 增长PBS1或缩短PBS2 来补偿相位误差。每次调整的最大幅度由 再同步跳转宽度(SJW) 限制,SJW一般设置为1~4Tq。

一个重要规则:一个位时间内只能进行一次同步调整,只有在上次采样点读到的值与跳变沿后的值不同时,该沿才能用于同步。同时,发送节点对自己发出的显性位引起的延迟沿不进行再同步,这防止了错误的正反馈。

所有节点的位时序必须配置为相同的波特率,采样点位置应尽量一致。利用位时序和同步,CAN可以在存在晶振误差(最高约1.58%容许偏差)的情况下保证所有节点正确采样。这就是为什么在125kbps以下甚至可以使用便宜的陶瓷振荡器。

【必背知识点】
• 一个位被分为 SS(1Tq) + PTS + PBS1 + PBS2,总Tq数可设为8~25。
• 采样点位于 PBS1 结束时刻。
• SJW 限制每次再同步的调整幅度(1~4Tq),用来补偿相位误差。
• 硬同步仅在SOF处发生,强力对齐;再同步利用后续隐性→显性跳变沿。


从物理层的显性隐性规则,到数据帧的7段结构,再到错误状态机与位时钟同步,CAN协议环环相扣。把这篇文章里的知识点吃透,配合几帧真实波形,你对车载总线的理解会上一个大台阶。碎片时间反复温习,下次排查通信故障,你一定是组里最通透的那一个。

加入群聊可获得

面试

资料

100+企业面试案例

学习

路线

汽车开发学习路线

学习

指导

多名10年+大厂经验

工程师在线指导

学习

交流

众多开发者一起交流

助力你提升技能

王老师的小程序👇👇点击即达!!!
扫码直接进入汽车嵌入式交流群