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

正文:          

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

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

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

一:避免与CAN错误帧冲突

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

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

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

一:避免与CAN错误帧冲突

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

 主动错误帧: 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:硬件同步:比较好理解

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

1:总线需进入空闲状态

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

2:再同步

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

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

“在接收过程中(可以理解为帧中sof以后的数据) 检测出总线上的电平变化时进行的同步调整。
每当检测出边沿时,根据 SJW 值通过加长 PBS1 段,或缩短 PBS2 段,以调整同步。但如果发生了超出 SJW
值的误差时,最大调整量不能超过 SJW 值。”

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

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

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

补丁1:c2024.4.28号补充

补充知识点1:这里CRC是包含CRC界定符的。

补充知识点2:为什么位填充的工作和检查范围是[SOF-CRC(包含CRC界定符)]这就牵扯到ACK的问题了。

我们假设两个试验前提

1:CRC的低4bit,全为隐性,+1bit长度的CRC间隔符,

2:那么如果位填充的范围,包含ACK符(对于TX节点和RX节点同时有效)。

那么将会面对什么样的情况,发送节点将会自己将ACK符所在的位自行填充,发送隐性位。

接受节点将会按照填充规则,将发送节点填充的隐性位,在数据链路层就过滤掉,然后将ACK下一位的ACK Slot认为是ACK位,进行拉低成显性位。此时发送节点又将ACK Slot回读,认为发送和回读不一致(将会产生错误帧)

  • 1
    点赞
  • 17
    收藏
    觉得还不错? 一键收藏
  • 3
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值