搞懂CAN通信

1、简介

  • CAN即控制局域网(Controller Area Network),一种串行通信协议,主要用于汽车和工业自动化中多节点实时控制,CAN最初是为了汽车领域研究的,对可靠性和稳定性要求极高。每个挂载在CAN总线的设备都可以利用这个局域网去发送自己的信息,也可以接收局域网的各种消息。每个设备都是平等的,都在共享这个局域网的通信资源。这就是CAN总线的设计理念。

2、特点

  • 抗干扰性强,采用查分信号进行传输,双绞线缠绕,如果线路产生干扰,一般两根线都会受到干扰,但两根线的电压差值是不变的
  • 可靠性高,采用仲裁机制、位填充、循环冗余校验(CRC)、位错误检测、报文格式检测、应答错误检测等多种错误检测机制,当检测到错误时,节点会自动重发错误帧,确保数据的准确传输;CAN节点能对自身的错误状态惊醒界定,分为主动、错误被动和总线关闭三种状态。
  • 高速CAN(ISO11898):125k-1Mbps < 40m; 低速CAN(ISO11519):10kbps-125kbps<500m; 最低速率小于10kpbs下,通信距离可达1km;
  • 异步,无需时钟线,通讯速率由设备各自约定
  • 半双工,可挂载多设备,多设备同时发送数据时,通过仲裁决定发送顺序,支持11位(标准格式)/29位(扩展格式)报文ID,用于区分消息功能,同时决定优先级
  • 多主通信,任何节点都可以主动发送数据,通信更加灵活
  • 可配置1-8字节有效载荷
  • 可实现广播式和请求式两种传输方式

3、原理

3.1 CAN物理接线

闭环CAN总线-高速CAN(125k-1Mbps<40m)

开环CAN总线-低速CAN(10k-125kbps<1km)

  • 每个设备通过CAN收发器挂载在CAN总线网络上
  • CAN控制器引出TX和RX与CAN收发器相连,CAN收发器引出CAN_H和CAN_L分别与总线CAN_H和CAN_L相连
  • 高速CAN使用闭环网络,CAN_H和CAN_L两端添加120Ω的终端电阻
  • 低速CAN使用开环网络,CAN_H和CAN_L其中一端添加2.2kΩ的终端电阻

CAN收发器:主要实现电平转换、输出驱动和输入采样这几个功能的驱动。 CAN控制器:即CAN局域网控制器,用于解决众多测量控制部件之间的数据交换的一种串行数据通信总线。

3.2 CAN电平标准

CAN总线采用差分信号,即两线电压差传输数据位

高速CAN规定:

  • 显性电平(逻辑0):CAN_H 电压:3.5v,CAN_L 电压:1.5v,电压差 = 2v
  • 隐性电平(逻辑1):CAN_H 电压:2.5v,CAN_L 电压:2.5v,电压差 = 0v

低速CAN规定:

  • 显性电平(逻辑 0):CAN_H为3.6V,CAN_L为1.4V,此时电压差是 2.2V
  • 隐性电平(逻辑 1):CAN_H为0V,CAN_L为5V,此时电压差是 -5V

4、 CAN帧结构

4.1 数据帧

CAN通信的数据帧有两种格式:

  • 标准帧(11位标识符):用于常规通信,包含11位标识符和最多8字节数据
  • 扩展帧(29位标识符):用于复杂通信,包含29位标识符和最多8字节数据 标准帧结构:
  • 起始位(SOF):1位,表示帧开始,默认值为0;
  • 标识符(Identifier):标准格式11位,表示数据段的功能,并用于区分优先级,根据仲裁规则,ID小的报文优先发送,ID大的报文等待下一次总线空闲再重试发送,不同功能的数据帧ID不同;
  • 扩展标识符标志位(SRR):1位,表示该镇为扩展帧;(扩展帧特有)
  • 标识符扩展位(IDE):1位,表示扩展帧标识符;(扩展帧特有)
  • 标识符B部分(Identifier B):18位,标识符的后18位;(扩展帧特有)
  • 远程传输请求位(RTR):1位,区分数据帧和遥控帧,数据帧为0;
  • 控制字段(Control Field):6位,包含数据长度代码(DLC)和保留位;
  • 数据长度代码(DLC):4 位,用于表示数据字段的字节数(0 到 8 字节)。
  • 数据字段(Data Field):0 - 8 字节,即实际传输的数据。
  • 循环冗余校验(CRC):15 位,用于进行错误检测。
  • CRC 确认位(CRC Delimiter):1 位,固定为隐性位(1)。
  • 应答位(ACK Slot):1 位,发送方发送显性位(0),接收方发送隐性位(1)表示接收成功。发送方可以根据ACK槽,知道数据是否被接收,可以用来做重发机制。
  • 应答分隔符(ACK Delimiter):1 位,固定为隐性位(1)。接收方接到消息后ACK拉高之后,要交出控制权。所以要用一个界定符,让接收方发送隐性1。
  • 结束位(EOF):7 位,表示帧的结束。

