【通信协议】CAN总线通信协议

1. CAN总线简介

1.1 什么是CAN总线

CAN总线中文全称是控制器局部网络总线(Controller Area Net)。该协议是一种多主机串行异步通信总线,允许网络中的各个节点(设备)进行无中心控制的通信。

所谓无中心控制的通信,即在CAN总线网络中,没有一个中央控制器来管理所有节点的通信。相反,每个节点都是平等的,无需等待中央控制器的指令。任何节点在需要时都可以发送报文。并且进行非破坏性总线访问技术的传输管理。

所谓非破坏性总线访问技术,即当多个节点同时尝试发送数据时,CAN总线使用仲裁机制决定哪个节点的报文优先发送。这个过程是通过比较报文的标识符(ID)来完成的,优先级高的报文会先发送,一旦总线上高优先级报文被发送,低优先级的报文就会停止发送。并且,如果某个节点出现故障,只要它不主动发送错误信号干扰总线,就不会影响整个网络的通信。其他节点仍然可以正常发送和接收数据。如此,保证了高优先级的报文不会因总线竞争或总线上某一节点故障而丢失。
在这里插入图片描述

1.2 CAN总线工作原理

CAN总线的通信过程被分为4个阶段:

  • 发送报文:每个节点都可以在总线上发送报文。在发送前,节点需要判断总线是否空闲。
  • 仲裁机制:如果多个节点同时发送报文,总线则会使用仲裁机制决定哪个报文优先发送。仲裁是基于报文标识符(ID)的,ID越小优先级越高。
  • 数据传输:优先级最高的报文在总线上传输时,其他节点暂停发送并等待下一次总线空闲。
  • 错误检测与处理:CAN总线内置多种错误检测机制,包括CRC校验、位填充、帧校验和应答错误等。任何节点检测到错误都会中断当前传输并重发报文。

通俗来讲,CAN通信的过程可以理解为一场电话会议,电话能接通的前提是,此时会议上没有在进行通话,当一个人电话接通时,其它人就只能听,直到这个人通话结束,下一个人才能允许通话;当多个人同时拨打电话时,则会根据一定规则决定哪个人先通话。在通话过程中,讲话人会确定听话人是否成功接收到消息,如果说话人传递的信息有误,听话人会及时指出错误。

2. 物理层CAN总线协议

2.1 CAN总线的构成

CAN总线使用双绞线进行差分电压传输,两条信号线分别被称为CAN高和CAN低,两端有防止信号反射的终端电阻,大小通常是120Ω,因为双绞线的特性阻抗是120Ω,阻抗匹配能够最大程度地减少信号反射。.
能接入CAN总线的电控单元,通常由微控制器、CAN控制器和CAN收发器三个部分组成。

在这里插入图片描述

2.2 CAN总线电平信号

在这里插入图片描述
CAN2.0A和CAN2.0B标准规定,当高速CAN总线空闲时,CAN高和CAN低上的电压为2.5V,此时两者差值为0V,表示逻辑“1”,为逻辑隐性;当高速CAN总线有信号传输时,两条导线上的电压就会出现差异,CAN高上的电压为3.5V和CAN低上的电压为1.5V,此时两者差值为2V,表示逻辑“0”,为逻辑显性。

这里有两个问题需要着重说明:

  • 1.为什么需要用双绞线和差分信号对CAN通信传输?
    因为双绞线可以提高信号传输的抗干扰性,减小误差和噪声带来的干扰,当外部有干扰出现时,电压会出现突变,但是由于使用的是差分信号,电压会同时在CAN高和CAN低上出现突变,两条信号线的干扰会一定程度抵消。
    在这里插入图片描述
  • 2.为什么用逻辑“0”表示逻辑显性
    因为CAN通信协议使用“线与”规则进行冲突制裁,当多个CAN信号同时发送时,有的发1,有的发0,当两条信号线上为1和0电平、0和1电平、0和0电平时,通过线与规则,都可得逻辑0,看上去像是1被0覆盖了,因此规定为逻辑显性;只有当两条信号线上为1和1电平时,通过线与规则,才可得逻辑1,因此规定为逻辑隐性。

2.3 CAN总线的同步

