二、CAN总线基础:协议分层模型、帧格式与位时序同步机制
CAN(Controller Area Network)总线自1986年由Bosch公司为汽车电子系统设计以来,凭借其高可靠性、实时性和抗干扰能力,已成为工业控制、医疗设备、轨道交通及嵌入式系统中最主流的现场总线之一。理解CAN总线,不能只停留在“能收发报文”的层面,硬件工程师必须深入掌握其协议分层模型、帧格式细节以及位时序与同步机制。这三者构成了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与收发器的职责边界,避免在软件配置时混淆寄存器含义。
实战场景: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%,需检查总线终端电阻、波特率或节点接地。
案例拆解:错误帧风暴导致总线瘫痪的排查
某工业设备现场,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会降低抗干扰能力,过小则无法有效补偿时钟偏差。
实战场景: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%)和放置位置(总线两端)至关重要。