2、CAN总线基础回顾:物理层与数据链路层、帧格式(数据帧、远程帧、错误帧、过载帧)、位定时与同步

CAN(Controller Area Network)总线自20世纪80年代由Bosch公司提出以来,已成为汽车电子、工业控制、医疗设备等领域最主流的现场总线之一。要深入理解CAN总线的错误处理与重发机制,首先必须扎实掌握其物理层特性、数据链路层协议、四种帧格式以及位定时与同步原理。本章作为基础回顾,将系统梳理这些核心知识点,为后续章节中错误检测、故障界定与恢复策略的深入剖析奠定坚实的理论基础。

CAN总线基础架构与帧格式总览 物理层 • 双线差分:CAN_H / CAN_L • 显性电平:逻辑0(差分≈2V) • 隐性电平:逻辑1(差分≈0V) • 速率:125kbps ~ 1Mbps • 终端电阻:120Ω × 2 • 拓扑:多主总线,线型连接 数据链路层 • LLC子层:报文滤波、恢复管理 • MAC子层:帧封装/拆装、错误检测 • 仲裁机制:ID优先级逐位仲裁 • 错误检测:CRC、位填充、ACK • 错误处理:错误帧、故障界定 • 重发机制:错误恢复后自动重发 帧格式 ① 数据帧:携带数据(标准/扩展) ② 远程帧:请求数据,无数据场 ③ 错误帧:错误标志+错误分隔符 ④ 过载帧:过载标志+过载分隔符 帧间空间:3位隐性位分隔 位定时与同步 位时间 = 同步段(SYNC_SEG) + 传播段(PROP_SEG) + 相位缓冲段1(PS1) + 相位缓冲段2(PS2) 同步方式: • 硬同步:帧起始时所有节点同步 • 重同步:边沿相位误差≤SJW时调整 采样点:通常在75%~85%位时间处 SJW(同步跳转宽度):1~4 TQ 错误处理与重发机制(本章核心) 错误检测:位错误、填充错误、CRC错误、 格式错误、ACK错误 错误状态:主动错误 → 被动错误 → 总线关闭 错误帧:6位显性错误标志 + 8位隐性分隔符 重发机制:错误帧后自动重发原报文 优先级:错误帧 > 过载帧 > 数据/远程帧

2.1 物理层:差分信号与总线拓扑

CAN总线的物理层定义了信号如何在线缆上传输,其核心设计是差分信号传输机制。每条CAN总线由两条线组成:CAN_H(高线)和CAN_L(低线)。当总线处于隐性状态(逻辑1)时,两条线的电压都约为2.5V,差分电压接近0V;当总线处于显性状态(逻辑0)时,CAN_H被拉高至约3.5V,CAN_L被拉低至约1.5V,差分电压约为2V。这种差分设计赋予了CAN总线极强的抗电磁干扰能力,因为外部噪声会同时作用于两条线,差分电压不受影响。

在实际工程部署中,总线两端必须各接入一个120Ω的终端电阻,用于匹配传输线阻抗,防止信号反射。总线拓扑通常采用直线型结构,支线长度应尽可能短(一般不超过0.3米),以保证信号完整性。通信速率与总线长度成反比关系:1Mbps时最大总线长度约40米,而125kbps时可达500米以上。节点通过CAN收发器(如TJA1050、SN65HVD230)连接到总线,收发器内部集成了差分驱动器和接收器,实现逻辑电平与差分信号之间的转换。

经验提醒:在CAN总线调试中,使用示波器测量CAN_H和CAN_L之间的差分波形是最直接的物理层诊断手段。正常工作时,显性位差分电压应在1.5V~3.0V之间,隐性位应接近0V。若差分电压偏低或波形畸变,应优先检查终端电阻、线缆长度和节点接地情况。

2.2 数据链路层:帧结构与仲裁机制

数据链路层是CAN协议的核心,负责将物理层收到的比特流组织成完整的报文帧,并处理错误检测、仲裁和流量控制。CAN 2.0B规范定义了两种帧格式:标准帧(11位标识符)和扩展帧(29位标识符)。标准帧的仲裁场由11位ID和RTR位组成,扩展帧则由29位ID(分为基础ID和扩展ID)、SRR位、IDE位和RTR位构成。ID不仅标识报文内容,还决定了总线访问优先级——ID数值越小,优先级越高。

