CAN总线基础:物理层、数据帧格式、仲裁机制、错误处理与位定时

CAN(Controller Area Network)总线自20世纪80年代由Bosch公司提出以来,已成为工业自动化、汽车电子、医疗设备和机器人领域最主流的现场总线之一。与以太网或UART不同,CAN总线并非简单地传输字节流,而是基于报文(Message)的广播式通信协议。理解CAN的物理层特性、数据帧结构、非破坏性仲裁机制、错误处理策略以及位定时原理,是后续进行CANopen协议栈开发、设备配置和故障诊断的基石。本章将深入剖析这五大核心要素,帮助开发者建立完整的底层硬件与协议视图。

CAN总线核心机制全景图 物理层 双绞线差分信号 CAN_H / CAN_L 显性(0) / 隐性(1) 120Ω终端电阻 速率: 125k~1Mbps 数据帧格式 SOF + 仲裁场 + 控制场 数据场(0-8字节) CRC场 + ACK场 + EOF 标准帧(11位ID) 扩展帧(29位ID) 仲裁机制 非破坏性逐位仲裁 ID越小优先级越高 显性位覆盖隐性位 RTR位区分数据/远程 无破坏,零延迟 错误处理 5种错误检测机制 错误主动/被动 总线关闭(Bus-off) 错误帧自动重发 TEC/REC计数器 位定时与同步 位时间 = 同步段 + 传播段 + 相位缓冲段1 + 相位缓冲段2 TQ = 1 / (f_clk / 预分频器) 采样点位置决定系统可靠性 硬同步 + 重同步跳转宽度(SJW) 图:CAN总线五大核心机制关系——物理层是基础,位定时决定采样精度,仲裁与错误处理保障通信实时性与可靠性

上图展示了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通信间歇性故障的常见原因。

判断方法与操作流程

在工程实践中,验证物理层是否正常通常遵循以下步骤:

  1. 静态电阻测量:断电状态下,用万用表测量CAN_H与CAN_L之间的电阻。正常值应为60Ω(两个120Ω终端电阻并联)。若测得120Ω,说明一端终端电阻缺失;若测得0Ω,说明总线短路。
  2. 静态电压测量:上电但无通信时,CAN_H和CAN_L对地电压均应为2.5V左右。若CAN_H为0V或CAN_L为5V,说明线路开路或对电源/地短路。
  3. 动态波形检查:使用示波器探头连接CAN_H与CAN_L,触发通信报文。正常波形应呈现约2V的差分摆幅,且波形边沿清晰、无过冲。

案例拆解:某伺服驱动器通信间歇中断

某自动化产线中,伺服驱动器每隔数分钟报一次"总线无响应"错误。初步检查节点配置无误,但用万用表测量总线电阻时发现阻值为90Ω。进一步排查发现,总线一端的终端电阻焊接不良,导致接触电阻增大。更换终端电阻后,通信恢复正常。此案例说明,物理层问题往往表现为"软故障",需要借助电阻测量和波形观察才能定位。

风险提示:切勿在总线带电状态下插拔连接器,否则可能因电势差损坏收发器芯片。同时,CAN总线线缆长度与通信速率成反比,1Mbps时建议总线长度不超过40m,125kbps时可达500m。

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)说明
SOF1位显性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位接收节点应答
EOF7位隐性7位隐性帧结束

判断方法与操作流程

在开发CANopen设备时,解析数据帧是基本功。推荐使用CAN分析仪(如PCAN、ZLG USBCAN)抓取总线报文,并按照以下流程分析:

  1. 确认帧类型:查看IDE位,判断是标准帧还是扩展帧。
  2. 提取COB-ID:将仲裁场中的ID转换为十六进制,结合CANopen规范判断功能(如0x180为PDO1发送)。
  3. 解析数据场:根据对象字典定义,将字节数组映射为实际物理量(如转速、温度)。

常见误区

经验提醒:初学者常混淆RTR位与数据帧。RTR=0表示数据帧,RTR=1表示远程帧(请求数据)。但在CANopen中,远程帧使用频率极低,多数场景下应避免使用RTR,因为其优先级处理与数据帧不同,容易导致总线调度混乱。

2.3 仲裁机制:非破坏性逐位仲裁

