二、CAN总线基础:协议分层模型、帧格式与位时序同步机制

CAN(Controller Area Network)总线自1986年由Bosch公司为汽车电子系统设计以来,凭借其高可靠性、实时性和抗干扰能力,已成为工业控制、医疗设备、轨道交通及嵌入式系统中最主流的现场总线之一。理解CAN总线,不能只停留在“能收发报文”的层面,硬件工程师必须深入掌握其协议分层模型、帧格式细节以及位时序与同步机制。这三者构成了CAN物理层与数据链路层设计的理论基石,直接决定了收发器选型、终端电阻匹配、波特率配置以及总线故障排查的思路。本章将逐一拆解这些核心概念,并结合实际硬件设计场景,帮助读者建立从协议到硬件的完整认知闭环。

CAN总线核心机制总览 协议分层模型 应用层(用户自定义) 数据链路层(LLC + MAC) 物理层(PLS + PMA + MDI) 收发器 + 连接器 + 线缆 帧格式(4种) 数据帧(Data Frame) 远程帧(Remote Frame) 错误帧(Error Frame) 过载帧(Overload Frame) 标准帧11位ID / 扩展帧29位ID 位时序与同步 同步段(SYNC_SEG) 传播段(PROP_SEG) 相位缓冲段1/2(PS1/PS2) 同步机制:硬同步 + 重同步 采样点位置决定容错能力 硬件设计关键映射 物理层设计 • 收发器选型(TJA1044等) • 终端电阻(120Ω ±1%) • 共模电感/ESD防护 • 线缆特性阻抗匹配 • 总线长度与节点数 数据链路层配置 • 波特率(125k~1Mbps) • 采样点位置(87.5%) • SJW(同步跳转宽度) • 帧过滤/屏蔽寄存器 • 错误处理机制 调试与测试 • 示波器测量显隐性电平 • CAN协议分析仪抓帧 • 位时序误差分析 • 错误帧/过载帧统计 • 总线利用率评估

2.1 CAN协议分层模型:从物理信号到应用数据的桥梁

核心原理:OSI参考模型在CAN中的裁剪与映射

CAN总线并未完全照搬OSI七层模型,而是根据实时控制场景的需求,仅保留了物理层、数据链路层和应用层。这种裁剪并非简化,而是为了在保证实时性的前提下,将协议开销降到最低。物理层负责将数据链路层的逻辑位(0/1)转换为总线上的差分电压信号,并处理电气特性、位定时、同步和总线故障检测。数据链路层又细分为逻辑链路控制子层(LLC)和介质访问控制子层(MAC),前者负责报文滤波、恢复管理和通知,后者负责封装/拆装数据帧、错误检测、错误标定和串行化/反串行化。应用层则由用户根据具体场景定义,例如CANopen、DeviceNet或自定义协议。

硬件工程师需要特别关注物理层与MAC子层的接口。MAC子层向物理层提交的是一串逻辑位流,而物理层中的PLS(物理信令)子层负责位编码/解码、位时序和同步。这意味着,MCU内部的CAN控制器(如SJA1000、MCP2515或STM32的bxCAN)已经实现了MAC和LLC功能,而外部收发器(如TJA1044、SN65HVD230)则承担了PMA(物理介质附件)和MDI(介质相关接口)的功能。理解这一分工,有助于在硬件设计时正确划分MCU与收发器的职责边界,避免在软件配置时混淆寄存器含义。

关键判断方法:当系统出现通信异常时,首先通过示波器测量CAN_H与CAN_L之间的差分电压。若差分电压在显性位(Dominant)时约为2V(CAN_H≈3.5V,CAN_L≈1.5V),隐性位(Recessive)时约为0V(CAN_H≈2.5V,CAN_L≈2.5V),则物理层基本正常。若波形异常,应检查收发器供电、终端电阻和共模电感;若波形正常但通信仍失败,则问题大概率出在数据链路层的波特率配置或帧格式错误上。

