1、 CAN简介
CAN 协议(Controller Area Network)是一种广泛应用于汽车、工业控制等领域的串行通信协议,由 Bosch 公司在
1983 年开发,旨在实现分布式系统中电子控制单元(ECU)之间的高效、可靠通信。
现在主要应用在汽车网络、工业自动化、船舶、医疗设备、工业设备、消防电子等有现场总线需求的地方。
2 CAN 基础知识点总述
2.1 核心特性
通信速率:传统高速 CAN 总线速率通常为 125 kbps 至 1 Mbps,而 CAN FD(Flexible Data-Rate)支持更高的速率(最高可达 5 Mbps 或更高),数据场长度也扩展至 64 字节。
差分信号:使用双绞线传输差分信号(CAN_H 和 CAN_L),抗电磁干扰能力强。
多主架构:无中心控制器,节点可自主发起通信,通过仲裁机制解决总线冲突。
错误检测:内置 CRC 校验、帧格式检查等机制,可靠性高。
2.2 CAN的分类及拓扑结构
根据国际标准,CAN被分为两类:
1、高速CAN总线:由ISO11898 标准定义,通信速率为 5 kbps~1 Mbps,当使用最高速率时,总线长度 ≤ 40米,属于闭环总线。
2、低速CAN总线:由ISO11519标准定义,通信速率为 5~125 kbps,总线长度可达10千米,属于开环总线。
特性 | 高速 CAN(ISO 11898-2) | 低速容错 CAN(ISO11519) |
---|---|---|
速率 | 最高 1 Mbps(CAN FD 更高) | 通常 ≤ 125 kbps |
抗故障能力 | 较弱 | 强(单线断线仍可通信) |
应用场景 | 实时控制(动力系统) | 车身舒适系统(车窗、灯光)) |
其中120Ω和2.2kΩ为匹配电阻、加入配置电阻的原因为高频信号传输时,信号波长相对传输线较短,信号在传输线终端会形成反射波,干扰原信号,所以需要在传输线末端加终端电阻,使信号到达传输线末端后不反射。对于低频信号则不用。
通信速率与传输距离的关系
波特率 | 通讯距离 |
---|---|
500Kbps | 100m |
250kbps | 200m |
125kbps | 500m |
10kbps | 6km |
2.3 CAN信号传输
CAN总线采用双绞线进行数据传输。
发送:CAN控制器将上层应用发来的数据转化为二进制码流(逻辑电平)后发给CAN收发器,CAN收发器将二进制码流转化为差分信号发送出去。
接收:与发送相反。
2.4 CAN信号表示
CAN信号用两根线上的电位差表示。CAN总线上的电位差分为显性电平和隐性电平。
这两根导线在静止状态下对地电压均为2.5V,此时两根导线的电压差值为0V,该状态称为隐性状态,其数字信号用1来表示;当CAN-High的对地电压为3.5V,CAN-Low的对地电压为1.5V时,此时CAN-High和CAN-Low两根导线的电压差为2V,该状态称为显性状态,其数字信号用0来表示。其中显性电平为逻辑0,隐性电平为逻辑1。为了方便记忆我们将CAN总线的这一特性记忆为“显零隐一”。
2.5 CAN总线报文
帧类型 | 用途 |
---|---|
数据帧 | 传输数据(核心帧类型),包含标识符(ID)和数据域(0-8 字节) |
远程帧 | 请求其他节点发送数据(无数据域) |
错误帧 | 通知总线上的错误,强制终止错误报文 |
过载帧 | 节点处理能力不足时,延迟下一帧传输 |
帧间隔 | 分隔数据帧 / 远程帧与后续帧 |
2.5.1 数据帧:
帧格式分为:标准帧、扩展帧
CAN2.0A规定了11位标识符的标准帧格式,CAN2.0B在此基础上又增加了一种具有29位标识符的扩展帧格式。
关键字段说明(经典 CAN)
1、SOF(Start of Frame):帧起始,1 位显性电平(0)。
2、仲裁域:
标准帧:11 位 ID + 1 位 RTR(远程传输请求)。
扩展帧:11 位基 ID + 1 位 SRR(替代远程请求,固定为 1) + 1 位 IDE(标识符扩展,固定为 0) + 18 位扩展 ID + 1 位 RTR。
3、控制域:包含 DLC(Data Length Code,4 位),定义数据域长度(0-8 字节,CAN FD 支持 64 字节)。
4、数据域:实际传输的数据(最多 8 字节)。
5、CRC 域:校验码,经典 CAN 为 15 位,CAN FD 增强为 21 位。
6、ACK 域:应答槽(1 位) + 应答界定符(1 位隐性电平)。
图形对比要点
标识符长度:标准帧 11 位 vs 扩展帧 29 位(11 位基 ID + 18 位扩展 ID)。
特殊位:扩展帧通过 SRR 和 IDE 位标记扩展格式(SRR=1,IDE=0)。
兼容性:扩展帧可兼容标准帧网络,但需避免 ID 冲突。
2.5.2远程帧:
也叫遥控帧:没有数据段。 作用是当某个节点需要数据时,可以发送远程帧请求另一节点发送相应数据帧。
简单的说:发起方发起特定ID的远程帧,与其ID相符的终端设备就有义务在后面发送自己的数据。
2.5.3错误帧:
CAN(Controller Area Network)总线中的错误帧用于检测和通知通信过程中的异常,确保网络可靠性。以下是错误帧的详细解析:
错误标志分为主动错误标志和被动错误标志:
主动错误标志由6个连续的显性位(0)组成;
被动错误标志由6个连续的隐性位(1)组成,除非被其他节点的显性位覆盖;
错误界定符由8个连续的隐性位组成。
2.5.4过载帧:
CAN(Controller Area Network)的过载帧用于在节点处理能力不足时,延迟后续数据帧或远程帧的传输,防止数据丢失。以下是过载帧的详细解析:
过载帧的触发条件
当节点因内部处理延迟无法及时接收新报文时,会发送过载帧,通知其他节点暂停发送。具体场景包括:
2.缓冲区满:接收缓冲区已满,无法存储新数据。
3.硬件资源紧张:CPU 或 CAN 控制器处理速度不足。
4.同步延迟:节点未能及时从休眠模式唤醒。
过载帧的结构
过载帧由以下两部分组成:
过载标志(Overload Flag):
6 个显性位(0),结构与错误标志类似,但功能不同。
过载界定符(Overload Delimiter):
8 个隐性位(1),标志过载帧结束。
过载帧的发送规则
发送时机:只能在帧间间隔(Intermission)或过载帧间隔内发送。
禁止场景:不能在数据帧或远程帧的传输过程中插入过载帧。
优先级:过载帧的发送优先级低于错误帧。若总线上同时出现错误帧和过载帧,错误帧优先。
过载帧与错误帧的区别
特性 | 过载帧 | 错误帧 |
---|---|---|
触发原因 | 节点处理能力不足 | 检测到通信错误(如 CRC 错误) |
标志位 | 6 位显性位(0) | 6 位显性或隐性位(取决于状态) |
优先级 | 低于错误帧 | 高于过载帧 |
节点状态 | 不改变错误计数器 | 可能增加 TEC/REC,触发状态切换 |
2.6 CAN通讯特点
2.6.1 多主模式
在多主工作方式下:
1.各节点之间没有固定的主从之分,获得发送权的节点就是主节点;
2.最先向总线发送消息的节点获得总线的发送权;
3.当多个节点同时向总线发送消息时,所发送消息的优先权高的那个节点获得总线的发送权。
2.6.2 非破坏性逐位仲裁
基于报文 ID 优先级(ID 值越小,优先级越高)。
仲裁失败节点自动退出发送,无需冲突恢复机制。
在CAN协议中,所有的消息都以固定的帧格式发送。当多个节点同时向总线发送消息时,对各个消息的标识符(即ID号)进行逐位仲裁,如果某个节点发送的消息仲裁获胜,那么这个节点将获取总线的发送权,仲裁失败的节点则立即停止发送并转变为监听(接收)状态
这种仲裁机制有两个特点:
1.不会造成已发送数据的延迟;
2.不会破坏已经发送的数。
仲裁中的两个重要机制:线与机制,回读机制
线与机制: 指的是在总线上,显性位能够覆盖隐性位。 “显性”具有“优先”的意味,只要有一个单元输出显性电平,总线上即为显性电平,并且,“隐性”具有“包容”的意味,只有所有的单元都输出隐性电平,总线上才为隐性电平。(显性电平比隐性电平更强)。
举个例子:在某一个时刻,节点Node_A向总线发送了一个显性位0,Node_B向总线发送了一个隐性位1,那么在该时刻,总线上的电平为显性0。
回读机制: 指的是节点在向总线上发送报文的过程中,同时也对总线上的二进制位进行“回读”。通过这种机制,节点就可以判断出本节点发出的二进制位与总线上当前的二进制位是否一致。
非破坏性逐位仲裁机制:
该仲裁机制是建立在前面两个机制基础上的。
一条CAN总线上有Node_A 和 Node_B两个节点,在总线空闲时,总线上为隐性电平,就在这个时候Node_A 和 Node_B 这两个节点同时向总线上发送数据,如下图:
从图中可以看出,在Node_A 和 Node_B 传输数据前,总线处于空闲状态,为隐性电平1,这也就意味着,此时总线上的任意节点都可以向总线发送数据。
在某一时刻,Node_A 和Node_B两个节点同时向总线上发送数据。按照线与机制,总线上的电位为:
节点/ID号 | ID10 | ID9 | ID8 | ID7 | ID6 | … |
---|---|---|---|---|---|---|
Node_A | 1 | 0 | 1 | 0 | 1 | … |
Node_B | 1 | 0 | 1 | 1 | … | … |
总线 | 1 | 0 | 1 | 0 | 1 | … |
在Node_A和Node_B两个节点向总线发送数据时,他们同时回读总线上的电平。从图中我们可以看到,Node_A 和Node_B的ID10 、ID9、ID8电位相同,因此这两个节点从总线上听到的电位与他们自己发出的电位也相同,这个时候还没有分出胜负。
当Node_B回读总线上的 ID7 这一位时,发现总线上的电平跟它自己发送到总线上的不一样,此时,Node_B知道自己在争夺总线的仲裁中失败了,那么它主动地转换为接收状态,不再发出信息。
于是在此之后,总线上的电平和Node_A发出的电平一致,也就是说,Node_A占据了总线的发送权。
通过上面的分析我们可以看到,在整个仲裁过程中:
在Node_A获取总线的发送权之后,Node_A接着发送自己的Msg_A,因此在竞争总线的过程中不会对Msg_A的传输造成延时;
在两个节点竞争总线的过程中,不会破坏Msg_A;
正是由于上面的两点,才称之为非破坏性仲裁机制。
2.6.3错误处理与故障脱离
CAN(Controller Area Network)通信的错误处理机制是其高可靠性的核心保障,能够在复杂电磁环境或节点故障时维持系统稳定。以下是其错误处理机制的详细解析:
错误检测功能:所有的节点都可以检测出错误;
错误通知功能:检测出错误的节点会立即通知总线上其它所有的节点;
错误恢复功能:正在发送消息的节点,如果检测到错误,会立即停止当前的发送,并在错误解除后重复发送此消息,直到该消息发送成功为止。
节点能够判断错误的类型,判断是暂时性的数据错误(如噪声干扰)还是持续性的数据错误(如节点内部故障),如果判断是严重的持续性错误,那么节点就会切断自己与总线的联系,从而避免影响总线上其他节点的正常工作。
TEC(发送错误计数器)与REC(接收错误计数器)
每个 CAN 节点维护两个计数器,决定其错误处理能力:
计数器 | 递增条件 | 递减条件 |
---|---|---|
TEC | 发送错误帧、总线关闭恢复后 | 成功发送一帧后 - 1(TEC>0 时) |
(发送错误计数器) | 检测到位错误、ACK 错误 | |
REC | 接收错误帧、接收报文出现 CRC 错误 | 成功接收 128 个有效报文后 - 1(REC>0) |
(接收错误计数器) |
节点状态转换:
1、主动错误状态(Error Active):
默认状态,可正常发送报文和主动错误帧。
条件:TEC < 128 且 REC < 128。
2、被动错误状态(Error Passive):
发送被动错误帧(6 隐性位),发送间隔增加 8 位隐性延时。
条件:TEC ≥ 128 或 REC ≥ 128。
3、总线关闭状态(Bus Off):
完全停止发送报文,需硬件复位或软件重启恢复。
条件:TEC ≥ 256。
2.7 网络结构
2.7.1网络模型
在CAN协议中,ISO标准只对数据链路层和物理层做了规定,应用层由开发者自行定义。
总结
注:部分内容为AI生成。
CAN 协议凭借其可靠性、实时性和多主架构优势,成为分布式系统的通信基石。设计时需重点关注 ID 分配策略、错误恢复机制及物理层信号完整性,同时结合 CAN FD 等新技术应对更高带宽需求。