CAN通信协议
文章目录
- 一、CAN简介
- 二、CAN硬件连接
- 2.1 CPU自带CAN控制器
- 2.2 CPU 没有 CAN 控制器
- 三、CAN电平信号
- 四、CAN协议帧结构
- 4.1 什么是数据帧?
- 4.2 帧的种类
- 4.3 标准数据帧
- 4.4 扩展数据帧
- 4.5 遥控帧
- 4.6 错误帧
- 4.7 过载帧
- 4.8 帧间隔
- 4.9 位填充
- 4.10 波形示例
- 五、位时间
- 六、硬同步和再同步
- 6.1 硬同步
- 6.2 再同步
- 七、仲裁机制
一、CAN简介
在汽车电子中,有许多ECU控制模块,控制着不同功能,为了这些众多ECU模块能够协同工作,就出现了CAN,将多个ECU模块挂载到CAN总线上即可,实现ECU之间的局域网通信。
CAN是串行通信协议,CAN 总线支持多主通信, 所有节点( ECU) 均可主动发送数据, 无需依赖中心控制器。 其采用非破坏性仲裁机制, 通过ID 优先级解决总线冲突, 确保高优先级数据优先传输。 总线具备高可靠性, 内置 CRC 校验、 错误检测与恢复机制, 同时采用差分信号增强抗电磁干扰能力。CAN 总线通过简化布线和降低系统复杂度, 实现了低成本的优势。
二、CAN硬件连接
2.1 CPU自带CAN控制器
CPU 自带 CAN 控制器连接图如下所示, CPU 通过集成的 CAN 控制器直接与 CAN 收发器进行通信, CAN 收发器负责将数字信号转换为适合 CAN 总线传输的差分信号(CAN_H 和 CAN_L)。通过这种结构, CPU 可以直接与 CAN 总线进行通信, 适用于需要高效、 实时数据传输的应用场景, 如汽车电子和工业控制系统。 总线两端的终端电阻确保了 CAN 通信的稳定性, 防止信号反射, 提升通信的可靠性。
2.2 CPU 没有 CAN 控制器
CPU 没有 CAN 控制器的连接示意图如下所示, CPU 通过 SPI 控制器与 SPI 转 CAN 模块进行通信, 后者将 SPI 数据转换为 CAN 总线所需的格式。 通过这种结构, CPU 可以通过 SPI 协议与CAN 总线进行通信, 适用于需要在没有直接 CAN 控制器的情况下与 CAN 网络连接的应用场景。总线两端的终端电阻确保了 CAN 通信的稳定性。
- can总线两端120欧姆为终端电阻,是为了消除总线上的信号反射。
- 由上图可知,CAN硬件连接中并没有时钟线,则说明是异步连接,并且无法进行同时接收或发送,则说明是半双工通讯。
三、CAN电平信号
CAN 总线使用两条信号线进行数据传输: CAN_H(高电平) 和 CAN_L(低电平) 。 CAN_H和 CAN_L 之间的电压差异决定了逻辑信号的状态。 这使得 CAN 总线具有更好的抗干扰能力,尤其适合在噪声较大的环境中工作。
-
CAN_H: 高电平信号线, 通常电压范围为 2.5V 至 3.5V。
-
CAN_L: 低电平信号线, 通常电压范围为 1.5V 至 2.5V。
隐性状态( 逻辑“1”) : 当 CAN_H 与 CAN_L 的电压相等(通常为 2.5V) , 表示总线处于空闲状态。 此时, 总线没有数据传输, 所有设备都在等待通信。 隐性状态也被称为空闲电平或逻辑1。
显性状态( 逻辑“0”) : 当 CAN_H 与 CAN_L 的电压差为 2V 时, 表示数据正在传输。 具体来说, CAN_H 为 3.5V, CAN_L 为 1.5V, 表示逻辑“0”。 显性状态表示总线正在传输数据, 且具有较高的优先级。
差分信号的特性使得 CAN 总线在噪声环境中具有极强的抗干扰能力 。
四、CAN协议帧结构
4.1 什么是数据帧?
can通信是通过数据帧进行发送数据的,所以数据帧是数据帧携带数据从发送设备到接收设备。
4.2 帧的种类
帧是 CAN 通信中数据传输的基本单位, 在 CAN 通信中使用了五种不同类型的帧来实现不同的功能。 以下是每种帧的简要说明及其用途:
- 数据帧(Data Frame) : 数据帧是 CAN 通信中最常用的帧类型, 用于发送单元向接收单元传递数据。 数据帧有两种格式: 标准格式(11 位标识符) 适用于较简单的网络, 扩展格式(29 位标识符) 适用于更复杂的网络。
- 遥控帧(Remote Frame) : 遥控帧用于接收单元向发送单元请求数据。 它不包含数据段, 而是通过标识符(ID) 告诉发送单元“我需要这个 ID 对应的数据”。 遥控帧也有标准格式和扩展格式两种, 其结构与数据帧类似, 但缺少数据段。
- 错误帧(Error Frame) : 错误帧用于当节点检测到错误时, 向其他节点通知错误的发生。 它是一种特殊的帧, 用于中断当前通信并重新启动。 错误帧由错误标志(6 个连续显性或隐性位) 和错误界定符组成, 触发条件包括位错误、 填充错误、 CRC 错误等。
- 过载帧(Overload Frame) : 过载帧用于接收单元通知发送单元其尚未做好接收准备。它通常出现在接收节点需要更多时间处理前一帧的情况下。 过载帧只能在帧间隔期间发送, 其结构类似于错误帧, 由过载标志和过载界定符组成。
- 帧间隔(Interframe Space) : 帧间隔用于将数据帧或遥控帧与前面的帧分离开来。它是一个时间间隔, 确保网络中的节点能够正确识别下一帧的开始。 对于数据帧和遥控帧, 帧间隔通常为 3 个位时间; 对于错误帧和过载帧, 帧间隔可能有所不同。
4.3 标准数据帧
标准数据帧是 CAN 通信协议中用于传输数据的基本结构。 它包含多个字段, 字段的作用各有不同, 确保了数据能够高效、 安全地传输。 数据帧的组成框图如下所示:
由上图可知,RTR为0说明该报文为数据帧,IDE为0说明为标准数据帧。仲裁字段中禁止高 7位全为隐性, 以避免仲裁错误。
CAN的ACK应答是在发送数据时就进行,在数据帧过程中,CAN发送数据时会释放总线,则为高电平,若有数据接收,则会去拉低电平,接收完毕后释放电平,这也是为什么CRC、ACK界定符都为1。
4.4 扩展数据帧
扩展数据帧是为了提高ID容量。上面的图中需要注意IDE的位置:会跟着原标准数据帧的11位ID后同时为1,告诉后面此帧是扩展帧,同时还有一个SRR位(固定为1);等到29位ID扩展完毕之后,后面才是原来的RTR,RTR为0说明还是为数据帧。同时后面多了两个R0保留位(固定为0)。
SRR 位的作用:SRR 位在 CAN 协议中用于替代标准帧的 RTR 位, 位于扩展帧仲裁段中原 RTR 位的位置。 其作用是强制设置为隐性电平(1) , 以确保在标准帧与扩展帧同时竞争总线时, 标准帧因 RTR位显性(0) 而具有更高的优先级。 当标准帧和扩展帧同时发送时, 总线通过仲裁逻辑检测到显性电平(0) , 从而使标准帧胜出。
最后来看一下标准数据帧和扩展数据帧的对比, 如下图所示:
4.5 遥控帧
遥控帧(Remote Frame) 是 CAN 协议中用于主动请求数据的特殊帧类型。 当一个节点需要获取其他节点的数据时, 可通过发送遥控帧向总线发起请求, 目标节点收到请求后返回对应的数据帧。
数据帧去掉数据段就是遥控帧, 当然和遥控帧一样, 遥控帧也分标准遥控帧和扩展遥控帧,他们各自的构成如下所示:
数据帧中减掉数据字段就是遥控帧。数据帧有标准数据帧和扩展数据帧,那么遥控帧也应该有两种。同时主要就是注意遥控帧的RTR位为1。
要注意扩展遥控帧的SSR位置,且为显性电平,使得扩展遥控帧的优先级低于标准遥控帧的优先级。
4.6 错误帧
当一个设备发出错误标志时,可能引发其他设备发生错误标志,所以错误标志可能有多个。(显性位:逻辑0、隐形位:逻辑1)
4.7 过载帧
过载帧是 CAN 总线中用于通知网络中的其他节点当前接收设备需要更多时间来处理数据的特殊帧。 它通常在接收节点无法及时处理接收到的数据时发送, 以请求发送节点延迟下一帧的传输。 过载帧的组成如下所示:
4.8 帧间隔
帧间隔是 CAN 总线中用于分隔数据帧、 遥控帧或其他帧之间的时间段, 确保网络中的节点能够正确处理前一帧并为下一帧的传输做好准备。 帧间隔的长度和组成根据节点的状态(主动错误状态或被动错误状态) 有所不同。帧间隔的组成如下所示:
帧间隔适用于分隔数据帧和遥控帧的帧。
4.9 位填充
位填充规则: 当数据中出现 5 个连续的相同极性位时, 在第 6 位插入一个与这些位极性相反的填充位。 这一机制通过打破可能出现的长串相同电平, 确保总线上始终有电平变化, 从而维持发送端和接收端的同步。
4.10 波形示例
由上图可见,仲裁字段:11位ID+RTR,RTR为0说明该波形为数据帧;之后控制字段的IDE为0说明该波形为标准帧,RO默认为0,后面的四位为数据字段长度(0001);总结如下:该波形为标准数据帧,发送0x01数据。(注意CRC界定符和ACK界定符都为1)
由上图可见,仲裁字段:11位ID+RTR,RTR为1说明该波形为遥控帧;之后控制字段的IDE为0说明该波形为标准帧,RO默认为0,后面的四位为数据字段长度(0001);总结如下该波形为标准遥控帧。(注意CRC界定符和ACK界定符都为1)
由上图可见,仲裁字段:11位ID后两位全为高电平,且根据黄色框内可以确定为扩展帧,那么说明后两位分别是SRS、IDE,SRS默认为1,IDE为1说明该为扩展帧,之后附加18位ID+RTR,RTR为0说明为数据帧;后面的控制字段中的RB1、RB0默认为1,后面四位为数据字段长度;总结如下:该波形为扩展数据帧,发送0x01数据。(注意CRC界定符和ACK界定符都为1)
五、位时间
位时间就是一个(二进制)位在总线传输所需要的时间,一个位时间分成四段,这些段又称为TQ的最小时间单位构成。
波特率 = 1 / 位时间
位时间的作用:CAN是异步通讯,没有时钟信号线,连接在同一个总线网络中的各个节点会使用约定好的波特率进行通讯。在CAN还会使用同步的方式来对抗干扰、降低误差,保证对总线电平信号进行正确的采样,确保通讯正常。主要就是通过位时间来调整采样点的位置处于采样信号的中间位置。
六、硬同步和再同步
在 CAN 通信中, 由于采用异步通信方式且没有独立时钟线, 各节点依赖本地晶振进行数据传输, 但晶振的时钟漂移会导致节点间时序逐渐偏移, 最终引发采样错误。 为解决这一问题, CAN 协议通过硬同步和再同步两大机制实现动态时序调整。
6.1 硬同步
核心作用是在帧起始(SOF) 阶段强制对齐各节点的时序, 从而消除因本地晶振差异导致的初始相位差。
硬同步的触发条件是当总线从空闲状态检测到显性电平(逻辑 0) 的下降沿时(即 SOF 位的边沿) , 节点会立即调整自身时序, 将当前位的同步段对齐到该边沿。 这一过程可以分为以下几个步骤:
- 节点在总线空闲期间持续监测电平变化;
- 当检测到 SOF 下降沿且该边沿落在同步段内时, 硬同步被触发;
- 节点强制调整时序, 将当前位的同步段起点对齐到该边沿, 并重新开始后续位时间的计数。
硬同步的作用范围有限, 它仅在消息帧的起始阶段生效, 且只能解决初始相位偏差问题。
6.2 再同步
在了解再同步前,我们先引入一个位时间的第五个段名称:SJW(再同步补偿宽度),作用是因时钟频率偏差、传送延迟等,各单元有同步误差。SJW为补偿此误差的最大值。SJW的范围为1~4Tq。
核心作用是通过动态调整采样点的位置, 确保接收节点能够在正确的时间读取总线电平, 从而维持通讯的可靠性。
再同步的触发条件是当检测到信号边沿(如显性电平到隐性电平的变化) 与预期位置存在偏差时。 如果信号边沿提前到达, 说明发送节点的时钟快于接收节点, 此时接收节点会通过缩短相位缓冲段 1 来提前采样点; 反之, 如果信号边沿延迟到达, 则说明发送节点的时钟慢于接收节点, 接收节点会通过延长相位缓冲段 2 来推迟采样点。 这种动态调整的过程依赖于同步跳转宽度(SJW, Synchronization Jump Width) , 它定义了每次再同步调整的最大范围,以防止过度调整引发新的误差。
七、仲裁机制
- 非破坏性仲裁:显性优先,即显性优先级大于隐性优先级(线与机制:只有所有节点都发送隐性1时,总线才为1,只要有一个节点发送显性0,则总线就为显性 0)
- 载波侦听:总线上各个节点在发送数据前要侦听总线的状态,只有在总线是空闲状态时,才允许发送。
- 回读:节点在发送数据时要不停的检测要发送的数据,发送数据与总线上数据不一致则仲裁失利。通过非破坏性仲裁判断是否与其他节点的数据发生冲突。