CAN协议详解
一、CAN 总线概述
定义:CAN 是一种多主方式的串行通讯总线,具有高位速率、高抗电磁干扰性,能检测出任何错误。传输距离 10km 时仍可达 50Kbps。
原理:CAN 不是以时钟信号同步,是一种异步通讯。仅靠 CAN_High 和 CAN_Low 两条信号线,以差分信号形式通讯。
二、物理层
2.1 闭环总线(高速 · ISO11898)
最大长度 40m,最高速率 1Mbps
总线两端各并联一个 120Ω 电阻(防止回波反射、平衡电压)

2.2 开环总线(低速 · ISO11519-2)
最大长度 1km,最高速率 125Kbps
每根总线串联 2.2kΩ 电阻(防止回波反射)

2.3 通讯节点
每个节点 = CAN 控制器 + CAN 收发器:
控制器 ←─ CAN_Tx/Rx (TTL) ──→ 收发器 ←─ CAN_H/L (差分) ──→ 总线
CAN 不对节点地址编码,而是对数据内容编码,节点数量理论上不限。
2.4 差分信号
两根信号线振幅相等、相位相反,用电压差值表示逻辑:

Pasted image 20260316134111.png
优势:
共模噪声完全抵消:当外界存在噪声干扰时,几乎会同时耦合到两条信号线上,而接收端只关心两个信号的差值,所以外界的共模噪声可以被完全抵消。
对外电磁辐射互相抵消(双绞线原理): 能有效抑制它对外部的电磁干扰,同样的道理,由于两根信号的极性相反,他们对外辐射的电磁场可以相互抵消,耦合的越紧密,泄放到外界的电磁能量越少。
开关变化发生在两线交点,时序精准,适合低幅度信号
三、协议层
3.1 帧结构
标准帧 vs 扩展帧
标准帧:SOF → ID(11位) → RTR → IDE=0 → r0 → DLC → DATA → CRC → ACK → EOF
扩展帧:SOF → ID(11位) → SRR → IDE=1 → ID(18位) → RTR → r1,r0 → DLC → DATA → CRC → ACK → EOF

遥控帧
无数据段,RTR=1(隐性)。用于低速设备主动请求数据:先发遥控帧,对方再回数据帧。适用于低频设备,避免拖慢总线。

既然可以互相通信,那么总有时钟慢的,这样会拖垮整个总线的速度,那么我就让慢的平时不广播,接收方需要的时候,给他发送一个遥控帧,然后遥控数据方发送数据。但是这种情况只适用于使用频率低的设备,因为一来一回也浪费总线资源。
其他帧



3.2 位填充
规则:发送方每连续 5 个相同电平,自动插入一个相反电平。接收方自动移除。
作用:
增加跳变沿密度,利于再同步
区分错误帧和过载帧
防止长时间无变化被误判为空闲(连续 11 个隐性 = 空闲)
三、接收方数据采样
通过约定波特率确定数据位的时长
采样点一般建议在中心位偏后,并不会对齐
常见问题:
3.3 位时序
把一个数据位分为 4 段:
采样点在 PBS1 和 PBS2 之间,一般偏后
每个段由若干 Tq(最小时间单位)组成
如果跳变沿正好出现在SS段,那么说明同步正确,若出现在其他段,则需要调整同步
PTS用来等待物理上的延时
确定采样点的位置,在pbs1与pbs2中间

3.4 同步机制

硬同步
接收方收到 SOF 下降沿时,强制将自己的位时序拨到 SS 段,与发送方对齐。
经过硬同步,此时帧结构秒表全部对齐,那么正常情况下不会出现问题,但是设备间有差异,会出现偏移,那么我们引出再同步
再同步
若发送方或接收方时钟有偏差,随着误差积累,此时又会偏移SS段,此时接收方根据再同步补偿宽度指(sw)通过控制PBS1和PBS2的宽度,以实现再同步
通过 SJW(再同步补偿宽度,1~4Tq)调整 PBS1/PBS2 宽度:
跳变沿滞后 → 延长 PBS1
跳变沿提前 → 缩短 PBS2
再同步依赖位填充机制提供的跳变沿。

发送方发送数据,此时接收方发现下降沿不在ss段,此时强制设置此时为SS段与发送方同步
3.5 仲裁机制
先来后到:总线空闲(连续 11 个隐性位)才能发送
非破坏性仲裁:多个节点同时发送时,逐位比较 ID,输出隐性却被读到显性的自动退让
线与特性:任一节点输出 0 则总线为 0,全输出 1 才为 1
回读机制:发送方发完一位立即回读,确认是否真的发出去了
3.6 错误处理

3.7 错误状态(信誉机制)
上述错误,接收方和发送方的所有设备都在检测该CAN总线的波形,那么如果一旦出现某一个设备发生故障,一直认为当前线路数据错误,破坏数据,将会导致全面瘫痪,因此引出错误状态。
信誉机制:
1.主动错误状态的设备正常参与通信并在检测到错误时发出
2.主动错误帧被动错误状态的设备正常参与通信但检测到错误时只能发出被动错误帧
3.总线关闭状态的设备不能参与通信
4.每个设备内部管理一个TEC(发送错误计数器)和REC(接受错误计数器),根据TEC和REC的值确定自己的状态,用这两个数据来反映相对的报错频率

四、其他
1.在2026/08/24发现,当CAN总线不设置120欧姆电阻或只设置一个120欧姆电阻时,无法正常通信!
受限于个人水平,文中难免有理解不到位或笔误之处。恳请各位大佬不吝赐教,欢迎邮件交流:sharkey_z@163.com
