CAN协议核心原理:从物理层到数据链路层
二、CAN协议核心原理:从物理层到数据链路层
2.1 物理层:信号的传输与电气特性
物理层是CAN协议的“物理基础”,定义了信号如何在总线上传输、电气参数如何设计,以及节点如何连接到总线。它直接决定了通信的可靠性、抗干扰能力和传输距离。
2.1.1 拓扑结构与线缆
CAN采用总线型拓扑(Bus Topology),所有节点通过一条共享的总线(双绞线或同轴电缆)连接,无主从之分。这种设计的优势在于:
- 简化布线:所有节点只需连接到总线的两个端点,无需复杂的分支或星型连接;
- 可靠性高:单点故障(如某段线缆损坏)不会导致整个网络瘫痪(除非断开总线两端);
- 电气匹配简单:总线型拓扑便于实现终端阻抗匹配(见下文)。
典型线缆选择:
- 双绞线:最常用(如屏蔽双绞线STP),通过两根导线绞合降低电磁干扰(EMI),适用于大多数工业和汽车场景(传输速率≤1Mbps时,最大距离40米;速率≤500kbps时,最大距离1公里);
- 同轴电缆:用于高速场景(如CAN FD或实验室测试),抗干扰能力更强,但成本较高;
- 单线传输:仅在短距离、低速场景中使用(如部分低成本传感器),需额外保护电路。
终端电阻的必要性:
总线型拓扑需在总线的两个端点各接一个120Ω终端电阻(与双绞线特性阻抗匹配)。若缺少终端电阻,信号会在总线末端发生反射(类似声波在山谷的回声),导致信号畸变、误码率升高。例如,汽车CAN网络的总线两端(如发动机舱和驾驶舱)必须各接一个120Ω电阻,否则高速通信(如500kbps以上)会出现频繁错误。
终端电阻的数值与双绞线的间距、内径、电磁常数有关,可以根据数学公式推到而出;
同时,终端电阻仅要求在高速can中使用,低速can并无强制规定;
终端电阻的连接图如下:
参考原文:https://blog.youkuaiyun.com/tjcwt2011/article/details/140932387
2.1.2 电气信号与编码
CAN的电气信号采用差分传输(Differential Signaling),即通过两根导线(CAN_H和CAN_L)传输互补的电压信号。这一设计与传统单端信号(如RS-485)有本质区别。
差分信号的优势:
- 抗共模噪声:外界干扰(如电机电火花、点火系统的电磁脉冲)会同时叠加到CAN_H和CAN_L上,形成“共模噪声”。由于接收端检测的是两者的差值(CAN_H - CAN_L),共模噪声会被抵消,有效提升抗干扰能力(汽车环境中可抵抗±30V瞬态干扰);
- 逻辑电平清晰:
- 显性位(Dominant,逻辑0):CAN_H电压比CAN_L高≥0.9V(典型值为CAN_H=3.5V,CAN_L=1.5V);
- 隐性位(Recessive,逻辑1):CAN_H与CAN_L电压相等(典型值为2.5V,差值≤0.5V)。
显性位具有“优先性”——若总线上同时出现显性位和隐性位,最终表现为显性位(类似“线与”逻辑)。
2.1.3位时序与同步:时间划分与示意图
位速率与波特率
- 位速率(也叫做比特率): 表示的是单位时间内,总线上传输的信息量,即每秒能够传输的二进制位的数量,R=1/T ,单位是bit per second,bps。比如,比特率为8bit/s,意思为一秒传输了8bit,包含了8个二进制事件的信息量。
- 波特率(码元传输速率):表示单位时间(1s)内传输的码元个数(脉冲个数或者信息变化次数),码元可以是多进制的;kBaud(1baud=1bit/second, 1KBaud=1KB=1000bits/second)(码元:就是一个脉冲信号,一个脉冲信号有可能携带1bit数据,也有可能携带2、4bit)
CAN的位时序通过将每个位周期(Bit Time)划分为多个时间片段,确保节点间时钟同步并补偿物理延迟与时钟偏差。以下是详细的时间划分与同步机制:
位时间划分(以25 TQ为例)
每个位周期由 4个核心段 组成,总时间单位为 时间份额(Time Quantum, TQ),具体划分如下(参考ISO 11898标准):
段名称 | 时间份额(TQ) | 作用 | 可调范围 |
---|---|---|---|
同步段(Sync_Seg) | 1 TQ | 用于同步节点间时钟,检测总线起始位(SOF)的下降沿。 | 固定为1 TQ |
传播段(Prop_Seg) | 1~8 TQ | 补偿信号在总线上的物理传输延迟(如导线长度、节点距离)。 | ≥2倍总线传输延迟 |
相位缓冲段1(PBS1) | 1~8 TQ | 允许接收端调整采样点位置,补偿时钟偏差(如延长或缩短以对齐边沿)。 | 可配置为1~8 TQ |
相位缓冲段2(PBS2) | 2~8 TQ | 与PBS1配合补偿时钟偏差(如缩短PBS2以抵消PBS1的延长)。 | ≥PBS1或数据处理时间 |
示例配置(总位时间=25 TQ):
- Sync_Seg=1 TQ
- Prop_Seg=2 TQ
- PBS1=8 TQ
- PBS2=14 TQ
- 采样点位置:位于PBS1结束处(即第1+2+8=11 TQ处)
同步机制详解
1. 硬同步(Hard Synchronization)
- 触发条件:总线空闲时检测到起始位(SOF)的下降沿(CAN_L从高→低)。
- 操作:强制将本地时钟的同步段(Sync_Seg)对齐到SOF下降沿,重置位时序计数器。
- 目的:确保所有节点在帧起始时同步,避免因时钟偏差导致后续位采样错误。
2. 重新同步(Resynchronization)
- 触发条件:在数据帧或远程帧传输过程中,检测到总线边沿(上升沿/下降沿)与本地时钟预期的边沿不匹配。
- 操作:
- 相位超前(接收端时钟滞后):延长PBS1段,使采样点后移以对齐总线边沿。
- 相位滞后(接收端时钟超前):缩短PBS2段,使采样点前移以对齐总线边沿。
- 限制:单次同步调整幅度不超过 同步跳转宽度(SJW, Synchronization Jump Width)(通常≤4 TQ)。
同步机制示意图(文本描述)
位周期划分(总位时间=25 TQ):
|<---Sync_Seg=1 TQ--->|<--Prop_Seg=2 TQ-->|<--PBS1=8 TQ-->|<--PBS2=14 TQ-->|
↑ ↑ ↑ ↑
| | | |
0 TQ 3 TQ 11 TQ 25 TQ
关键点说明:
- 采样点:位于PBS1结束处(11 TQ),是接收端读取总线电平的位置。
- 同步跳转:若总线边沿偏离采样点,通过调整PBS1/PBS2使下一位的采样点回归理想位置。
- 误差补偿:
- 边沿滞后(接收端时钟快):缩短PBS2(如原PBS2=14→12),补偿+2 TQ。
- 边沿超前(接收端时钟慢):延长PBS1(如原PBS1=8→10),补偿+2 TQ。
同步示例(时钟偏差补偿)
假设发送端与接收端时钟偏差为 +1 TQ(接收端时钟快):
- 检测到边沿滞后:接收端发现总线下降沿比预期晚1 TQ。
- 调整PBS1:在下一位时序中,将PBS1延长1 TQ(如原PBS1=8→9)。
- 补偿效果:采样点后移1 TQ,与总线边沿对齐。
限制:若偏差超过SJW(如SJW=2),则无法完全补偿,需通过调整预分频系数(Prescaler)优化位时间配置。
同步机制的意义
- 抗时钟偏差:通过动态调整PBS1/PBS2,容忍±1 TQ至±4 TQ的时钟误差(取决于SJW)。
- 抗物理延迟:传播段(Prop_Seg)补偿信号在总线上的传输延迟(如长距离通信)。
- 稳定性保障:避免因时钟不同步导致的数据错误,确保CAN总线的高可靠性。
通过合理配置位时间参数(Sync_Seg、Prop_Seg、PBS1、PBS2)和同步策略,CAN协议在分布式系统中实现了高效、可靠的通信。
例如,发送端和接收端的晶振频率存在微小差异(如±1%),经过多个位周期后,两者的位时序会逐渐失步。重新同步机制通过插入或删除“补偿间隔”(Bit Stuffing,见下文),强制对齐位时序,确保通信正确。
2.2 数据链路层:通信的“规则引擎”
数据链路层是CAN协议的“大脑”,负责管理节点间的通信规则、冲突解决、错误检测和数据传输。它定义了帧结构(如何封装数据)、仲裁机制(多主竞争的解决)、错误处理(如何检测和恢复错误)等核心功能。
2.2.1 帧结构:数据的“包装盒”
CAN协议定义了5种帧类型(Frame Types),但最常用的是数据帧(Data Frame,携带有效数据)和远程帧(Remote Frame,请求数据),错误帧(Error Frame)和过载帧(Overload Frame)用于异常处理。以下是各类帧的格式与作用:
(1)数据帧(Data Frame):通信的核心
数据帧的结构分为7个场(Field),从左到右依次为:仲裁场→控制场→数据场→CRC场→ACK场→结束场。
场名称 | 长度(位) | 功能描述 |
---|---|---|
仲裁场 | 11/29 | 包含11位标准ID或29位扩展ID(ID+IDE位+SRR位),用于标识数据优先级和来源。 |
控制场 | 6 | 前2位为保留位(RB0/RB1),后4位为数据长度码(DLC,0~8字节)。 |
数据场 | 0~64 | 实际传输的数据(标准CAN为0~8字节,CAN FD支持0~64字节)。 |
CRC场 | 15 | 循环冗余校验码,用于检测数据传输中的位错误(基于多项式x¹⁵+x¹⁴+…+1)。 |
ACK场 | 2 | 发送方插入的2位(第1位为ACK槽,第2位为ACK界定符)。接收方若正确接收数据,会在ACK槽发送显性位(0)。 |
结束场 | 7 | 7位连续隐性位(1),标志数据帧结束。 |
示例:一个标准CAN数据帧(ID=0x123,DLC=4,数据=0xAA,0xBB,0xCC,0xDD)的仲裁场为0b0000000100100011(11位ID),控制场为0b00000100(DLC=4),数据场为0xAABBCCDD,CRC场为根据这些数据计算出的15位校验码。
(2)远程帧(Remote Frame):请求数据的“信号弹”
远程帧用于节点向其他节点请求发送特定ID的数据。它的结构与数据帧类似,但无数据场,且RTR位(远程发送请求位)为隐性(1)(数据帧的RTR位为显性0)。
例如,节点A需要获取节点B的温度数据(ID=0x456),会发送一个远程帧:仲裁场为0x456,RTR位=1,DLC=2(表示希望接收2字节数据)。节点B收到后会发送一个数据帧(ID=0x456,数据场为温度值)。
(3)错误帧(Error Frame):通信的“急救信号”
当节点检测到总线上的错误(如位错误、CRC错误),会立即发送错误帧,强制所有节点停止当前通信并重新同步。错误帧由两部分组成:
- 错误标志(Error Flag):6位连续显性位(0),覆盖总线上的所有其他信号;
- 错误界定符(Error Delimiter):8位隐性位(1),用于分隔错误标志和后续通信。
错误帧的触发条件将在2.2.3节详细说明。
(4)过载帧(Overload Frame):流量控制的“缓冲垫”
过载帧用于通知总线上的其他节点:“我暂时无法接收更多数据,请稍后再发”。它的结构与错误帧类似(6位显性位+8位隐性位),但仅在节点接收缓冲区已满时发送(例如,节点正在处理大量数据,无法及时解析新报文)。
2.2.2 仲裁机制:多主竞争的“公平法则”
CAN是多主通信协议,任何节点均可主动发送数据。当多个节点同时发送数据时,总线会通过仲裁机制决定哪个节点获得发送权。仲裁的核心是“ID优先级”和“显性位覆盖隐性位”的电气特性。
(1)仲裁原理:线与逻辑的胜负判定
所有发送节点的信号在总线上以“线与”(Logical AND)方式叠加:若某一位有至少一个节点发送显性位(0),总线最终表现为显性位(0);只有所有节点都发送隐性位(1),总线才表现为隐性位(1)。
仲裁过程逐位比较(从仲裁场最高位开始,到最低位结束):
- 若某一位中,节点A发送显性位(0),节点B发送隐性位(1),则节点A获胜(总线为0),节点B退出竞争;
- 若所有已参与仲裁的节点在该位都发送显性位(0),则继续比较下一位;
- 直到某一位只有一个节点发送显性位,该节点获得总线控制权,继续发送剩余位;若所有位都相同(所有节点发送相同的ID),则发送节点正常完成数据帧。
(2)ID优先级:数值越小,优先级越高
CAN的ID(11位或29位)直接决定优先级:ID值越小,优先级越高。例如,ID=0x001的节点优先级高于ID=0x002的节点。
- 标准帧(11位ID):ID范围0~0x7FF(2047个唯一ID);
- 扩展帧(29位ID):ID范围0~0x1FFFFFFF(约2亿个唯一ID),通过IDE位(标识符扩展位)区分标准帧(IDE=0)和扩展帧(IDE=1)。
(3)仲裁的实际影响
- 高优先级ID的设计:关键任务(如刹车信号)应分配低ID(如0x001),确保其报文优先发送,避免被低优先级数据(如车窗控制,ID=0x7FF)延迟;
- 仲裁的透明性:节点无需主动参与仲裁(仅需按位发送数据),仲裁过程由总线电气特性自动完成,对应用层完全透明。
2.2.3 错误检测与恢复:通信的“免疫系统”
CAN协议内置了完善的错误检测机制,确保通信的可靠性。它定义了5种错误类型,并通过错误计数器(TEC发送错误计数器、REC接收错误计数器)和错误状态(错误主动、错误被动、总线关闭)实现自动恢复。
(1)错误类型与检测
错误类型 | 触发条件 | 检测机制 |
---|---|---|
位错误 | 发送节点检测到总线电平与自己发送的电平不一致(如发送显性位,但总线为隐性)。 | 发送节点在发送每一位时,实时比较总线电平与本地输出电平。 |
填充错误 | 数据场中出现连续6个相同位(违反位填充规则)。 | CAN协议规定:连续5个相同位后必须插入1个相反位(位填充)。若违反此规则,接收节点判定为填充错误。 |
CRC错误 | 接收节点计算的CRC校验码与发送节点提供的CRC码不一致。 | 发送节点在数据场后附加15位CRC码(基于数据场计算);接收节点重新计算并比对。 |
格式错误 | 固定格式的场(如CRC界定符、ACK界定符、结束场)出现非法位(如结束场出现显性位)。 | 这些场的格式是固定的(如CRC界定符必须是8位隐性位),违反即触发格式错误。 |
确认错误 | 发送节点未在ACK槽(ACK场第1位)检测到显性位(0)。 | 接收节点若正确接收数据,会在ACK槽发送显性位;发送节点未收到则判定为确认错误。 |
(2)错误计数器与状态转换
每个节点维护两个计数器:
- TEC(Transmit Error Counter,发送错误计数器):记录发送错误的次数(每次位错误、填充错误、CRC错误、确认错误均会增加TEC);
- REC(Receive Error Counter,接收错误计数器):记录接收错误的次数(仅接收错误会增加REC)。
错误状态机的工作规则:
- 错误主动(Error Active):TEC < 128且REC < 128。节点可正常发送数据,若检测到错误,发送错误帧;
- 错误被动(Error Passive):TEC ≥ 128或REC ≥ 128。节点发送数据时需插入8个隐性位(“延迟传输”),避免干扰总线;
- 总线关闭(Bus Off):TEC > 255。节点完全退出总线通信,需通过软件复位或硬件重启恢复。
示例:节点A发送数据帧时,因总线干扰导致某一位发送显性位但总线为隐性(位错误),TEC加8(初始值为0,变为8)。若后续再次发生填充错误(TEC加8,变为16),节点仍处于错误主动状态。若TEC持续增加至128,节点进入错误被动状态,发送数据时会插入延迟位;若TEC超过255,节点被关闭,需人工干预重启。
小结:物理层通过差分信号、终端电阻和位时序确保信号可靠传输;数据链路层通过仲裁机制解决多主竞争,通过错误检测与恢复保障通信质量。两者共同构建了CAN“高可靠、强实时”的核心特性。