CAN总线是一种异步通信协议,对异步串行通信而言,接收器内部会定时对数据帧采样,采样点会按照约定的频率采样数据,但是根据波特率采样,波特率的微小误差会产生通信错误。
在这里插入图片描述
刚开始的时候可能不会有问题,但是由于误差累积,越到后期,采样的位置偏差会越来越大,随之采样出错的问题会越多。因此,采取数据帧的起始位和填充位(后文会着重说明),作为采样同步,即发送方每发出一个数据帧的起始位或填充位,接收方就在起始位和填充位的跳变沿调整它们的内部时钟,以便与发送节点的时钟同步。

2.4 CAN总线竞争与仲裁机制在物理层的体现

在这里插入图片描述
如上图,总线电平是显性状态,有三个节点要同时发送报文,因此触发了CAN总线的仲裁机制,对于节点A、B、C的ID第5位,节点A和C处于显性状态,节点B处于隐性状态,A、B、C的ID第5位与总线电平进行线与规则,节点B的结果为隐性,节点A和C的结果为显性,因此节点B退出竞争,进行只听模式。对于节点A、B、C的ID第3位,同理,通过这种竞争与仲裁机制,即可在A、B、C节点同时发报文的情况下,将ID最小(优先级最高)的A节点的报文发出。

3. 数据链路层CAN总线协议

3.1 CAN报文帧种类

在这里插入图片描述
数据帧是CAN总线协议中最常见的一种类型,数据帧又可以分为标准帧和扩展帧。
在这里插入图片描述
扩展帧主要就是仲裁段和控制段有一定的扩展,其余都与标准帧相同。

3.2 CAN报文帧格式解析

3.2.1 帧起始段

帧起始,占1位。
在总线空闲时,总线处于隐性位状态,发送方发送数据,首先会发送一个起始位,接收方在检测到起始位的下降沿时,就会立即调整它们的内部时钟,以便与发送节点的时钟同步。这样就可以确保接收节点在接下来的数据传输中能够在正确的时间点采样数据位。

3.2.2 仲裁段

在这里插入图片描述

标准格式只有ID和RTR两个部分,共占12位

  • ID:占11位,用于识别不同的消息类型或不同的设备。ID不仅仅是标识符,它还用于确定消息的优先级。数值越小的ID具有越高的优先级。
  • RTR:占1位,中文全称是远程发送请求。当RTR位为显性时,表示这是一个数据帧;当RTR位为隐性时,表示这是一个远程帧,请求一个特定的消息。

拓展格式扩充了SRR、IDE和18位ID,共占32位

  • SRR:占1位,中文全称是替代远程请求,用于替代标准帧中的RTR位。当一个节点发送扩展帧时,它需要使用SRR位来占据RTR位的位置。由于扩展帧比标准帧具有更长的ID部分,因此需要使用SRR位来区分和替代标准帧中的RTR位。
  • IDE:占1位,中文全称是标识符扩展位,用于指示当前数据帧是标准格式还是扩展格式。当IDE位为显性(逻辑0)时,表示这是一个标准格式的数据帧;当IDE位为隐性(逻辑1)时,表示这是一个扩展格式的数据帧。
  • 18位ID:扩展了18位ID,提供了更多的标识符,用于更大规模的网络。

3.2.3 控制段

在这里插入图片描述
标准格式,共占6位

  • IDE:占1位,与扩展帧中仲裁段的IDE位作用相同。
  • r0:保留位,占1位,用于将来的协议扩展或特定用途。这些保留位目前没有具体功能,但为了兼容性,必须按规定填充。
  • DLC:占4位,中文全称是数据长度码,用于指示数据帧中数据字段的长度。DLC的值范围从0到8,对应的数据字节数也从0到8。接收方对于DLC=9-15的情况,不会视为错误,仍然视为有8个字节的数据,因为接受方接收到最高位为1时就会自动视为DLC的值为8。

拓展格式与标准格式不同的是有2位保留位,共占6位

  • r1:占1位,作用与r0相同。

3.2.4 数据段

在这里插入图片描述
数据段共占64位,传输时首先会发送最高位。

3.2.5 CRC段

在这里插入图片描述
占16位,用于检测数据传输中的错误。CRC的值用模2除法(异或逻辑)多项式实现。

  • CRC值:占15位,该值是通过使用生成多项式对数据段进行模2除法计算得到的校验码。
  • CRC界定符:占1位,该值标志着CRC值的结束和ACK段的开始。这使接收方明确CRC校验码的范围,并准备接收后续的ACK段。CRC界定符是一个固定的隐性电平(逻辑1)。

