当前位置: 首页 > ops >正文

Controller Area Network (CAN) 通信机制简介

目录

1. CAN 概述

2. 物理结构与传输机制

3. 消息格式与仲裁机制

4. 错误检测与总线状态

5. 工业用 CAN 接口

6. 本讲总结


1. CAN 概述

CAN(Controller Area Network)是由德国博世(Bosch)公司于 1983 年提出的串行通信协议,最初用于汽车内部多个电子控制单元(ECU)之间的数据通信。CAN 总线有以下特点:

  • 多主结构:任意节点都可以在总线空闲时发起通信,支持分布式控制系统;

  • 实时性高:通过优先级仲裁机制保证高优先级信息的快速响应;

  • 通信可靠性强:内置多重错误检测机制;

  • 抗干扰性强:差分信号传输 + 双绞线结构;

  • 应用广泛:除汽车外,在工业自动化、电梯、轨道交通、医疗设备等领域被大量采用。

CAN 在工业发展中已经进行过多次的升级和演进。最初的 Classic CAN(标准 CAN)支持最大数据帧为 8 字节。Bosch 在 2012 年推出了 CAN FD(Flexible Data Rate),为标准 CAN 的增强型协议,支持高达 64 字节数据,速率提升到 5Mbps。CANopen SAE J1939 是基于 CAN 的上层协议,提供数据组织和设备管理规范。

2. 物理结构与传输机制

CAN 在物理层采用差分信号传输,即 CAN_H(高线)CAN_L(低线)之间的电压差来表示逻辑状态,理论上用双绞线就可以实现,如下图所示:

差分电压信号分为显性与隐性信号两种,分别代表逻辑 0 和 1,如下表所示:

状态CAN_HCAN_L差值逻辑
显性(Dominant)~3.5V~1.5V~2V逻辑 0
隐性(Recessive)~2.5V~2.5V~0V逻辑 1

CAN 将信号转换成一系列的电压差来进行传送。CAN 通常为 总线型结构,两端会接 120Ω 终端电阻,吸收信号反射,如下图所示:

CAN 总线的最大传输距离是和传输速率(波特率)有直接关系的,下表根据经验给出了一个大概的关系:

波特率最大距离(理论)
1 Mbps40 米
500 kbps100 米
125 kbps500 米

实际应用中,传输距离受很多因素影响。但是我们可以看到速率越高,支持的距离会越短。

3. 消息格式与仲裁机制

CAN 采用 帧格式 来组织通信数据。每一帧都是广播的,所有节点都能接收,根据 ID 来决定是否处理。CAN 常用的帧类型有以下四种:

类型用途
数据帧正常通信的数据负载传输
远程帧请求其他节点发送某类数据
错误帧报告帧错误(由接收/发送节点主动发送)
过载帧通知总线稍等片刻(如缓存溢出)

这里我们重点介绍一下数据帧。数据帧的结构如下图所示:

这里进行一下简单的介绍:

  • 标识符(ID):代表消息类型,也决定优先级(数值越小优先级越高);

  • RTR 位:区分数据帧和远程帧;

  • CRC(校验):检测传输错误;

  • ACK(响应):确认接收响应位。

  • Data(数据): 传输的数据,最高8字节。

CAN(Controller Area Network)总线的仲裁机制是一种非破坏性位仲裁方式。当多个节点几乎同时开始发送数据时,它们会在发送过程中监视总线电平。CAN 使用“优先级”机制:帧的标识符越小,优先级越高。发送过程中,如果某个节点发送的是显性位(0)而检测到的是隐性位(1),说明有更高优先级的消息正在传输,该节点会立即停止发送,从而实现无冲突的仲裁和总线访问控制。

4. 错误检测与总线状态

