CAN通信的协议层原理
2026/6/26 7:06:28 网站建设 项目流程

0.先明确:CAN 只有两层且只有两根线

  • 物理层:电压、线、收发器(TJA1050)

  • 数据链路层(协议层)

CAN 采用差分信号传输,两根线分别叫CAN_H(高电平线)CAN_L(低电平线),通过两根线的电压差来表示逻辑 0 和 1

总线状态CAN_H 对地电压CAN_L 对地电压两根线压差对应逻辑
隐性(空闲)约 2.5V约 2.5V≈ 0V逻辑 1
显性(发数据)约 3.5V约 1.5V≈ 2V逻辑 0

CAN 总线是线与逻辑

  • 显性电平(逻辑 0)只要有任意一个节点拉低,总线就是 0

  • 隐性电平(逻辑 1)所有节点都不拉,总线才是 1

1.通信开始:帧起始 SOF


空闲时总线一直是隐性1,此时任何节点想发送数据首先要发送一位显性0
所有节点一看到总线从 1 → 0,就知道:有设备要发一帧数据了,准备接收。

2.最核心:仲裁段

IDE:标准帧(11位ID) / 扩展帧(29位ID)

仲裁段的作用:为了区分当多个设备节点同时开始发送数据时,到底听谁的?

每个节点都有属于自己的优先级ID“ID 越小,优先级越高

多个节点同时开始发,进入逐位仲裁

  1. 每个节点一边发,一边监听总线上的实际电平

  2. 节点想发1,但总线是0→ 说明别人发了优先级更高的帧 → 自己立即停止发送,转为接收

  3. 想发 0,总线也是 0 → 继续发

这个比较过程是由每个 节点CAN 控制器硬件自己完成的

总结:

  • 发 1 却读到 0 → 自己输了,退出

  • 发 0 永远不会输→ 所以ID 里 0 越多,优先级越高ID 数值越小,优先级越高

3. 控制段:告诉大家这一帧有多少数据

DLC:数据长度码(0~8)

告诉所有节点:接下来我要发 N 个字节的数据。

4. 数据段:真正的信息

就是接下来要发的N个字节的数据:0~8 字节

5. CRC 段:校验是否传错

发送节点计算 CRC,发到总线上。所有接收节点自己也算一遍 CRC

如果不一样 → 判定错误,后面会触发错误帧。

6. ACK 段:有没有人收到?

  • 发送节点先发送隐性 1

  • 任何一个节点正确收到,就拉成显性 0

  • 发送节点检测到总线是 0 → 知道“至少有一个节点收到了”

注意:CAN 不指定发给谁,只要有人收到就算成功。它是广播,不是点对点。

7. 帧结束 EOF

发送 7 个连续隐性位 1,表示一帧结束

总线回到空闲状态。

完整流程大致如下:

  1. 节点A想发帧

  2. 检测总线空闲 → 发 SOF(0)

  3. 进入仲裁,可能和节点B同时发

  4. 逐位比较 ID → A获胜,B退出

  5. A发控制段(DLC=3)

  6. A发 3 字节数据

  7. A发 CRC

  8. A在 ACK 槽发 1

  9. 节点C收到正确 → 拉成 0

  10. A看到 0 → 知道发送成功

  11. A发 EOF → 一帧完成

需要专业的网站建设服务?

联系我们获取免费的网站建设咨询和方案报价,让我们帮助您实现业务目标

立即咨询