4.2 遥控帧

遥控帧无数据段,RTR位隐性电平1,其他部分与数据帧相同。用于数据不是频繁更新的场景,和数据帧搭配使用。

4.3 错误帧

总线上所有设备多会监督总线数据,一旦发现位错误、填充错、CRC错误、格式错误、应答错误等,这些设备就会发出错误帧来破坏数据,同时终止当前的发送设备。

4.4 过载帧

当接接收方收到大量数据无法处理时,器可以发出过载帧,延缓发送方的数据发送,以平衡总线负载,避免数据丢失

4.5 帧间隔

将数据帧、遥控帧与前面的帧分隔开

5、 位填充

填充规则:发送方每发送五个相同的电平后,自动追加一个相反电平的填充位,接收方检测到填充位时,会自动移除填充位,恢复原始数据。

如果位填充之后,和后面的四位相同,则会再填充一位。填充与后面的数据位合并,之后再用填充规则进行位填充。

位填充作用:

  • 增加波形的定时信息,利于接收方执行再同步,防止波形长时间无变化,导致接收方不能精确掌握数据采样时机。如果长时间相同的电平,时钟稍有偏差,就会接收出错。
  • 将正常数据流与错误帧和过载帧区分开,标志错误帧和过载帧的特异性。(都有连续六位相同的电平)
  • 保持CAN总线在发送正常数据流时的活跃状态,防止被误认为总线空闲(如果你要发送的数据是一大串1)

6、 仲裁规则

CAN 协议仲裁机制是 CAN 总线的核心特性之一,用于解决多个节点同时尝试发送数据时的冲突问题,确保数据能够高效、公正地传输。

  • 仲裁方式:CAN 总线采用 CSMA/CD+AMP(载波侦听多路访问 / 冲突检测 + 仲裁)的总线仲裁方式。简单来说,就是 "先听后说,有理说话"。每个节点在发送数据前都要先侦听总线是否空闲,允许多个节点同时访问总线,当多个节点同时发送时能够检测到冲突,然后通过特定机制决定哪个节点优先发送。

  • 硬件基础:CAN 总线使用差分信号传输数据,分为显性电平(逻辑 0)和隐性电平(逻辑 1),且显性电平可以覆盖隐性电平,这为仲裁机制提供了硬件基础。

  • 仲裁过程

    • 总线空闲时,任何节点都可以开始发送数据。
    • 多个节点同时发送时,从报文 ID 的最高位开始逐位比较。
    • 发送 "0"(显性)的节点继续发送,发送 "1"(隐性)的节点停止发送转为接收(各个节点回读总线当前电平状态)。
    • 最终 ID 值最小的节点获得发送权。

这种仲裁机制是非破坏性的,在仲裁过程中不会破坏正在传输的数据。一旦高优先级的报文开始发送,低优先级的报文就会停止发送,并等待下一次总线空闲时再尝试发送。

7、大量数据处理

在CAN(Controller Area Network)通信中,处理大量信息可能会遇到带宽限制、优先级冲突和实时性要求等问题。以下是几种有效的处理方法:


7.1 优化CAN帧的使用

(1) 合理利用数据字段

  • CAN帧数据长度:每帧最多8字节,尽量填满数据字段以减少帧数量。
  • 数据打包:将多个小数据合并到一个帧中(例如,4个16位数据可打包到8字节的帧中)。
  • 位域(Bit Fields) :使用位域压缩数据(如状态标志位)。

(2) 使用扩展帧(29位标识符)

  • 标准帧(11位标识符)仅支持2048种不同ID,而扩展帧(29位标识符)可支持超过5亿种ID,适用于复杂系统。

7.2 优先级管理

(1) 合理分配标识符(ID)

  • CAN仲裁机制:ID值越小,优先级越高。
  • 按功能分组
    • 高优先级(紧急控制信号):0x000 ~ 0x3FF
    • 中优先级(常规数据):0x400 ~ 0x7FF
    • 低优先级(日志/调试信息):0x800 ~ 0xFFF

