CAN的填充机制解释及其延伸知识

           我们都知道CAN的填充机制是从SOF-CRC段内,每遇到5个相同极性位时便填充一位相反极性位。(CANfd也是同样的填充机制)。如下图所示。

       我在学习和工作中发现,一些同事和技术人员只知道CAN的位填充机制,却对为何CAN会采用位填充,不明所以。

      位填充不是无意义的,任何一种协议中的任何一种方法都是有其特殊的功能的。不然使用位填充的方法,即增加了数据冗成,又使得软硬件的设计变得复杂化。下面介绍位填充的两种意义。

一:避免与CAN错误帧冲突

二:位填充是与位同步机制相配合的

三:实现透明传输(后面不展开说了,最多的一条应用是帧接收界定符是7bit隐性电平,填充机制=避免了在数据传输过程中,被误认为是帧结束界定符)

CAN的填充机制解释及其延伸知识_第1张图片

      注意:童鞋们有些认为是,数据链路层以上发出来的数据是 5bit相同+然后数据链路层填充1bit,然后再判断下5bit是不是相同极性。仔细观察上图中我打标记的地方。其实是下一判断周期中已经把填充位也计算进去了。这点需要注意。

一:避免与CAN错误帧冲突

CAN协议的错误帧分为主动错误帧被动错误帧:具体格式如下

CAN的填充机制解释及其延伸知识_第2张图片

 主动错误帧: 6bit 显性+8bit隐形错误界定符

被动错误帧:6bit 隐形+8bit隐形错误界定符

     有童鞋会问为什么会产生错误叠加部分,这里原因有点复杂,有时间会另外写一份文章来单独讲。

如有兴趣可以查阅其他同仁的资料freshcoolman的博客_CSDN博客-c语言,AUTOSAR,Python领域博主

      CAN协议采用填充位机制,就是为了避免与错误帧处理机制起冲突。如果不采用位填充机制,如果CAN帧数据段发送 0x00或0xFF,就会产生连续6位显性位或显性位。会产生异常错误。

二:CAN特殊的位同步机制

时序同步在通信中的重要性不言而喻。SPI总线、I2C总线是通过单独的时钟线实现同步,LIN总线、以太网是通过帧结构专门的同步段实现同步。

CAN即没有专门的时钟线,帧结构上也没有专门用于同步的段,CAN是如何实现同步的?就不得不提CAN比较特殊的位同步机制:位同步机制!!!

位同步基础知识

“位时序
由发送单元在非同步的情况下发送的每秒钟的位数称为位速率。一个位可分为 4 段。
• 同步段(SS)
• 传播时间段(PTS)
• 相位缓冲段 1(PBS1)
• 相位缓冲段 2(PBS2)
这些段又由可称为 Time Quantum(以下称为 Tq)的最小时间单位构成。
1 位分为 4 个段,每个段又由若干个 Tq 构成,这称为位时序。
1 位由多少个 Tq 构成、每个段又由多少个 Tq 构成等,可以任意设定位时序。通过设定位时序,多个单元可
同时采样,也可任意设定采样点。
      以上部分是文档中摘抄的部分说明,我自己的理解如下
 一:一条CAN总线上的所有节点都是相同的波特率在通信,如(500k,250k)500k波特率通讯,1bit位=2us。在软件设计或配置时,再讲这2us等分为X个小段,这个小段就是Tq。第二步再通过物理层电气特性和软件架构,将以下各个段分配若干个Tq,需注意:ss段只能是一个Tq。
同步段(SS)
• 传播时间段(PTS)
• 相位缓冲段 1(PBS1)
• 相位缓冲段 2(PBS2)
要理解CAN的位同步,先要理解时钟同步和利用同步段同步
时钟同步最好理解 1:就是有单独的时钟信号控制总线上的节点,何时发生数据何时采样数据,以及某个时间段内信号的意义。
通过同步段实现同步,就是A节点率先发送一段同步信号。节点B接收后,解析这段同步信号,计算出发送节点的波特率,然后根据自己计算的位时间调整自己的接收和发送的波特率。
CAN即没有专门的时钟线,帧结构上也没有专门用于同步的段,那他是如何实现同步的?
CAN采取了一种特殊的同步机制,节点A和节点B在设计阶段好一个时序,表示各个段是干嘛的,在何处接收节点开始采样。比如你和你的好朋友约定好如下规范
每天早上八点你发一个信息“”走“”给你朋友,代表你们要一起去上学,早上八点半发送“吃”代表你们要一起去吃早饭。这样你们是不是就实现了同步。
这种方法缺点在于可是你手机的时间出现偏差,你的时间提前了半小时,早上七点半你发送信息“走”给你朋友,这样你的朋友就无法理解你的意思了。于是你和你的朋友再次约定一个方法只要接受到“走这个信号”就默认为已经八点了,你朋友将自己手机的时间调整为八点,半个小时后“当你再次发送“吃”这个信号,你朋友就知道是要一起去吃饭了。你们就又实现了同步。

CAN总线的位同步,1:硬件同步  2:再同步

1:硬件同步:比较好理解

CAN的填充机制解释及其延伸知识_第3张图片

 需要注意的是硬同步实现的前提:接收单元在总线空闲状态检测出帧起始时进行的同步调整

1:总线需进入空闲状态

2:空闲状态后,需接受到一个隐形到显性的跳变(可以理解为帧的SOF)

2:再同步

再同步是硬件同步的补充,节点A和B自身的位时序出现了偏差,已经通过硬件同步实现同步了,后续仲裁段+控制段+数据段等如何实现同步?就需要使用到再同步技术

以下是资料中对再同步的描述

“在接收过程中(可以理解为帧中sof以后的数据) 检测出总线上的电平变化时进行的同步调整。
每当检测出边沿时,根据 SJW 值通过加长 PBS1 段,或缩短 PBS2 段,以调整同步。但如果发生了超出 SJW
值的误差时,最大调整量不能超过 SJW 值。”
CAN的填充机制解释及其延伸知识_第4张图片

回到我们最初的问题,填充机制是如何配合再同步的?

发现没有,再同步实现的方法有一个必要条件,就是总线电平发送跳变,电平跳变就意味着数据发生改变(描述不是很准确,为了理解方便)。当节点A发送0x331 {00,00,00,00,00,00,00,00},数据段全0,给节点B,数据段是不是全部为显形电压,节点B就无法提供电平跳变实现与A的同步。

引入位填充机制后,数据段00发送过程中,节点A每发送5bit显性电平后,插入一位隐性电平。这个电平的跳变使得B可以与A再次实现位同步。

你可能感兴趣的:(压力测试)