模2除法多项式实现举例:
假设数据是 11010011101100,生成多项式是 1011,因此用这个生成多项式对数据进行模2除法计算CRC。
步骤:

一、数据扩展:
在数据末尾添加生成多项式位数减1的0个数,即多项式最高幂次数的0个数。即在11010011101100后面加上3个0,得到1010011101100000
二、初始化除法:
被除数为11010011101100000,除数为1011
三、进行模2除法:
从数据的最高有效位开始。如果当前位是1,则用生成多项式进行模2除法,否则直接跳过该位。
详细步骤如下:

  • 第一步:11010011101100000(当前高四位为1101,与生成多项式1011进行异或操作)结果为01110011101100000
  • 第二步:因为高位是0,直接跳过,仍然为01110011101100000
  • 第三步:01110011101100000(当前高四位为1110,与生成多项式1011进行异或操作)结果为00101011101100000
  • 第四步:因为高位是0,直接跳过,仍然为01110011101100000
  • 第五步:00101011101100000(当前高四位为1010,与生成多项式1011进行异或操作)结果为00000011101100000
  • 第六步:因为高位是0,直接跳过,仍然为00000011101100000
  • 第七步:00000011101100000(当前高四位为1101,与生成多项式1011进行异或操作)结果为00000000101100000
  • 第八步:因为高位是0,直接跳过,仍然为00000000101100000
  • 第九步:00000000101100000(当前高四位为1011,与生成多项式1011进行异或操作)结果为00000000000000000

最终得到的余数取结果的后3位,因为多项式最高幂次为3,即:000,所以,数据 11010011101100通过生成多项式 1011的 CRC 校验码为000。因此将算得到的CRC校验值000附加到原始数据的末尾,即为1010011101100000。
四、接收方校验:
接收方接收到添加CRC校验值的数据帧后,使用相同的生成多项式1101对收到的数据帧(包括附加的CRC校验值)进行模2除法。由于生成多项式的设计在数学上的特性,如果最终结果为0,说明数据传输没有错误。

3.2.6 ACK段

在这里插入图片描述

  • ACK应答位:占1位,对接收方而言,该位可以表示接收节点是否正确接收到数据帧。具体来说,当接收节点正确接收到一个完整的数据帧且通过CRC校验时,它会在ACK应答位上发送一个显性电平(逻辑0),以表示正确接收。如果数据帧有多个接收节点,只要有一个节点正确接收并发送ACK应答,发送节点就会接收到确认信号;对发送方而言,该位可以检查接收节点是否正确接收到数据帧。具体来说,发送节点在发送数据帧后,会检查ACK应答位。如果ACK应答位为显性电平(逻辑0),则表示至少有一个接收节点正确接收到数据帧。如果ACK应答位保持隐性电平(逻辑1),则表示没有接收节点正确接收到数据帧,发送节点可以选择重发数据帧。
  • ACK界定符:占1位,用于明确标识ACK段的结束,帮助接收节点区分ACK应答位和后续段。

3.2.7 帧结束段

在这里插入图片描述
占7位,由7个连续的隐性位(逻辑1)组成,表示帧的结束。

但是,帧结束,并不意味着总线空闲,只有检测到有11个连续的隐性位时,发送方才会认为总线是空闲的。如下图所示:
在这里插入图片描述
11个位包含:一位ACK界定符,7位帧结束,3位帧间隔。当这11位结束后节点才能发送报文。

3.2.8 CAN报文的位填充规则

CAN报文的位填充规则,即一个数据帧中连续5个相同的位后面必须要插入一个相反的位,因此标准帧的8个字节,是在接收方去除掉发送方填充位的基础上确定的。

在这里插入图片描述