总线仲裁采用非破坏性逐位仲裁机制。当多个节点同时发送时,每个节点在发送ID的每一位时都会同时监测总线电平。如果某个节点发送隐性位(1)而总线上出现显性位(0),则该节点立即退出仲裁,转为接收状态。这种机制保证了高优先级报文(ID小)能够无延迟地获得总线访问权,且仲裁过程不浪费任何总线带宽。数据帧的完整结构包括:帧起始(SOF,1位显性)、仲裁场、控制场(IDE、DLC)、数据场(0~8字节)、CRC场(15位CRC + 1位CRC分隔符)、ACK场(ACK槽 + ACK分隔符)和帧结束(EOF,7位隐性)。

帧类型 用途 关键特征 优先级
数据帧 发送节点向总线广播数据 携带0~8字节数据,RTR=0 由ID决定
远程帧 请求其他节点发送指定ID的数据 无数据场,RTR=1 低于同ID数据帧
错误帧 节点检测到错误时主动发出 6位显性错误标志 + 8位隐性分隔符 最高(破坏当前帧)
过载帧 节点因内部过载请求延迟下一帧 6位显性过载标志 + 8位隐性分隔符 高于数据/远程帧

远程帧与数据帧的区别在于RTR位:数据帧的RTR为显性(0),远程帧的RTR为隐性(1)。当总线上同时出现相同ID的数据帧和远程帧时,数据帧因RTR显性而赢得仲裁。过载帧用于节点在接收帧期间因内部处理延迟而需要额外时间的情况,其结构与错误帧类似,但触发条件不同——过载帧是节点主动请求延迟,而错误帧是节点检测到总线错误后的被动响应。

2.3 位定时与同步机制

CAN总线是异步串行通信协议,没有独立的时钟线,所有节点必须依靠自身振荡器生成位时序,并通过同步机制保持与发送节点的时钟一致。一个位时间(Bit Time)由四个段组成:同步段(SYNC_SEG,固定1个时间量子TQ)、传播段(PROP_SEG,1~8 TQ)、相位缓冲段1(PS1,1~8 TQ)和相位缓冲段2(PS2,1~8 TQ)。采样点位于PS1和PS2的交界处,通常配置在位时间的75%~85%位置,以容忍信号传播延迟和时钟漂移。

同步机制分为硬同步和重同步两种。硬同步发生在帧起始(SOF)的下降沿,所有节点将当前位时间重新对齐到该边沿,确保帧起始的精确同步。重同步则发生在帧传输过程中,当节点检测到总线上的信号边沿与本地位时间存在相位误差时,通过调整PS1或PS2的长度来修正。同步跳转宽度(SJW)限制了每次重同步的最大调整量,通常设置为1~4 TQ。合理的SJW配置对于总线在不同速率下的稳定性至关重要——SJW过小可能导致同步失败,过大则可能引入噪声干扰。

位定时配置实例:以500kbps、系统时钟16MHz为例,若预分频器设为2,则TQ = 2/16MHz = 125ns。位时间 = 1/500kbps = 2000ns = 16 TQ。典型分配:SYNC_SEG=1 TQ,PROP_SEG=3 TQ,PS1=4 TQ,PS2=8 TQ,采样点 = (1+3+4)/16 = 50%。实际工程中建议采样点设为75%~85%,可调整为:SYNC_SEG=1,PROP_SEG=5,PS1=6,PS2=4,采样点 = (1+5+6)/16 = 75%。

位定时参数的配置直接影响CAN总线的通信可靠性。采样点设置过晚,可能无法正确识别帧末尾的ACK位;设置过早,则可能采样到信号边沿附近的毛刺。传播段应覆盖总线上的最大往返传播延迟(包括收发器延迟、线缆延迟和节点内部延迟),通常取2~3 TQ。在长总线或低速应用中,需要适当增加传播段长度。

2.4 帧格式详解与错误帧触发条件

数据帧和远程帧是用户实际使用的报文帧,而错误帧和过载帧是协议自动生成的控制帧。错误帧由6个显性位(错误标志)和8个隐性位(错误分隔符)组成。当节点检测到以下五种错误之一时,立即发送错误帧:位错误(发送节点在发送位时监测到总线电平与发送值不一致)、填充错误(连续6个相同电平位,违反位填充规则)、CRC错误(接收节点计算的CRC与发送节点附带的CRC不一致)、格式错误(帧格式不符合规范,如EOF应为7个隐性位)、ACK错误(发送节点在ACK槽未检测到显性位,即无节点成功接收)。