核心原理

CAN总线采用载波监听多路访问/冲突避免(CSMA/CA)机制,但与以太网的CSMA/CD不同,CAN的仲裁是非破坏性的。当多个节点同时发送时,每个节点在发送仲裁场的同时监听总线电平。由于显性位(0)会覆盖隐性位(1),发送隐性位但监听到显性位的节点会立即退出仲裁,转为接收状态。整个过程不破坏任何报文,且优先级最高的帧(ID数值最小)无延迟地赢得总线。

这种机制的关键在于:ID越小,优先级越高。在CANopen中,NMT(网络管理)报文使用COB-ID 0x000,拥有最高优先级;而心跳报文(0x700+NodeID)优先级较低。

判断方法与操作流程

在实际调试中,若发现总线利用率过高或低优先级报文频繁丢失,可按照以下流程优化:

  1. 使用CAN分析仪统计各ID的发送周期和总线负载率。
  2. 检查是否存在多个节点配置了相同的COB-ID,导致仲裁冲突。
  3. 调整PDO的传输类型(事件触发、周期触发),避免突发流量。

案例拆解:多节点同时上电时的报文风暴

某设备包含1个PLC主站和5个从站。上电瞬间,所有从站同时发送心跳报文(ID=0x700+NodeID),导致总线瞬时负载率超过90%。由于ID 0x701的节点优先级最高,其心跳正常发送,而ID 0x705的节点心跳被延迟约20ms。虽然最终所有报文均成功发送,但延迟可能导致主站误判从站离线。解决方案是将心跳周期错开(如设置不同的初始偏移量),或提高主站NMT报文的发送频率以强制同步。

实战建议:在设计CANopen网络时,建议为不同功能的PDO分配不同的优先级区间。例如,紧急停止报文使用0x080+NodeID(高优先级),而状态反馈使用0x180+NodeID(中优先级),避免关键控制信号被大量周期数据阻塞。

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位隐性位自动恢复,减少人工干预。

风险说明:Bus-off状态是CAN网络中最严重的故障之一。若节点频繁进入Bus-off,会导致整个网络通信瘫痪。建议在应用层增加错误计数监控,当TEC超过96时提前预警,避免突然离线。

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≤40m75%-80%SYNC=1, PROP=3, PS1=8, PS2=4
500kbps≤100m80%-87.5%SYNC=1, PROP=3, PS1=9, PS2=3
250kbps≤250m87.5%SYNC=1, PROP=3, PS1=10, PS2=2
125kbps≤500m87.5%SYNC=1, PROP=3, PS1=10, PS2=2

判断方法与操作流程

当出现偶发通信错误时,应优先检查位定时配置:

  1. 使用示波器测量实际波特率,与配置值对比。
  2. 检查采样点位置是否在位的稳定区域(通常建议70%-85%)。
  3. 验证重同步跳转宽度(SJW)是否足够,SJW应至少为1TQ,推荐2TQ。

案例拆解:波特率偏差导致的CRC错误

某设备使用内部RC振荡器作为CAN控制器时钟,标称频率8MHz,实际偏差±2%。当波特率配置为500kbps时,实际波特率偏差达到10kbps,导致总线上的位时间漂移,CRC错误率高达5%。解决方案:改用外部晶振(精度±20ppm),或将预分频器调整以补偿偏差。最终将波特率偏差控制在0.1%以内,CRC错误率降至0。

经验总结:位定时配置是CAN工程中最容易被忽视的环节。建议在项目初期使用CAN分析仪的"波特率自动检测"功能,确认实际波特率后再固化配置。同时,所有节点的波特率必须严格一致,偏差超过±0.5%即可能导致通信不稳定。

本章从物理层到数据链路层,系统梳理了CAN总线的五大核心机制。物理层的差分信号与终端电阻是通信的物理保障;数据帧格式定义了信息的封装方式;仲裁机制确保了多节点竞争的确定性;错误处理机制提供了网络自愈能力;位定时则决定了采样的精确性。在后续CANopen协议开发中,这些底层机制将直接影响到对象字典的映射、PDO的调度以及网络管理的可靠性。开发者应熟练掌握这些基础,才能在协议栈移植和故障排查中游刃有余。