一、CAN通信系统架构示意图
-
CAN(Controller Area Network)是一种多主机广播型串行通信协议,常用于车辆、工业等分布式控制系统中。
-
架构主要包括:
-
主控CPU:负责处理应用层逻辑。
-
CAN控制器:实现数据帧的封装、解包、仲裁等协议层操作。
-
CAN收发器(Transceiver):负责电平转换,将数字信号转换为差分信号(CANH/CANL)在物理总线上传输。
-
-
通信线路:由一对双绞线(CANH、CANL)构成,采用差分信号传输,提高抗干扰能力。
-
节点特性:所有节点并联连接在同一总线上,具备发送与接收能力,通过帧ID进行仲裁。
-
终端电阻:CAN总线两端需接120Ω终端电阻,用于阻抗匹配,防止信号反射。
图1 (含500kbps与125kbps双总线)
二. CAN通信原理概述
CAN帧格式示意图(标准格式 vs 扩展格式):CAN数据帧由帧起始、仲裁段、控制段、数据段、CRC段、ACK段和帧结束等7个部分构成。其中标准帧使用11位标识符(ID),扩展帧使用29位标识符。如上图所示,上半部分为标准帧结构,下半部分为扩展帧结构。两者的区别主要在仲裁段ID长度不同,其余部分(如数据长度码DLC、数据字段、CRC校验等)结构相同。具体字段说明如下
段名 | 位数 | 含义说明 |
---|---|---|
SOF(帧起始) | 1 位(显性位) | 标识一帧的开始,总线空闲时任意节点发送 SOF 即可发起帧传输 |
仲裁段 | 12~32 位 | 包含 ID(11位标准ID / 29位扩展ID)+ RTR(远程请求帧标志) |
控制段 | 6 位 | IDE(帧格式标志,0=标准帧,1=扩展帧)、r0/r1(保留位)、DLC(4位,表示数据字节数) |
数据段 | 0~64 位(最多8字节) | 具体传输内容,由 DLC 指定长度(0~8 字节),远程帧无此段 |
CRC段 | 16 位 | 15 位 CRC 校验码 + 1 位 CRC定界符,用于检测帧内容传输错误 |
ACK段 | 2 位 | ACK槽 + ACK定界符,接收节点在 ACK 槽发显性位表示收到数据 |
EOF(帧结束) | 7 位(隐性位) | 标识一帧的结束 |
IFS(帧间隔) | ≥3 位(隐性位) | 帧与帧之间的最小间隔时间(帧间空间),用于控制器内部处理延时 |
上述帧格式适用于数据帧和远程帧,两者唯一区别是远程帧没有数据段。除了数据帧和远程帧外,CAN总线还定义了错误帧、过载帧和帧间隔等帧类型,但这里不展开,主要聚焦正常通讯的数据帧。值得注意的是,CAN总线使用差分信号传输,逻辑上存在“显性”和“隐性”两种电平。显(Dominant)对应逻辑0,隐性(Recessive)对应逻辑1。当总线同时存在显性和隐性电平时,总线结果将呈现显性电平。显性电平优先级高于隐性电平,这是CAN总线仲裁机制的基础。
这张图是 CAN总线仲裁过程示意图,形象展示了两个节点同时发送报文时的总线仲裁机制:
-
节点1 和 节点2 同时开始发送报文,其前几位ID相同,仲裁阶段并未分出胜负。
-
当发送到第5位时:
-
节点1发送的是隐性位
1
-
节点2发送的是显性位
0
-
-
由于CAN总线的电平规则是“显性覆盖隐性”,此时总线电平为显性
0
。 -
节点1检测到总线电平与自己发送的电平不符,立即放弃发送并转为接收模式,节点2则赢得仲裁,继续完成剩下的帧发送。
底部的“总线”一行显示了此时实际的电平状态,也表明:最终总线上发送的是节点2的完整报文。
该图直观说明了ID越小(显性位越多)优先级越高的机制,并体现了CAN总线的非破坏性仲裁——仲裁失败的节点无需重发优先帧,保证了高优先级数据实时性。
仲裁是完全由硬件自动完成的,不需要你手动“比大小”或者判断。
✅ 更准确地说:
当你在代码中调用 HAL_CAN_AddTxMessage()
并指定了一个 ID
(例如 0x201
),CAN 控制器就会使用这个 ID 自动参与仲裁。如果总线上没有其他节点发送帧,你的帧就会直接发送;如果多个节点同时请求发送帧,那么:
-
控制器会从 SOF之后的每一位开始进行位级仲裁;
-
谁的 ID 先出现“显性位”(0)且别人是隐性(1),谁就保留发送权;
-
ID 越小,优先级越高,因为二进制中 0(显性) 比 1(隐性)更占优势;
-
输掉仲裁的帧,控制器会自动退让,并在下次总线空闲时重发;
-
你作为开发者无需干预这一过程,只需填好 ID 即可。
参考了csdn部分博主内容:冬瓜~