(2) 动态调整优先级

  • 某些协议(如CANopen)支持动态调整消息优先级,确保关键数据优先传输。

7.3 提高通信效率

(1) 提高CAN总线速率

  • 标准CAN(CAN 2.0A/B)最高支持1 Mbps(短距离)。
  • CAN FD(灵活数据速率)支持更高的数据速率(最高8 Mbps)和更大的数据帧(64字节)。

(2) 使用CAN FD(Flexible Data Rate)

  • 优点
    • 数据段可扩展(最多64字节)。
    • 更高的传输速率(仲裁段仍用标准CAN速率,数据段可加速)。
  • 适用场景:需要传输大量数据的系统(如汽车ECU、工业控制)。

7.4 数据分片与重组

(1) 分片传输

  • 如果单帧无法容纳数据(如长报文),可采用分片传输:
    • 发送端:将大数据拆分成多个CAN帧,每帧包含序号和总长度。
    • 接收端:按序号重组数据。

(2) 协议支持

  • CANopenJ1939 等协议已定义分片机制,可直接使用。

7.5 减少不必要的数据

(1) 事件触发 vs. 周期发送

  • 事件触发:仅在数据变化时发送(如开关状态变化)。
  • 周期发送:固定时间间隔发送(如传感器数据)。
  • 混合模式:关键数据事件触发,非关键数据周期发送。

(2) 数据过滤

  • 硬件过滤:CAN控制器支持ID过滤,仅接收相关帧。
  • 软件过滤:在接收端进一步筛选数据。

7.6 使用多路CAN总线

(1) 多通道CAN

  • 在复杂系统中,可划分多个CAN总线:
    • 高速CAN(1 Mbps):关键控制信号。
    • 低速CAN(125 kbps):非关键数据(如诊断信息)。

(2) 网关(Gateway)

  • 使用网关桥接多个CAN网络,实现数据路由和流量控制。

7.7 错误管理与重传机制

(1) 错误检测与恢复

  • CAN的CRC校验:自动检测错误并重传。
  • 应用层ACK:关键数据可要求接收方确认。

(2) 避免总线过载

  • 流量控制:限制低优先级数据的发送频率。
  • 错误恢复策略:如节点崩溃后自动重启。

7.8 高级协议支持

(1) CANopen

  • 提供对象字典(Object Dictionary)管理数据,支持PDO(过程数据对象)和SDO(服务数据对象)传输方式。

(2) J1939

  • 适用于车辆网络,定义标准参数组(PGN)和优先级管理。

通过合理设计ID分配、优化数据格式、采用CAN FD或分片机制,可以有效处理CAN通信中的大量信息。

参考文章:

相关推荐
别说我什么都不会5 小时前
OpenHarmony解读之设备认证:pake协议-服务端响应pake start请求(2)
物联网·嵌入式·harmonyos
别说我什么都不会1 天前
OpenHarmony解读之设备认证:pake协议-客户端发起start请求
物联网·嵌入式·harmonyos
塞尔维亚大汉1 天前
OpenHarmony之分布式软总线nstackx_device.c(一)
分布式·嵌入式·harmonyos
FreakStudio2 天前
一文速通Python并行计算:04 Python多线程编程-多线程同步(上)—基于条件变量、事件和屏障
python·嵌入式·开发工具·面向对象·线程同步·代码阅读·电子diy
王小小海2 天前
【笔记分享】NCS/Zephyr USB MSC实现方法介绍
驱动开发·笔记·单片机·嵌入式
别说我什么都不会2 天前
OpenHarmony解读之设备认证:数据接收管理-消息处理(2)
物联网·嵌入式·harmonyos
zxfeng~2 天前
泰山派开发之—Ubuntu20.04根文件系统制作
linux·ubuntu·嵌入式·根文件系统·泰山派
别说我什么都不会2 天前
OpenHarmony解读之设备认证:数据接收管理-消息处理(1)
物联网·嵌入式·harmonyos
你好,奋斗者!2 天前
C语言关键字之“volatile”
c语言·计算机·嵌入式
FreakStudio3 天前
一文速通Python并行计算:03 Python多线程编程-多线程同步(上)—基于互斥锁、递归锁和信号量
python·嵌入式·多线程·面向对象·并行计算·线程同步·电子diy