之所以用位填充规则,原因如下:

  • 时钟同步:CAN总线是一种异步通信协议,信号的变化可以用于时钟同步。如果数据帧中有过长的连续相同电平,接收节点可能无法准确同步其时钟。因此,位填充通过引入信号变化,可以确保接收节点能够持续同步时钟。
  • 防止错误检测机制失效:长时间的连续相同电平可能导致接收节点的误判,特别是在使用CRC校验时。如果帧内没有足够的信号变化,CRC校验可能无法有效检测到错误。通过位填充,信号中引入了更多变化,从而可以提高错误检测的可靠性。
  • 总线仲裁机制:在CAN总线通信中,总线仲裁机制依赖于信号的变化来确定总线的控制权。如果信号长时间不变,可能导致仲裁失败或冲突。位填充可以确保总线上的信号具有足够的变化,使得仲裁机制能够正常工作。

这里有两个问题需要着重说明:
1.由于位填充规则,接收方真实接收到的数据是否会与发送方发送的数据不同?
实际上,发送方和接收方在进行数据传输前,会约定相同的规则,发送方会根据位填充发送数据,接收方知道这个约定后会进位去除,因此,在CRC校验无误的基础上,接收方真实接收的数据,不会由于位填充规则,与发送方发送的数据不同。
2.为什么位填充规则是连续5个相同的位后面插入一个相反的位,而不是3个或其它个数?
实际上,连续相同的位个数是经过大量实验测试的,若个数太小,总线上数据帧的带宽会明显变宽,若个数较大,同步的效果会不好。

4. CAN节点状态的错误处理

4.1 CAN节点的错误类型

  • CRC错误:若接收节点发送的CRC值与发送节点发送的CRC值不一样,说明在传输过程中数据出现了错误,则会发送CRC错误。该错误的检测区域是数据帧的CRC段。
  • 位填充错误:若传输的帧信号违反了位填充规则,则会发送位填充错误。该错误的检测区域是数据帧的帧起始位到CRC段的最后一位结束。
  • 应答错误:若发送节点在ACK阶段没有接收到应答信号,说明接收节点没有成功接收到消息帧,则会发送应答错误。该错误的检测区域是数据帧的ACK段。
  • 位发送错误:在数据帧传输期间,发送节点同时对比发送电平与总线电平,若检测总线电平与发送电平不同,则会发送位发送错误。该错误的检测区域是数据帧的所有段。
  • 格式错误:若检测到传输的数据帧格式与任何一种合法的帧格式不符,则会发送格式错误。该错误的检测区域是数据帧的DEL和EOF段。

4.2 CAN节点的错误状态

4.2.1 主动错误状态

该状态是CAN节点的默认状态。当节点检测到错误时,会进入主动错误状态。处于主动错误状态的节点会在总线上发送主动错误帧以通知其他节点发生了错误。主动错误帧,包括6个显性位和后续8个显性位(错误标志)以及错误定界符,主动错误帧能强制占用总线,确保其他节点能够检测到错误。当节点检测到发送错误时,TEC增加,检测到接收错误时,REC增加。当TEC或REC达到128时,节点会从主动错误状态转换为被动错误状态。
主动错误帧如下:
在这里插入图片描述

4.2.2 被动错误状态

该状态表示节点已经检测到一定数量的错误,但仍能参与通信。处于被动错误状态的节点发送被动错误帧,该帧包含6个隐性位和后续8个隐性位(错误标志)以及错误定界符。被动错误状态的节点在发送数据时不会强制占用总线。如果TEC超过128但低于256,节点进入被动错误状态。在被动错误状态下,节点不再发送显性错误帧,而是发送隐性错误帧。如果错误计数器降低到128以下,节点可以从被动错误状态返回到主动错误状态。
被动错误帧如下:
在这里插入图片描述

4.2.3 总线关闭状态

该状态是最严重的错误状态。当节点的TEC达到或超过256时,节点进入总线关闭状态。进入总线关闭状态的节点会完全断开与CAN总线的连接,不再参与通信。此机制可以防止节点持续产生错误而影响整个网络。

4.2.4 错误状态转换逻辑

  • 主动错误到被动错误:当TEC或REC超过128时,节点从主动错误状态进入被动错误状态。
  • 被动错误到总线关闭:当TEC达到或超过256时,节点从被动错误状态进入总线关闭状态。
  • 恢复到主动错误:当节点在被动错误状态下成功传输一定数量的数据帧或错误计数器降低到128以下时,可以恢复到主动错误状态;当节点在总线关闭状态下,可以复位(一般重新上电)或者检测到128次11位连续隐性位时,可以恢复到主动错误状态。
  • 11
    点赞
  • 20
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值