实战场景:MCU内置CAN控制器与外部收发器的典型连接

以STM32F407 + TJA1044为例,MCU的CAN_TX引脚连接收发器的TXD引脚,CAN_RX连接RXD。硬件设计时需注意:TJA1044的VIO引脚应连接MCU的I/O电源(如3.3V),以保证逻辑电平匹配;CANH和CANL引脚需分别串联一个共模电感(如ACT45B-510-2P)以抑制共模干扰,并在总线两端各放置一个120Ω终端电阻。若总线节点数超过32个,需考虑使用低功耗收发器或增加总线驱动器。此外,TJA1044的STB引脚(待机模式控制)应通过10kΩ电阻下拉至地,确保上电时处于正常工作模式,避免因浮空导致收发器进入待机状态而无法通信。

分层功能硬件实现典型故障表现
物理层差分信号收发、电气保护收发器、终端电阻、ESD/TVS管波形畸变、电平不达标、总线短路
数据链路层帧封装、错误检测、仲裁MCU内置CAN控制器错误帧频繁、总线关闭、丢帧
应用层数据解析、网络管理用户固件数据语义错误、节点掉线

2.2 帧格式详解:四种帧的构成与硬件设计关联

核心原理:数据帧与远程帧的结构差异

CAN协议定义了四种帧:数据帧、远程帧、错误帧和过载帧。数据帧用于发送节点向总线传输数据,远程帧用于请求其他节点发送具有相同ID的数据。两者在帧结构上极为相似,主要区别在于RTR位(远程发送请求位):数据帧的RTR位为显性(0),远程帧的RTR位为隐性(1)。标准帧(11位ID)与扩展帧(29位ID)的区别则体现在IDE位和SRR位。硬件设计时,必须确保CAN控制器的验收滤波器配置与帧ID类型匹配,否则会导致报文被错误过滤。

错误帧由错误标志和错误界定符组成,当任何节点检测到总线错误时,就会主动发送错误帧。错误标志分为主动错误标志(6个显性位)和被动错误标志(6个隐性位),取决于节点错误计数器的值。过载帧用于在接收节点尚未准备好接收下一帧时,向总线发送额外延时。过载帧的格式与错误帧类似,但触发条件不同——过载帧是接收节点主动发起的,而错误帧是错误检测的被动响应。

判断方法:通过CAN协议分析仪识别帧类型

使用CANalyzer或PCAN-View等工具抓取总线报文时,应关注以下字段:

  • 帧ID:确认是标准帧(000~7FF)还是扩展帧(00000000~1FFFFFFF)。
  • DLC(数据长度码):表示数据场字节数,范围0~8。若DLC大于8,说明帧格式异常。
  • RTR位:若为隐性,则为远程帧,此时数据场无效。
  • 错误帧计数:若错误帧占比超过总帧数的1%,需检查总线终端电阻、波特率或节点接地。
风险提示:在硬件调试初期,不要急于连接所有节点。应先使用单个节点自发自收(Loopback模式)验证MCU内部CAN控制器工作正常,再连接收发器进行总线通信。否则,一旦总线被某个节点的错误帧占据,将难以定位问题源头。

案例拆解:错误帧风暴导致总线瘫痪的排查

某工业设备现场,CAN总线在运行约30分钟后突然通信中断,示波器显示总线持续出现密集的显性电平。使用CAN分析仪抓取数据,发现错误帧占比高达95%,且错误帧的ID字段不断变化。进一步分析发现,所有错误帧均来自一个特定节点——该节点的CAN收发器供电电压由5V LDO提供,但LDO输入端受到24V电机启动时的电压跌落影响,导致LDO输出在4.2V~4.8V之间波动。当电压低于4.5V时,收发器的显性电平输出能力下降,CAN_H无法达到3.5V,导致其他节点采样到不一致的电平,从而触发错误帧。解决措施:将LDO更换为宽压输入的DC-DC模块,并在收发器电源引脚增加100μF电解电容和100nF陶瓷电容进行储能和滤波。整改后,错误帧消失,总线恢复稳定。