CAN 协议对错误处理十分严格,具备多级检测与恢复机制。CAN 有五种错误检测机制:

  1. 位错误(Bit Error):发送位与检测到的位不同;

  2. 填充错误(Stuff Error):违反“5 个相同位后自动插入反位”规则;

  3. CRC 错误:校验字段不匹配;

  4. 格式错误(Form Error):帧结构字段异常;

  5. ACK 错误:期望有节点应答却未收到 ACK。

如果发现错误,CAN 还有不同的错误处理机制,比如:

  • 主动错误帧(Active Error Frame):节点发现错误并通知所有节点;

  • 被动错误帧(Passive Error Frame):错误次数过多后被动报告,不再主动干扰总线;

  • 总线关闭(Bus-Off):连续错误严重,节点完全断开,不再参与通信(例如失控 ECU);

CAN 的错误检测与总线状态是个很重要的话题,我们这里不做过多的介绍,之后会单独开一篇教程讲解不同的错误检测机制。

5. 工业用 CAN 接口

虽然 CAN 总线只需要两根信号线(CAN_H 和 CAN_L) 进行通信,但在实际设备或开发板上的CAN 接口会出现多个“插头”或“针脚”,额外的“头”不仅用于信号线,还包括供电、接地、终端电阻控制、备用信号或诊断功能等,见下表:

接口引脚用途说明
CAN_H差分信号:高线
CAN_L差分信号:低线
GND(接地)电源地线,用于参考和抗干扰
V+ / Vbat电源供电(如 12V/24V)
STB / EN芯片工作/待机控制信号(控制 CAN 芯片开关)
RS可调终端电阻设置(如 SN65HVD230 有此功能)
NC预留 / 未接

在使用的时候,要根据具体情况具体分析,并仔细阅读使用手册和文档。

6. 本讲总结

在这篇博文中,我们简单的介绍了 CAN 的基本原理,网络结构,数据传输和仲裁机制,我们在之后的博文中,针对部分内容,进行更深入的解析。

参考文献:

1. can口9针定义_can口定义-CSDN博客

2. 常用通信接口电气特征(六):CAN_can接口-CSDN博客

3. 详解CAN总线:常用CAN连接器的使用方法_dsub9 can-CSDN博客

http://www.xdnf.cn/news/14491.html

相关文章:

  • 解决Matplotlib三维图无法旋转的问题
  • springboot入门之路(一)
  • Spring MVC 处理静态资源请求 - ResourceHandler
  • [Jenkins在线安装]
  • 为什么会出现 make 工程管理器?它到底能做什么?
  • Arduino入门教程:10、屏幕显示
  • python大学校园旧物捐赠系统
  • Linux操作系统之进程(六):进程的控制(上)
  • 分治算法之归并排序
  • Day04_C语言基础数据结构重点复习笔记20250618
  • 反转链表二--LeetCode
  • Neo4j 入门到精通(Cypher语言详解)
  • 前端部署更新后,如何优雅地通知用户刷新页面?
  • OpenCV——图像形态学
  • Arrays.asList() 的不可变陷阱:问题、原理与解决方案
  • 秋招是开发算法一起准备,还是只准备一个
  • 技能系统详解(1)——技能
  • mysql 学习
  • 45-Oracle 索引的新建与重建
  • 6-16阿里前端面试记录
  • RAG 架构地基工程-Retrieval 模块的系统设计分享
  • 学习STC51单片机41(芯片为STC89C52RCRC)智能小车8(测速显示到OLED显示屏)
  • git最常用命令
  • RISC-V向量扩展与GPU协处理:开源加速器设计新范式——对比NVDLA与香山架构的指令集融合方案
  • 汽车 CDC威胁分析与风险评估
  • HTTP 请求中的 `Content-Type` 类型详解及前后端示例(Vue + Spring Boot)
  • 腾讯云国际站缩容:策略、考量与实践
  • Vue-7-前端框架Vue之应用基础从Vue2语法到Vue3语法的演变
  • C/C++中的位段(Bit-field)是什么?
  • 单片机 - STM32读取GPIO某一位时为什么不能直接与1判断为高电平?