错误帧的发送时机非常关键:节点在检测到错误的同一位置开始发送错误标志,这可能导致多个节点同时发送错误标志,形成叠加的显性位序列(长度可能超过6位)。错误分隔符(8个隐性位)为总线恢复提供了时间窗口。错误帧发送完毕后,所有节点回到空闲状态,发送失败的节点将自动重发原报文。值得注意的是,错误帧会破坏当前正在传输的帧,因此错误帧的优先级实际上高于任何数据帧——这正是CAN协议保证错误快速传播和总线快速恢复的机制。

风险提示:在错误帧发送期间,如果某个节点处于被动错误状态(Error Passive),它只能发送6位隐性错误标志,而主动错误节点(Error Active)发送的是6位显性错误标志。这种差异可能导致被动错误节点无法有效中断总线上的错误帧,从而影响错误恢复速度。在系统设计中,应尽量避免节点长期处于被动错误状态。

过载帧的触发条件相对宽松:节点在帧间空间检测到显性位(本应为隐性)、接收节点因内部处理延迟需要额外时间、或在EOF的最后一位检测到显性位。过载帧的结构与错误帧相同,但触发机制不同——过载帧是节点主动请求延迟,不表示总线存在错误。过载帧发送后,节点同样需要等待8个隐性位(过载分隔符)后才能继续通信。

2.5 案例拆解:位定时配置不当导致的通信故障

在某工业控制项目中,一条CAN总线连接了12个节点,通信速率为250kbps,总线长度约80米。系统上电后,部分节点间歇性出现通信超时,且故障频率随温度升高而增加。使用CAN分析仪抓取总线波形,发现错误帧频繁出现,且错误类型以位错误和填充错误为主。

进一步分析发现,该系统的位定时配置为:SYNC_SEG=1 TQ,PROP_SEG=2 TQ,PS1=3 TQ,PS2=2 TQ,SJW=1 TQ,采样点 = (1+2+3)/8 = 75%。表面上看采样点设置合理,但实际计算发现:系统时钟为8MHz,预分频器设为4,TQ = 4/8MHz = 500ns,位时间 = 8 TQ = 4000ns = 250kbps。问题在于传播段仅2 TQ(1000ns),而80米总线的往返传播延迟约为 80m × 5ns/m × 2 = 800ns,加上收发器延迟(约200ns)和节点内部延迟(约100ns),总传播延迟已接近1100ns,超过PROP_SEG的1000ns容量。

解决方案:将位定时调整为SYNC_SEG=1 TQ,PROP_SEG=4 TQ,PS1=4 TQ,PS2=3 TQ,总位时间12 TQ,采样点 = (1+4+4)/12 = 75%。同时将SJW从1 TQ增加到2 TQ,以增强对时钟漂移的容忍度。重新配置后,错误帧消失,通信恢复正常。此案例说明,位定时配置不能仅关注采样点百分比,还必须验证传播段是否覆盖实际总线的最大传播延迟。

复盘要点:位定时配置的验证步骤:① 计算总线最大传播延迟(线缆长度×5ns/m×2 + 收发器延迟 + 节点延迟);② 确认PROP_SEG ≥ 传播延迟/TQ;③ 确认采样点位于75%~85%;④ 确认SJW ≥ 最大时钟漂移/TQ;⑤ 使用CAN分析仪实测波形验证。

2.6 常见误区与总结

在CAN总线基础知识的实际应用中,工程师常陷入以下误区:误区一:认为CAN总线速率越高越好,忽略了总线长度与速率的反比关系,导致信号反射和位错误;误区二:将终端电阻随意放置在总线中间而非两端,造成阻抗不匹配;误区三:混淆错误帧和过载帧的触发条件,在故障排查时错误定位问题;误区四:忽视位定时参数中传播段的重要性,仅关注采样点百分比;误区五:认为远程帧与数据帧可以互换使用,忽略了RTR位在仲裁中的关键作用。

总结而言,CAN总线的物理层、数据链路层、帧格式和位定时是相互关联的整体。物理层的差分信号设计决定了抗干扰能力,数据链路层的仲裁机制保证了多主通信的公平性,四种帧格式构成了完整的通信协议,而位定时与同步则是所有通信可靠性的时间基础。理解这些基础概念,是掌握后续错误处理与重发机制的前提。在实际工程中,应综合运用示波器、CAN分析仪等工具,从物理层波形到协议层帧结构逐层排查问题,才能快速定位并解决CAN总线通信故障。