CAN总线基础:物理层、数据帧格式、仲裁机制、错误处理与位定时
CAN(Controller Area Network)总线自20世纪80年代由Bosch公司提出以来,已成为工业自动化、汽车电子、医疗设备和机器人领域最主流的现场总线之一。与以太网或UART不同,CAN总线并非简单地传输字节流,而是基于报文(Message)的广播式通信协议。理解CAN的物理层特性、数据帧结构、非破坏性仲裁机制、错误处理策略以及位定时原理,是后续进行CANopen协议栈开发、设备配置和故障诊断的基石。本章将深入剖析这五大核心要素,帮助开发者建立完整的底层硬件与协议视图。
上图展示了CAN总线五大核心机制之间的逻辑关系。物理层是通信的物理基础,位定时决定了每个比特的采样精度,仲裁机制保证了多节点同时发送时的优先级处理,错误处理机制则确保了网络的鲁棒性。下面逐一深入剖析。
2.1 CAN物理层:差分信号与总线拓扑
核心原理
CAN物理层采用差分电压传输,通过双绞线中的CAN_H和CAN_L两根线之间的电压差来表示逻辑状态。当CAN_H电压高于CAN_L时(典型值CAN_H=3.5V,CAN_L=1.5V,差分电压2V),总线呈现显性(Dominant)状态,对应逻辑"0";当两线电压接近(典型值均为2.5V,差分电压约0V)时,总线呈现隐性(Recessive)状态,对应逻辑"1"。这种差分结构赋予CAN极强的抗共模干扰能力,适合在电机、变频器等电磁噪声恶劣的工业环境中使用。
总线两端必须各接入一个120Ω终端电阻,用于匹配传输线阻抗,防止信号反射。终端电阻的缺失或阻值漂移是CAN通信间歇性故障的常见原因。
判断方法与操作流程
在工程实践中,验证物理层是否正常通常遵循以下步骤:
- 静态电阻测量:断电状态下,用万用表测量CAN_H与CAN_L之间的电阻。正常值应为60Ω(两个120Ω终端电阻并联)。若测得120Ω,说明一端终端电阻缺失;若测得0Ω,说明总线短路。
- 静态电压测量:上电但无通信时,CAN_H和CAN_L对地电压均应为2.5V左右。若CAN_H为0V或CAN_L为5V,说明线路开路或对电源/地短路。
- 动态波形检查:使用示波器探头连接CAN_H与CAN_L,触发通信报文。正常波形应呈现约2V的差分摆幅,且波形边沿清晰、无过冲。
案例拆解:某伺服驱动器通信间歇中断
某自动化产线中,伺服驱动器每隔数分钟报一次"总线无响应"错误。初步检查节点配置无误,但用万用表测量总线电阻时发现阻值为90Ω。进一步排查发现,总线一端的终端电阻焊接不良,导致接触电阻增大。更换终端电阻后,通信恢复正常。此案例说明,物理层问题往往表现为"软故障",需要借助电阻测量和波形观察才能定位。
2.2 数据帧格式:标准帧与扩展帧
核心原理
CAN数据帧是总线传输的基本单元,由7个场组成:帧起始(SOF)、仲裁场、控制场、数据场、CRC场、ACK场、帧结束(EOF)。其中仲裁场包含报文标识符(ID),用于决定优先级。标准帧(CAN 2.0A)使用11位ID,扩展帧(CAN 2.0B)使用29位ID。控制场中的DLC(数据长度代码)指示数据场字节数(0-8字节)。
CANopen协议基于标准帧(11位ID)工作,其中功能码和节点ID共同组成COB-ID(通信对象标识符)。例如,PDO1发送的COB-ID为0x180+NodeID,SDO请求为0x600+NodeID。
数据帧结构对比
| 场名称 | 标准帧(11位ID) | 扩展帧(29位ID) | 说明 |
|---|---|---|---|
| SOF | 1位显性 | 1位显性 | 帧起始标志 |
| 仲裁场 | 11位ID + RTR位 | 29位ID + SRR + IDE + RTR | 决定优先级 |
| 控制场 | IDE + r0 + DLC(4位) | r1 + r0 + DLC(4位) | IDE=0为标准帧 |
| 数据场 | 0-8字节 | 0-8字节 | 实际载荷 |
| CRC场 | 15位CRC + 1位定界符 | 15位CRC + 1位定界符 | 校验传输错误 |
| ACK场 | 2位 | 2位 | 接收节点应答 |
| EOF | 7位隐性 | 7位隐性 | 帧结束 |
判断方法与操作流程
在开发CANopen设备时,解析数据帧是基本功。推荐使用CAN分析仪(如PCAN、ZLG USBCAN)抓取总线报文,并按照以下流程分析:
- 确认帧类型:查看IDE位,判断是标准帧还是扩展帧。
- 提取COB-ID:将仲裁场中的ID转换为十六进制,结合CANopen规范判断功能(如0x180为PDO1发送)。
- 解析数据场:根据对象字典定义,将字节数组映射为实际物理量(如转速、温度)。
常见误区
2.3 仲裁机制:非破坏性逐位仲裁
核心原理
CAN总线采用载波监听多路访问/冲突避免(CSMA/CA)机制,但与以太网的CSMA/CD不同,CAN的仲裁是非破坏性的。当多个节点同时发送时,每个节点在发送仲裁场的同时监听总线电平。由于显性位(0)会覆盖隐性位(1),发送隐性位但监听到显性位的节点会立即退出仲裁,转为接收状态。整个过程不破坏任何报文,且优先级最高的帧(ID数值最小)无延迟地赢得总线。
这种机制的关键在于:ID越小,优先级越高。在CANopen中,NMT(网络管理)报文使用COB-ID 0x000,拥有最高优先级;而心跳报文(0x700+NodeID)优先级较低。
判断方法与操作流程
在实际调试中,若发现总线利用率过高或低优先级报文频繁丢失,可按照以下流程优化:
- 使用CAN分析仪统计各ID的发送周期和总线负载率。
- 检查是否存在多个节点配置了相同的COB-ID,导致仲裁冲突。
- 调整PDO的传输类型(事件触发、周期触发),避免突发流量。
案例拆解:多节点同时上电时的报文风暴
某设备包含1个PLC主站和5个从站。上电瞬间,所有从站同时发送心跳报文(ID=0x700+NodeID),导致总线瞬时负载率超过90%。由于ID 0x701的节点优先级最高,其心跳正常发送,而ID 0x705的节点心跳被延迟约20ms。虽然最终所有报文均成功发送,但延迟可能导致主站误判从站离线。解决方案是将心跳周期错开(如设置不同的初始偏移量),或提高主站NMT报文的发送频率以强制同步。
2.4 错误处理:五类错误与状态机
核心原理
CAN协议定义了五种错误检测机制:位错误、填充错误、CRC错误、格式错误、ACK错误。每个节点维护两个计数器:发送错误计数器(TEC)和接收错误计数器(REC)。根据计数值,节点处于三种状态之一:
- 错误主动(Error Active):TEC<128且REC<128,节点可正常收发,检测到错误时发送主动错误帧(6位显性位)。
- 错误被动(Error Passive):TEC≥128或REC≥128,节点可收发,但只能发送被动错误帧(6位隐性位),且发送前需等待8个隐性位。
- 总线关闭(Bus-off):TEC>255,节点完全脱离总线,不参与任何通信,需等待协议栈软件复位或硬件复位。
错误处理流程
| 错误类型 | 检测位置 | 处理动作 | 典型原因 |
|---|---|---|---|
| 位错误 | 发送节点 | 发送错误帧 | 总线短路、收发器故障 |
| 填充错误 | 所有节点 | 发送错误帧 | 位定时偏差、干扰 |
| CRC错误 | 接收节点 | 发送错误帧 | 电磁干扰、线缆过长 |
| 格式错误 | 所有节点 | 发送错误帧 | 协议栈缺陷、波特率不匹配 |
| ACK错误 | 发送节点 | 重发报文 | 无接收节点、终端电阻缺失 |
案例拆解:总线关闭后的恢复策略
某AGV小车在运行时频繁报"驱动通信丢失"。通过CAN分析仪抓取日志发现,驱动节点的TEC持续增长,最终触发Bus-off。分析原因是驱动器的CAN收发器电源纹波过大,导致位错误频发。解决措施:在收发器电源引脚增加100nF去耦电容,并优化PCB布局。同时,在CANopen协议栈中配置自动恢复机制,使节点在Bus-off后等待128个11位隐性位自动恢复,减少人工干预。
2.5 位定时与同步:采样点与波特率配置
核心原理
CAN的位时间由四个段组成:同步段(SYNC_SEG)、传播段(PROP_SEG)、相位缓冲段1(PHASE_SEG1)、相位缓冲段2(PHASE_SEG2)。每个段由若干个时间量子(TQ)组成,TQ = 1 / (外设时钟频率 / 预分频器)。采样点位于PHASE_SEG1与PHASE_SEG2之间,其位置直接影响通信可靠性。
波特率计算公式为:波特率 = f_clk / (预分频器 × (SYNC_SEG + PROP_SEG + PHASE_SEG1 + PHASE_SEG2))。例如,STM32F407的APB1时钟为42MHz,若预分频器设为4,则TQ=1/10.5MHz≈95.2ns。若位时间设为16TQ,则波特率=10.5MHz/16=656.25kbps。
采样点配置建议
| 波特率 | 总线长度 | 推荐采样点 | 典型配置(TQ=16) |
|---|---|---|---|
| 1Mbps | ≤40m | 75%-80% | SYNC=1, PROP=3, PS1=8, PS2=4 |
| 500kbps | ≤100m | 80%-87.5% | SYNC=1, PROP=3, PS1=9, PS2=3 |
| 250kbps | ≤250m | 87.5% | SYNC=1, PROP=3, PS1=10, PS2=2 |
| 125kbps | ≤500m | 87.5% | SYNC=1, PROP=3, PS1=10, PS2=2 |
判断方法与操作流程
当出现偶发通信错误时,应优先检查位定时配置:
- 使用示波器测量实际波特率,与配置值对比。
- 检查采样点位置是否在位的稳定区域(通常建议70%-85%)。
- 验证重同步跳转宽度(SJW)是否足够,SJW应至少为1TQ,推荐2TQ。
案例拆解:波特率偏差导致的CRC错误
某设备使用内部RC振荡器作为CAN控制器时钟,标称频率8MHz,实际偏差±2%。当波特率配置为500kbps时,实际波特率偏差达到10kbps,导致总线上的位时间漂移,CRC错误率高达5%。解决方案:改用外部晶振(精度±20ppm),或将预分频器调整以补偿偏差。最终将波特率偏差控制在0.1%以内,CRC错误率降至0。
本章从物理层到数据链路层,系统梳理了CAN总线的五大核心机制。物理层的差分信号与终端电阻是通信的物理保障;数据帧格式定义了信息的封装方式;仲裁机制确保了多节点竞争的确定性;错误处理机制提供了网络自愈能力;位定时则决定了采样的精确性。在后续CANopen协议开发中,这些底层机制将直接影响到对象字典的映射、PDO的调度以及网络管理的可靠性。开发者应熟练掌握这些基础,才能在协议栈移植和故障排查中游刃有余。