2.3 位时序与同步机制:波特率配置的底层逻辑

核心原理:一个位时间的四段划分

CAN总线的每个位时间(Bit Time)由四个段组成:同步段(SYNC_SEG)、传播段(PROP_SEG)、相位缓冲段1(PS1)和相位缓冲段2(PS2)。SYNC_SEG固定为1个时间量子(TQ),用于同步总线上的各个节点;PROP_SEG用于补偿物理层传播延迟和收发器内部延迟;PS1和PS2用于吸收时钟偏差,采样点位于PS1与PS2的交界处。采样点的位置决定了系统对时钟偏差和总线延迟的容忍度,通常推荐设置在85%~90%位时间处。

波特率计算公式为:BaudRate = 1 / (TQ × (SYNC_SEG + PROP_SEG + PS1 + PS2))。其中TQ由CAN控制器时钟分频得到。例如,STM32的APB1时钟为42MHz,若设置BRP(波特率预分频器)为4,则TQ = 4/42MHz ≈ 95.2ns。若配置SYNC_SEG=1、PROP_SEG=2、PS1=7、PS2=6,则总TQ数=16,波特率=42MHz/(4×16)=656.25kbps。实际工程中,应优先选择整数波特率(如500kbps、250kbps),并确保所有节点的采样点一致。

同步机制:硬同步与重同步

硬同步发生在总线从隐性到显性的跳变沿(帧起始SOF),所有节点强制将当前位时间重新从SYNC_SEG开始。重同步则发生在帧内后续的显隐性跳变沿,通过调整PS1或PS2的长度来补偿节点间的时钟漂移。同步跳转宽度(SJW)定义了每次重同步时,PS1缩短或PS2延长的最大TQ数。SJW通常设置为1~4 TQ,过大的SJW会降低抗干扰能力,过小则无法有效补偿时钟偏差。

经验提醒:在硬件设计阶段,应通过CAN控制器寄存器计算工具(如ST的CubeMX或NXP的MCUXpresso Config Tools)预先计算波特率和采样点。切勿仅凭经验设置BRP和段长度,因为不同MCU的CAN控制器实现细节不同,同样的寄存器值可能产生不同的位时序。

实战场景:500kbps波特率下的位时序配置

以某车规级MCU(APB1时钟=40MHz)为例,目标波特率500kbps,采样点87.5%。计算过程如下:

所需TQ总数 = 40MHz / 500kbps = 80 TQ
若BRP=2,则TQ = 2/40MHz = 50ns
位时间 = 80 × 50ns = 4μs(对应500kbps)
段分配:SYNC_SEG=1, PROP_SEG=2, PS1=8, PS2=5
采样点 = (1+2+8)/16 = 68.75%(不满足要求)
调整:SYNC_SEG=1, PROP_SEG=3, PS1=10, PS2=2
采样点 = (1+3+10)/16 = 87.5%(满足要求)
SJW = 2 TQ

配置完成后,使用示波器测量CAN_TX引脚的波形,确认位时间精确为2μs(若BRP=2,则TQ=50ns,总TQ=40,位时间=2μs)。同时,通过CAN分析仪发送测试帧,观察接收节点的采样点是否稳定。

常见误区与总结复盘

  • 误区一:所有节点使用相同波特率即可,忽略采样点差异。实际上,若两个节点的采样点偏差超过5%,在总线长度较长或时钟精度较差时,极易产生位错误。
  • 误区二:SJW设置越大越好。SJW过大会导致接收节点对噪声过于敏感,误将毛刺当作有效跳变沿,从而引发错误帧。
  • 误区三:终端电阻必须严格等于120Ω。在短距离(<1m)点对点通信时,可省略终端电阻;但在长线或多节点场景,终端电阻的精度(±1%)和放置位置(总线两端)至关重要。