没志青年
发布于 2025-06-13 / 27 阅读
0

CAN 总线协议

基础概念

CAN(Controller Area Network),控制器局域网络,是一种多主串行通信协议。

CAN 总线使用双绞线进行差分信号传输,抗干扰能力强。

异步、串行、半双工。

低速 CAN

高速 CAN

传输速度

10 ~ 125 kbps

125 kbps ~ 1 Mbps

传播距离

< 1 km

< 40 m

协议标准

ISO11519

ISO11898

高速 CAN 为闭环网络,总线两端需接120 欧姆的终端电阻,作用:

  • 用于匹配阻抗,减少信号回波反射。

  • 无状态下“收紧”两根差分线,使值默认为1。

低速 CAN 为开环网络,线上要接 2.2k 电阻。

电平定义

电压差为 CAN_H - CAN_L

(1)高速 CAN

  • 显性电平 0:电压差 2 V

  • 隐性电平 1:电压差 0 V

(2)低速 CAN

  • 显性电平 0:电压差 3 V

  • 隐性电平 1:电压差 -1.5 V

必须掌握的帧格式

  • 数据帧:传输数据。

  • 遥控帧:请求别人发送数据给自己。

数据帧

标准格式:

符号

字段

占用位数

说明

控制

SOF

起始符

1

值为 0,标志帧的开始

发送者

ID

RTR

标识符

11

定义消息的优先级

发送者

远程请求位

1

0 数据帧,1 遥控帧

发送者

IDE

R0

DLC

标识符扩展位

1

标准格式中必须为 0,表示当前为标准格式报文

发送者

保留位

1

值为 0,暂时用不到,为后续协议升级留下空间

发送者

数据长度

4

指示数据段有多少字节

发送者

DATA

数据段

0 ~ 64

载荷,实际传输的数据

发送者

CRC

CRC

CRC 校验值

15

用于校验数据是否正确传输

发送者

CRC 界定符

1

值为 1,用于分隔字段,确保帧格式正确。

发送者

ACK

ACK

应答位

1

判断数据是否被接收方接收

接收者

ACK 界定符

1

值为 1,用于分隔字段,确保帧格式正确。

发送者

EOF

结束符

7

7 个 1,标志帧的结束

发送者

拓展格式和标准格式的区别:

  • 多了 SRR 位。SRR 只用于仲裁,无其他功能。值为 1,因此标准格式的优先级大于拓展格式。

  • IDE 默认值为 1,表示是拓展格式。

  • ID 拓展了 18 位,加上原来的 11 位,共 29 位。

  • 多了 R1 保留位,值为 0,暂时用不到,为后续协议升级留下空间。

遥控帧

不传输数据,仅请求数据。

  • RTR 位为 1

  • DLC 字段表示请求的数据长度

  • 无 DATA 数据域

了解既可的帧格式

为什么说这些帧格式了解既可呢,因为我们不是做硬件的。

这些由硬件自动完成,软件无法控制,也不需要控制,这上面没有我们所需要的信息。

这些帧格式用于调节 CAN 总线数据传输。

  • 错误帧:用于当检测出错误时向其它单元通知错误的帧。 (硬件自动完成)

  • 过载帧:当一个节点正忙于处理接收的信息,可以通知其它节点暂缓发送新报文。(硬件自动完成)

  • 帧间隔:用于将数据帧及遥控帧与前面的帧分离开来的帧(硬件自动完成)

错误帧

过载帧

帧间隔

CAN 总线仲裁

ID 小的报文优先级高,因为先拉低。

同步机制

没有时钟线,接收方该如何精准的采样。

可能存在时钟误差,累积误差,造成读到的数据都是错误的。

采样点的初始位置没对齐。


存在的问题:

由于 CAN 是异步通信,没有时钟线,设备的时钟并不是精准的。

问题1:

问题2:

解决问题1: 使用【硬同步】,1帧数据只同步一次。

解决问题2使用【再同步】