前言
本文旨在系统梳理CAN总线协议的核心知识要点。作为一名嵌入式开发者,我们经常需要与CAN总线打交道,但每次间隔一段时间后总会遗忘一些细节。因此撰写该博文既是对自己知识的系统梳理,也希望能帮助到同样需要理解CAN的友友们。
一、CAN总线基础知识
控制器局域网(Controller Area Network, CAN)是一种高性能、高可靠性的串行通信协议,最初由德国Bosch公司开发用于汽车电子系统。其核心特点包括:
-
多主机均可主动发送消息
-
差分信号传输抗干扰能力强
-
完善的错误检测机制
二、CAN总线硬件连接
2.1 物理层组成:
1.双绞线传输介质
-
CAN_High (通常黄色)
-
CAN_Low (通常绿色)
2.终端电阻
-
120Ω电阻(必须在线路两端各接一个)
-
作用:阻抗匹配,消除信号反射
3.收发器芯片
-
TJA1050、SN65HVD23等
-
负责TTL电平与差分信号的转换
2.2 采用差分信号传输的好处优势
-
强抗干扰能力:通过比较两线电压差而非绝对电压值传输信号
-
共模噪声抑制:外部干扰会同时影响两条线,差值保持不变
-
长距离传输:理论可达10km(低速时)
差分信号线典型电压电平:
状态 | CAN_High | CAN_Low | 差值 |
---|---|---|---|
显性(0) | 3.5V | 1.5V | +2V |
隐性(1) | 2.5V | 2.5V | 0V |
三、CAN总线标准数据帧解析
格式:起始位+识别码+RTR位+控制码+数据码+CRC+CRC界定符+ACK码+ACK界定符+结束位
1.起始位:一定是0。
2.识别码:根据识别码就可以知道是要发给哪个设备的,每个设备都有属于自己的11位识别码。
3.RTR位:用于识别数据帧或者远程请求帧,远程请求帧为1,数据帧为0。
4.控制码:总的来说是控制数据长度,下面是控制码的构成。
-
IDE位:用于区分标准格式和拓展格式,标准格式为0,扩展格式为1。
标准位识别码有11位,拓展位识别码为29位
-
空闲位:一般逻辑0
-
DLC:即数据长度代码,若为0001则后面数据位有1个字节(8个bit),同理若为1000(二进制为8),则后面为8个字节(64bit)。绿色部分是数据码。
5.数据码:传输要传输的数据
5.CRC:即为循环冗余校验位,为了确保数据准确性而设置,一共15位。设备接收端会根据他的数据计算他的CRC位,如果计算出来的CRC和接收到的CRC不一样,则说明数据存在问题,然后重新发一遍数据帧。
6.CRC界定符:一般为逻辑1,作用是把后面数据隔开。
7.ACK码:发送端发送逻辑1,接收端用逻辑0来应答。
8.ACK界定符:一定是逻辑1,作用是把后面数据隔开。
9.结束位:7为都是逻辑1,表示数据帧传输结束。
总的来说是这样的(完整帧+差分信号表示)
四、CAN总线仲裁机制
如果同时有设备发送信息,那么就看11位识别码。当总线同时出现0和1的时候,总线会置为逻辑0,然后那个为1的数据帧就不会再发送了。
示例场景: 假设三个节点同时发送以下ID的消息:
Node | ID/识别码 (二进制) | ID (十六进制) |
---|---|---|
A | 00101010000 | 0x150 |
B | 00101100000 | 0x160 |
C | 00101011000 | 0x158 |
仲裁过程:
第06位比较时: A和C发送'0',B发送'1' → B退出
第04位比较时: A发送'0',C发送'1' → C退出 最终A获得总线控制权
五、RS485和CAN总线的区别
5.1 核心区别概览
RS485 | CAN | |
---|---|---|
网络架构 | 一主多从(单主机轮询) | 多主对等(自主仲裁) |
错误处理 | 无内置机制 | CRC校验+自动重传 |
最大速率 | 10Mbps(12m) | 1Mbps(40m |
终端电阻 | 可选 | 必须120Ω两端 |
成本 | 更低(仅需UART) | 更高(专用控制器) |
一个经典的例子:
RS485是否把数据出去了,发送者不知道。
但是CAN总线发了另一个节点必须会有ACK应答,才能认为发送成功。
因此RS485安全性没有CAN总线高,所以汽车上不能用RS485而用CAN总线。
总结:汽车等高可靠系统必选CAN;简单监测系统可用成本更低的RSS48。
5.2 物理层差异
虽然两者都采用差分信号传输(双绞线),但电气特性不同:
-
RS485电平范围±(2~6)V
-
CAN显性电平+2V(CAN_H=3.5V,CAN_L=1.5V)
接线要求:
以上是CAN总线的基本知识,后续会更新实验代码部分