2、CAN基础回顾:CAN总线物理层、数据帧格式、仲裁机制、错误处理与位定时
CAN(Controller Area Network)总线自20世纪80年代由Bosch公司提出以来,已成为工业自动化、汽车电子、医疗设备和机器人领域最主流的现场总线之一。CANopen协议栈正是构建于CAN总线物理层和数据链路层之上的应用层规范,因此,深入理解CAN底层的运行机制是开发可靠CANopen主从站设备的先决条件。本章将系统梳理CAN总线的物理层特性、数据帧结构、非破坏性仲裁机制、错误处理策略以及位定时与同步原理,为后续实现CANopen对象字典、PDO/SDO通信和网络管理打下坚实的硬件与协议基础。
上图展示了CAN总线五大核心机制之间的逻辑关系。物理层定义了信号的电气特性与传输介质,数据链路层规定了帧的封装格式,仲裁机制解决了多节点同时发送时的总线竞争问题,错误处理机制保证了数据传输的可靠性,而位定时则确保了所有节点在采样点上的同步。这五个方面环环相扣,共同构成了CAN总线高可靠性的基石。下面逐一深入剖析。
2.1 CAN物理层:差分信号与总线拓扑
2.1.1 核心原理:差分信号与电平定义
CAN总线采用双绞线差分传输方式,两条信号线分别称为CAN_H(高线)和CAN_L(低线)。差分信号的核心优势在于抗共模干扰能力强——外部电磁噪声通常同时作用于两条线,而接收端只关心两者之间的电压差,因此噪声被有效抵消。CAN总线定义了两个逻辑电平:显性电平(Dominant)对应逻辑0,此时CAN_H被拉高至约3.5V,CAN_L被拉低至约1.5V,差分电压约为2V;隐性电平(Recessive)对应逻辑1,此时两条线均被偏置到约2.5V,差分电压接近0V。显性电平具有总线优先权,即只要有一个节点输出显性电平,总线上就呈现显性状态,这正是仲裁机制能够实现的物理基础。
2.1.2 总线拓扑与终端匹配
CAN总线采用多主从线性拓扑结构,所有节点通过双绞线并联连接。总线两端必须各接入一个120Ω的终端电阻,用于吸收信号反射。终端电阻的阻值应与电缆的特性阻抗(通常为120Ω)匹配,否则会产生信号反射,导致波形畸变和误码。在实际工程中,终端电阻通常集成在节点设备内部,通过跳线或拨码开关使能。对于分支线(Stub)长度,建议不超过0.3米,以避免阻抗不连续带来的反射问题。
| 参数 | 典型值 | 说明 |
|---|---|---|
| 总线长度(1Mbps) | ≤40m | 速率越高,允许的总线长度越短 |
| 总线长度(125kbps) | ≤500m | 低速时信号衰减影响较小 |
| 节点数 | ≤110个(标准) | 受收发器驱动能力限制 |
| 终端电阻 | 120Ω ±1% | 两端各一个,不可省略 |
| 线缆类型 | 屏蔽双绞线 | 屏蔽层单点接地 |
2.1.3 实战场景:CAN收发器选型与电平转换
在CANopen主从站设备开发中,MCU内部集成的CAN控制器通常输出的是TTL电平的TX/RX信号,需要通过CAN收发器(如TJA1050、SN65HVD230、ISO1050等)转换为差分信号。以TJA1050为例,其引脚8(S)用于选择工作模式:接高电平进入待机模式,接低电平进入高速模式。在设计电路时,需要注意CAN_H和CAN_L线上应串联共模扼流圈以抑制高频干扰,并在收发器电源引脚附近放置100nF去耦电容。对于需要电气隔离的应用场景(如工业现场),应选用带隔离的收发器(如ISO1050),隔离电压通常要求达到2500Vrms以上。
2.2 CAN数据帧格式:逐位拆解标准帧与扩展帧
2.2.1 核心原理:标准帧与扩展帧结构
CAN 2.0A标准定义了11位标识符的标准帧,CAN 2.0B扩展定义了29位标识符的扩展帧。CANopen协议明确规定使用11位标准帧(CAN 2.0A),因此本章重点讲解标准帧格式。一个完整的数据帧由以下字段组成:帧起始(SOF)为1位显性电平,用于同步所有节点;仲裁段包含11位标识符(ID)和1位RTR位(远程传输请求位,数据帧为显性0,远程帧为隐性1);控制段包含1位IDE位(标准帧为显性0)、1位保留位r0和4位DLC(数据长度代码,表示数据字节数0~8);数据段为0~8字节的实际载荷;CRC段包含15位CRC校验码和1位CRC界定符(隐性);ACK段包含1位ACK槽位和1位ACK界定符;最后是7位连续的隐性帧结束(EOF)。
2.2.2 位填充规则与帧格式判断
CAN协议规定,在SOF到CRC段之间,如果连续出现5个相同电平的位,发送节点必须自动插入一个反相位的填充位。接收节点在解码时会自动移除这些填充位。位填充机制保证了总线上有足够的电平跳变沿,便于接收节点进行时钟同步。需要注意的是,CRC段之后的ACK和EOF不进行位填充。在开发CANopen设备时,理解位填充规则有助于分析总线上的实际波形——示波器上看到的位序列与协议分析仪解码出的数据帧之间存在填充位的差异。
// CAN标准帧(CAN 2.0A)位布局示例
// 帧起始 | 11位ID | RTR | IDE | r0 | DLC(4位) | 数据(0-8字节) | CRC(15位) | CRC界定符 | ACK槽 | ACK界定符 | EOF(7位)
// 1位 | ID | 1位 | 1位 | 1位| 4位 | 0-64位 | 15位 | 1位 | 1位 | 1位 | 7位
// 示例:ID=0x181(CANopen TPDO1默认ID),DLC=8,数据=0x01 0x02 0x03 0x04 0x05 0x06 0x07 0x08
// 二进制:0 0011 0000 1 0 0 1000 00000001 00000010 ... [CRC] 1 1 1 1111111
2.2.3 案例拆解:CANopen PDO帧解析
以CANopen中常见的TPDO1为例,其默认COB-ID为0x181(假设节点ID=1)。当主站发送SYNC报文(COB-ID=0x080)后,从站1的TPDO1被触发,发送一帧8字节的过程数据。使用CAN协议分析仪抓取到的原始帧如下:0x181 8 01 02 03 04 05 06 07 08。逐位拆解:ID=0x181(二进制0001 1000 0001),RTR=0(数据帧),DLC=8,数据段为8个字节。在CANopen中,这8个字节的映射关系由TPDO1的通信参数(0x1800)和映射参数(0x1A00)决定。例如,若映射了2个16位对象和1个32位对象,则字节0-1对应第一个对象,字节2-3对应第二个对象,字节4-7对应第三个对象。理解帧格式是解析CANopen报文的基础。
2.3 仲裁机制:非破坏性逐位仲裁
2.3.1 核心原理:CSMA/CA与优先级判定
CAN总线采用载波监听多路访问/冲突避免(CSMA/CA)机制。当多个节点同时开始发送时,它们会逐位比较总线电平与自身发送电平。由于显性电平(0)覆盖隐性电平(1),发送隐性位(1)的节点在检测到总线上为显性电平(0)时,会立即退出仲裁并转为接收状态。这个过程是非破坏性的——赢得仲裁的节点继续完整发送其帧,无需重发。仲裁过程覆盖整个ID字段和RTR位,因此ID数值越小,优先级越高。在CANopen中,NMT命令(ID=0)优先级最高,其次是SYNC(ID=0x080)、紧急报文(ID=0x080+NodeID)、时间戳(ID=0x100)等。
2.3.2 仲裁判断流程与优先级设计
仲裁机制对CANopen设备开发有重要指导意义。在设计CANopen网络时,应根据报文的实时性要求合理分配COB-ID。例如,PDO(过程数据对象)承载实时控制数据,应分配较小的ID(高优先级);SDO(服务数据对象)用于参数配置,实时性要求低,可分配较大的ID(低优先级)。具体判断流程如下:
- 节点在发送前监听总线,等待总线空闲(连续11位隐性电平);
- 多个节点同时发送SOF位,总线呈现显性电平;
- 逐位比较ID:发送显性位的节点继续,发送隐性位但检测到显性电平的节点退出仲裁;
- 仲裁失败的节点在总线空闲后自动重发(无需软件干预);
- 仲裁成功的节点继续发送RTR位和后续字段。
2.3.3 实战场景:多节点同时上电时的总线竞争
在一个CANopen网络中,如果多个从站同时上电并尝试发送心跳报文(Heartbeat),就会触发仲裁机制。假设节点1的ID=0x181,节点2的ID=0x182,节点3的ID=0x183,三者同时发送。仲裁过程如下:ID的前7位(0x181=0001 1000,0x182=0001 1000,0x183=0001 1000)完全相同,直到第8位:节点1发送0,节点2发送1,节点3发送1。此时节点2和节点3检测到总线为显性(0),退出仲裁;节点1继续发送。最终节点1的心跳帧先被发送,节点2和节点3在总线空闲后自动重发。这个过程中,总线利用率高,没有数据丢失,体现了CAN仲裁机制的高效性。
2.4 错误处理:五类错误检测与故障界定
2.4.1 核心原理:错误检测机制
CAN协议定义了五种错误检测机制,覆盖了传输错误的各个层面:位错误(发送节点在发送位时同时监听总线,若发现电平不一致则报错)、填充错误(接收节点检测到连续6个相同电平位,违反位填充规则)、CRC错误(接收节点计算的CRC与发送节点不一致)、格式错误(检测到固定隐性位(如CRC界定符、ACK界定符、EOF)为显性电平)、ACK错误(发送节点在ACK槽位未检测到显性电平,说明没有节点成功接收)。任何节点检测到错误后,会立即发送错误帧(6位显性错误标志),中断当前传输。
2.4.2 错误状态机与故障界定
每个CAN节点维护两个错误计数器:发送错误计数器(TEC)和接收错误计数器(REC)。根据计数值,节点处于三种状态之一:错误主动(Error Active)(TEC<128且REC<128),此时节点可以正常发送和接收,检测到错误时发送主动错误标志(6位显性位);错误被动(Error Passive)(TEC≥128或REC≥128),此时节点仍可通信,但发送错误标志时只能发送6位隐性位(被动错误标志),且发送前需等待8位隐性位(暂停发送);总线关闭(Bus Off)(TEC>255),此时节点完全脱离总线,既不发送也不接收,需等待软件复位或128次总线空闲检测后才能恢复。在CANopen设备中,总线关闭状态通常需要应用层通过NMT命令或硬件复位来恢复。
| 错误状态 | 判定条件 | 行为特征 | 恢复方式 |
|---|---|---|---|
| 错误主动 | TEC<128 且 REC<128 | 正常通信,发送主动错误帧 | 无需恢复 |
| 错误被动 | TEC≥128 或 REC≥128 | 发送被动错误帧,发送前等待8位隐性位 | 错误计数递减至<128 |
| 总线关闭 | TEC>255 | 完全脱离总线 | 软件复位或128次总线空闲 |
2.4.3 案例拆解:CANopen从站总线关闭的排障过程
在某CANopen伺服驱动系统中,从站设备在运行约30分钟后频繁出现通信中断。通过CAN分析仪抓取总线数据,发现从站发送的报文出现大量CRC错误和位错误,随后从站进入总线关闭状态。排障过程如下:首先检查终端电阻,发现总线末端的一个120Ω电阻虚焊,导致信号反射加剧;其次检查线缆长度,发现实际布线长度约80m,但通信速率设置为1Mbps,超出该速率下的最大总线长度(40m);最后检查收发器供电,发现CAN收发器的VCC引脚纹波达到200mV,影响信号质量。解决方案:重新焊接终端电阻,将通信速率降至500kbps(允许总线长度100m),并在收发器电源引脚增加10μF+100nF去耦电容。修改后系统连续运行72小时无通信故障。
2.5 位定时与同步:采样点与波特率配置
2.5.1 核心原理:位时间的四段结构
CAN总线的一个位时间(Bit Time)由四个段组成:同步段(Sync_Seg)固定为1个时间量子(TQ),用于同步总线上的所有节点;传播段(Prop_Seg)用于补偿物理传输延迟和节点内部延迟,长度可配置为1~8个TQ;相位缓冲段1(PS1)和相位缓冲段2(PS2)用于补偿边沿相位误差,PS1可配置为1~8个TQ,PS2可配置为1~8个TQ。采样点位于PS1和PS2的交界处。位时间 = 同步段 + 传播段 + PS1 + PS2 = 1 + Prop_Seg + PS1 + PS2(单位:TQ)。波特率 = 系统时钟频率 / (预分频值 × 位时间TQ数)。
2.5.2 同步机制:硬同步与重同步
CAN总线有两种同步方式:硬同步发生在帧起始(SOF)的下降沿,所有节点强制将位时间重新对齐到同步段;重同步发生在帧内其他边沿,节点根据边沿与预期采样点的相位误差,调整PS1或PS2的长度(通过同步跳转宽度SJW限制调整量)。SJW的取值范围为1~4个TQ,且必须小于等于PS2的最小值。合理的位定时配置应使采样点位于位时间的75%~85%处,这样既能保证在信号稳定后采样,又能容忍一定的时钟漂移。
2.5.3 操作流程:基于STM32的CAN位定时计算
以STM32F407的bxCAN外设为例,其APB1时钟为42MHz,CAN外设时钟为42MHz。若需配置500kbps波特率,可按以下步骤计算:
// 目标:500kbps,采样点≈80%
// 步骤1:确定预分频值 BRP
// 42MHz / (BRP+1) = TQ频率
// 设 BRP=3,则 TQ频率 = 42/4 = 10.5MHz,TQ时间 = 95.24ns
// 步骤2:确定位时间TQ数
// 位时间 = 1/500kbps = 2000ns
// TQ数 = 2000 / 95.24 ≈ 21
// 步骤3:分配各段(1 + Prop + PS1 + PS2 = 21)
// 同步段=1,传播段=3,PS1=13,PS2=4
// 采样点 = (1+3+13)/21 = 80.95% ✓
// 步骤4:配置寄存器
// CAN_BTR = (BRP-1) | (SJW-1)<<24 | (TS1-1)<<16 | (TS2-1)<<20
// 即 CAN_BTR = 3 | (1-1)<<24 | (16-1)<<16 | (4-1)<<20
// 注意:TS1 = Prop_Seg + PS1 = 3+13 = 16,TS2 = PS2 = 4
2.5.4 常见误区与调试建议
位定时配置是CANopen设备开发中最容易出问题的环节之一。常见误区包括:采样点设置过晚(>90%)导致信号边沿附近的噪声被采样;SJW设置过大导致同步过度,引入额外抖动;不同节点的位定时参数不一致导致同步失败。在调试时,建议使用示波器测量CAN_H和CAN_L的差分波形,观察显性电平的稳定时间和边沿抖动。如果波形出现振铃或过冲,应检查终端电阻和线缆质量;如果采样点附近出现毛刺,应调整采样点位置或降低波特率。