当前位置: 首页 > news >正文

温故知新(十三)——CAN

目录

  • 1 简介
  • 2 CAN物理层
    • 2.1 CAN拓扑
    • 2.2 CAN差分信号
    • 2.3 低速CAN的容错能力
  • 3 CAN数据链路层
    • 3.1 通信机制
      • 3.1.1 多主机
      • 3.1.2 寻址机制
      • 3.1.3 总线访问CSMA/CD+AMP
      • 3.1.4 报文接收过滤
    • 3.2 报文种类及结构
      • 3.2.1 报文种类
      • 3.2.2 数据帧
      • 3.2.3 远程帧
      • 3.2.4 位填充
      • 3.2.5 错误帧
        • 3.2.5.1 位错误
        • 3.2.5.2 ACK错误
        • 3.2.5.3 填充错误
        • 3.2.5.4 CRC错误
        • 3.2.5.5 格式错误
        • 3.2.5.6 节点错误状态
      • 3.2.6 过载帧
      • 3.2.7 帧间隔
    • 3.3 CAN同步
      • 3.3.1 位时序
        • 3.3.1.1 同步段(Synchronization Segment,SS)
        • 3.3.1.2 传播段(Propagation Time Segment,PTS)
        • 3.3.1.3 相位缓冲段1(Phase Buffer Segment 1,PBS1)
        • 3.3.1.4 相位缓冲段2(Phase Buffer Segment 2,PBS2)
        • 3.3.1.5 同步跳转宽度(Synchronization Jump Width, SJW)
        • 3.3.1.6 采样点
        • 3.3.1.7 波特率
      • 3.3.2 同步
        • 3.3.2.1 硬同步
        • 3.3.2.2 重新同步
  • 4 参考技术文档


1 简介

CAN总线是由德国研发和生产汽车电子产品著称的BOSCH公司开发的,并最终成为国际标准(ISO11519),是国际上应用最广泛的现场总线之一。CAN总线是一种多主控的总线系统。传统总线系统如USB或以太网等是在总线控制器的协调下,实现从A节点到B节点大量数据的传输。CAN网络的消息是广播式的,即在同一时刻网络上所有节点侦测的数据是一致的,它是一种基于消息广播模式的串行通信总线。

因为传输距离越大,信号时延也越大,为了保证消息的正确采样,总线上的信号速率相应也要下降。推荐信号速率与距离的关系如下表所示。

总线距离/m总线信号频率/Mbps
401
1000.5
2000.25
5000.1
10000.05

CAN总线标准规定了物理层和数据链路层。相关原理如下:


2 CAN物理层

2.1 CAN拓扑

连接在CAN总线上的设备叫做节点设备(CAN Node),CAN网络的拓扑一般为线型。线束最常用的是双绞线,线上传输为对称的差分电平信号。CAN总线网络的节点主要包括Host控制器收发器。Host常集成有CAN控制器,CAN控制器负责处理协议相关功能,以减轻Host的负担。CAN收发器将控制器连接到传输媒介。通常控制器和总线收发器通过光耦或磁耦隔离,这样即使总线上过压损坏收发器,控制器和Host设备也可以得到保护

在发送数据时,CAN控制器把要发送的二进制编码通过CAN_Tx线发送到CAN收发器,然后由收发器把这个普通的逻辑电平信号转化成差分信号,通过差分线CAN_High和CAN_Low输出到CAN总线网络。接收数据过程,相反。采用差分信号,可以取得更好的电磁兼容效果。因此,CAN总线物理传输媒介只需要两根线。

上图分别为高速CAN和低速CAN的终端电阻连接方式。
高速CAN总线(ISO11898)最高信号传输速率为1Mbps,支持最长距离40m。ISO11898-2要求在高速CAN总线两段安装端接电阻RL(端接电阻一般为120Ω,因为常规电缆的特性阻抗为120Ω,为了模拟无限远的传输线。)以消除反射(温故知新(十)——UART中有提到)。低速CAN(原本标准为ISO115199-2,不过在2006年已经被ISO11898-3-2006代替)最高速度只有125Kbps,要在每个收发器上的CAN_H和RTH,CAN_L和RTL上并接一个2.2kΩ的终端电阻(具体接法如下CTM1054T收发器所示)。

终端电阻作用:
提高信号质量,减小信号反射和振铃的出现;
提高抗干扰能力,确保快速进入隐性状态(让总线寄生电容快速放电),防止外部的干扰只需要极小的能量即可令总线进入显性(一般的收发器显性门限最小电压仅500mV)。

高/低速CAN的连接单元数最大值是在对应CAN速率最高的情况下的理论值(高速CAN速率1Mbps时,最多连接30个单元;低速CAN速率125kbps时,最多连接20个单元)。

2.2 CAN差分信号

其中低速CAN又称为容错CAN,其与高速CAN在电平逻辑上也存在不同。
CAN总线采用差分信号传输,通常情况下只需要两根信号线就可以进行正常的通信。在差分信号中,逻辑0和逻辑1是用两根差分信号线的电压差来表示。
高速 CAN 总线上为显性电平(逻辑 0)时,CAN_H 为 3.5V、CAN_L 为 1.5V,此时电压差是 2V;为隐性电平(逻辑 1)时,CAN_H 和 CAN_L 都为 2.5V,此时电压差就是 0V。

低速 CAN 总线上为显性电平(逻辑 0)时,CAN_H 为 3.6V、CAN_L 为 1.4V,此时电压差是 2.2V;总线上为隐性电平(逻辑 1)时,CAN_H 为 0.3V、CAN_L 都为 4.7V,此时电压差就是-4.4V。

CAN总线遵从“线与”机制:“显性”位可以覆 盖“隐性”位;只有所有节点都发 送“隐性”位, 总线才处于“隐性” 状态。这种“线与”机制使CAN总线呈现显性优先(逻辑0)的特性。

2.3 低速CAN的容错能力

虽然低速CAN通信速率低、承载节点数少,但低速CAN有它无可替代的优势——容错。
可以看到容错CAN的电平在显隐性变化时相比于高速CAN更大,因此其差分传输具有更强的抗干扰能力。
容错CAN能在CAN_H或CAN_L出现短路、断路时保证通信正常。低速容错CAN支持单线模式,当检测到一条线故障时,可以进入单线模式进行通信,此时会选定一个值作为参考电压,例如2.5V。在单线模式时,低速CAN会继续监视另外一条线,当故障排除后改用双线模式。
下图为某接收器的容错CAN故障处理表


3 CAN数据链路层

CAN的数据链路层相比于前面文章提过的几种通讯协议都要更加复杂,因此也奠定了其在多场景应用下的可靠性。

3.1 通信机制

3.1.1 多主机

安全敏感的应用(如汽车动力)对通信系统的可靠性要求很高。将总线能否正常工作归结到单一节点是非常危险的,因此,对于总线的接入常进行去中心化,即每个节点都有接入总线的能力。这也是CAN总线采用多主控(Multi-Master)线性拓扑结构的原因。

在CAN总线上,每个节点都有往总线上发送消息的能力,==而消息的发送不必遵从任何预先设定的时序,通信是事件驱动的。==只有当有新的信息传递时,CAN总线才处于忙碌的状态,这使得节点接入总线速度非常快。CAN总线理论最高数据传输速率为1Mbps,对于异步事件反应迅速,基本对于ms级别的实时应用没有任何问题。

3.1.2 寻址机制

不同于其它类型的总线,CAN总线不设定节点的地址,而是通过消息的标识符(Identifier)来区别消息。这种机制虽然会增加消息的复杂度(增加标识符),但是节点在此情况下可以无需了解其他节点的状况,而相互间独立工作。在总线上增加节点时仅需关注消息类型,而非系统上其他节点的状况。这种以消息标识符寻址的方式,让总线上增加节点变得更加灵活。

3.1.3 总线访问CSMA/CD+AMP

CAN总线通信原理可简单描述为多路载波侦听+基于消息优先级的冲突检测和非破坏性的仲裁机制(CSMA/CD+AMP)。CSMA(Carrie Sense Multiple Access)指的是所有节点必须都等到总线处于空闲状态时才能往总线上发送消息;CD+AMP(Collision Detection + Arbitration on Message Priority)指的是如果多个节点往总线上发送消息时,具备最高优先级的消息获得总线。

标准CAN通讯的发送优先级是根据ID来判断的,ID越小则CAN报文优先级最高。
在DSP中这种发送优先级的实现在标准CAN模式(SCC模式)下是根据邮箱号而言,此时只有16个邮箱有效(0 ~ 15)邮箱号越大,优先级最高。eCAN模式下(32个邮箱有效),邮箱的传输优先级取决于寄存器MSGCTRL.TPL[12…8],可以设置优先级(0~31)。
如果DSP的CAN有两个邮箱具有相同优先级,那么具有较高的邮箱号的邮箱优先传输,所以eCAN模式下在没有配置MSGCTRL.TPL时,优先级按照邮箱号的大小来。

值得注意的是,此处所描述的优先级指的是设备发送CAN报文的优先级,而非CAN报文在总线上竞争时所涉及到优先级问题。

  • 多路载波侦听:网络上所有节点以多点接入的方式连接在同一根总线上,且发送数据是广播式的。网络上各个节点在发送数据前都要检测总线上是否有数据传输:若网络上有数据,暂时不发送数据,等待网络空闲时再发;若网络上无数据,立即发送已经准备好的数据。
  • 冲突检测:节点在发送数据时,要不停的检测发送的数据,确定是否与其他节点数据发送冲突,如果有冲突,则保证优先级高的报文先发送
  • 非破坏性逐位仲裁机制:通过ID仲裁,ID数值越小报文优先级越高。倘若ID的前几位相同,那么会逐位比较ID的位。如果一个节点写进了隐性位而读回显性位,节点会知道另一个高优先权(ID更小)节点正在占用总线,该节点会停止传送报文并继续接收总线报文。
上图为非破坏性逐位仲裁机制的示意图 上图为三个节点通过ID判断优先级,处理同时发送的冲突,同理于CNA总线的**线与机制**

CAN总线上的逐位仲裁机制与I2C总线的仲裁都应用到线与逻辑的电路基础,不同的是I2C的仲裁只是在主机间进行,而CAN总线没有主从机的概念。另外I2C的消息本身是不分优先级的,而CAN消息则是带优先级,有的消息出身高贵(标识符值越小),在仲裁中总会取胜。

上图为三个节点实际的ID冲突处理,分为三个竞争阶段,完成报文发送。 上图为高优先级的报文不能中断低优先级报文的发送。

3.1.4 报文接收过滤

CAN控制器大多具有根据ID过滤报文的功能,即只接收某些ID的报文。节点对接收到的报文进行过滤:比较消息ID与选择器(Accepter)中和接收过滤相关位是否相同。如果相同,接收;如果不相同,则过滤。

标准CAN模式(SCC)下,DSP会通过适当的接收屏蔽来屏蔽掉当前不应进行比较的标识符。全局接收屏蔽(GAM)用于6 ~ 15邮箱;进入的消息被存储在有匹配标识符的编号最高的邮箱。如果在6 ~ 15邮箱中没有匹配的标识符,则把消息与存储在邮箱3 ~ 5(采用局部接收屏蔽LAM[3])的标识符相比较,之后是邮箱0 ~ 2(采用局部接收屏蔽LAM[0])的标识符。

3.2 报文种类及结构

3.2.1 报文种类

在原始数据段的前面加上传输起始标签、片选(识别)标签、控制标签,在数据的尾段加上CRC校验标签、应答标签和传输结束标签。把这些内容按特定的格式打包好,就可以用一个通道表达各种信号了。各种各样的标签,起到了协同传输的作用。当整个数据包被传输到其他设备时,只要这些设备按格式去解读,就能还原出原始数据。类似这样的数据包就被称为CAN的数据帧。

为了更有效的控制通信,CAN一共规定了5种类型的帧,帧也称为报文。

3.2.2 数据帧

数据帧在CAN通信中最主要,也最复杂。数据帧以一个显性位(逻辑0)开始,以7个连续的隐性位(逻辑1)结束。CAN总线的数据帧有标准格式(Standard Format)和扩展格式(Extended Format)的区分。

CAN标准数据帧包含44到108位(64位发送数据),而CAN扩展数据帧包含64到128位(64位发送数据)。另外,标准数据帧最高可插入23个填充位,而扩展数据帧最高却可插入28个填充位,这主要取决于数据流编码位填充概念,见3.2.1.3)。标准帧的最大总数据帧长度为131位,而扩展帧为156位。

数据帧可以分为七段:

  1. 帧起始(Start-of-Frame, SOF)
    标识一个数据帧的开始,固定一个显性位用于同步, 总线空闲期间的任何隐性到显性的跳变都将引起节点进行硬同步3.2.1.3会再次提到)。只有总线在空闲期间节点才能够发送SOF。

  2. 仲裁段(Arbitration Field)
    仲裁段的内容主要为本数据帧的ID信息。数据帧分为标准格式和扩展格式两种,区别就在于ID信息的长度:标准格式的ID为11位;扩展格式为29位。
    2.1 标准帧的仲裁段由11位ID码和一个显性位RTR码组成,RTR码为远程帧标识位
    2.2 扩展帧的仲裁段由29位ID码、一位显性的SRR码、一位隐性的IDE码和一位显性的RTR码组成。

值得注意的是,如果存在具有相同ID的数据帧以及对应的远程帧在总线同时竞争时,仲裁段最后一位(RTR)为显性位的**数据帧具有优先权,可继续发送。
标准帧ID与具有相同ID的远程帧或者相同ID的扩展帧的数据帧进行总线竞争时,
标准帧的RTR位为显性位具有优先权**,可继续发送。

  1. 控制段
    3.1 标准帧的控制段由单位显性的IDE、保留位 r 和4位数据长度代码DLC组成,DLC(Data Length Code)数据段采用BCD编码,DLC段由4位组成,DLC3 ~ DLC0,表示的数字为0 ~ 8。;
    3.2 扩展帧的控制段由两个保留位r1和r0和4位的DLC数据段组成,r1和r0都为显性填充,接收时无论保留位是显性还是隐性都没有影响;

  2. 数据段
    数据帧的核心内容,有0 ~ 8个字节长度,由DLC确定。

  3. CRC段
    为了保证报文的正确传输,CAN的报文包含了一段15位的CRC校验码,一旦接收端计算出的CRC码跟接收到的CRC码不同,就会向发送端反馈出错信息以及重新发送。CRC部分的计算和出错处理一般由CAN控制器硬件完成,或由软件控制最大重发数。
    在CRC校验码之后,有一个CRC界定符“DEL”,它为隐性位,主要作用是把CRC校验码与后面的ACK段隔开。CRC校验范围为帧起始、仲裁段、控制段和数据段。

  4. ACK段
    包含确认位(ACK slot)和隐性界定符(Delimiter, DEL)。ACK在发送节点发送时,为隐性位。当接收节点正确接收到报文时,对其用显性位覆盖。

  5. 帧结束段(End-of-Frame, EOF)
    帧结束段由发送端发送7个隐性位表示结束。

3.2.3 远程帧

远程帧帧格式跟数据帧类似,也分为标准帧跟扩展帧,但是远程帧属于被请求发送节点发送的报文,而数据帧是发送节点的报文。

参照数据帧可了解远程帧的结构,但是两者之间也有不同:

  • SRR段和RTR段:数据帧是显性电平,远程帧是隐性电平
  • 节点性质:数据帧是发送节点发出的报文格式,远程帧是被请求发送的节点发送的报文格式;
  • CRC校验范围:数据帧是帧起始、仲裁段、控制段和数据段,而远程帧则是帧起始、仲裁段和控制段。

3.2.4 位填充

CAN总线属于异步串行通信,这种通信方式没有时钟线,所以各个收发器的时钟不可能完全一致,时钟不一致就会造成偏差。所以为了解决这个问题,CAN总线采用同步的方式来校准时钟。CAN总线规定信号的跳变沿为同步信号,只要信号发生变化,节点时钟就被同步一次。CAN总线还规定同步的最大周期为5个位。
不过在仲裁段(ID)或者数据段中依旧有较大的概率出现连续5个位为同极性。因此CAN总线为了解决这种情况加入了位填充的概念,即当同极性的位电平持续五位时,下一个位添加一个极性相反的电平位。这样做的好处是明显解决了前述的问题,不过这也带来一些不一样的情况,例如存在即使两个帧都是标准数据帧,但发送不同ID或者数据段的时候报文时间会不同,不过其位总数也是受限制的,前面已经叙述了。

  • 对于发送节点而言: 在发送数据帧和遥控帧时,对于SOF~CRC(除去CRC界定符) 之间的位流,相同极性的电平如果持续5位,那么在下一个位插入一个与之前5位极性相反的电平
  • 对于接收节点而言: 在接收数据帧和遥控帧时,对于SOF~CRC(除去CRC界定符)之间的位流,相同极性的电平如果持续5位,那么需要删除下一位再接收

3.2.5 错误帧

在发送或者接收报文时,总线上的节点如果检测出错误,那么该节点就会发送错误帧,通知总线上对应节点。
错误帧由错误标志和错误界定符两个部分组成。

错误标志可以分为:

  • 主动错误标志:6个连续的显性位;
  • 被动错误标志:6个连续的隐性位;

错误界定符:8个连续的隐性位。

在上图可以看到在错误标志之后其实还有0~6位的错误标志重叠。
这是由于如果发送一个主动错误标志,由于其为6个连续的显性位,所以会触发位填充错误(上述描述了位填充的规则),因此会引发其他节点检测到填充错误,从而发送错误标志。由于主动错误标志为显性位,根据线与原则会形成多余的显性位在总线上,从而与之前的主动错误标志形成错误标志重叠部分

错误帧的种类有以下五种:

  1. 位错误
  2. ACK错误
  3. 填充错误
  4. CRC错误
  5. 格式错误
  • 当检测到位错误、填充错误、格式错误、ACK错误时。则在前述任意一个错误时的下一位就会开始发送错误帧。
  • 当检测到CRC错误时,紧随ACK界定符后的下一位发送错误帧。

3.2.5.1 位错误

节点将自己发送到总线上的电平与同时从总线上回读到的电平进行比较,如果发现二者不一致,那么这个节点就会检测出一个位错误。

不过可以想象到上述的描述是存在例外的:

  1. 在仲裁段,节点如果向总线发送隐形位却回读到显性位,这种情况不认为是位错误,而是节点仲裁失败。
  2. 在ACK段,节点向总线发送隐形位却回读到显性位,这种情况不认为是位错误,而实该节点当前发送的这一帧报文至少被一个其他节点正确接收的反馈。
  3. 某节点发送被动错误标志,该节点向总线发送连续六个隐性位(被动错误标志)却回读到显性位,这种情况不认为是位错误。因为被动错误标志是六个连续的隐性位,所以在总线上按照线与机制,有可能这六个连续隐性位被其它节点发送的显性电平覆盖;

3.2.5.2 ACK错误

按照CAN协议的规定,在一帧报文(数据帧或者遥控帧)发出之后,如果接收节点成功接收了该帧报文,那么接收节点就要在该帧报文ACK槽对应的时间段内向总线上发送一个显性位来应答发送节点。这样发送节点就会在ACK槽时间段内从总线上回读到一个显性位。
当发送节点在ACK槽时间段内没有回读到显性位,那么发送节点Node_A就会检测到一个ACK应答错误。这表示没有一个节点成功接收该帧报文。

3.2.5.3 填充错误

在需要执行位填充原则的帧段(数据帧遥控帧的SOF~CRC序列),检测到连续六个同性位,则检测到一个填充错误。

3.2.5.4 CRC错误

发送节点在发送数据帧或者遥控帧时,会计算出该帧报文的CRC序列。接收节点在接收报文时也会执行相同的CRC算法,如果接收节点计算出的CRC序列值与发送节点发来的CRC序列值不一致,那么接收节点就检测到一个CRC错误。

3.2.5.5 格式错误

在一帧报文发送时,如果在必须发送预定值的区域内检测到了非法值,那么就检测到一个格式错误。
CAN报文中,有预定值的区域包括:

  • 数据帧和遥控帧的CRC界定符、ACK界定符、EOF等;
  • 错误帧界定符
  • 过载帧界定符

3.2.5.6 节点错误状态

按照CAN协议的规定,CAN总线上的节点始终处于以下三种状态之一。

  • 主动错误状态
  • 被动错误状态
  • 总关闭状态

当满足一定的条件时,节点可以从一种状态转换为另外一种状态。

  1. 主动错误状态:
    1) 节点处于主动错误状态可以正常通信
    2) 处于主动错误状态的节点(可能是接收节点也可能是发送节点)在检测出错误时,发出主动错误标志

  2. 被动错误状态:
    1)节点处于被动错误状态可以正常通信
    2)处于被动错误状态的节点(可能是接收节点也可能是发送节点)在检测出错误时,发出被动错误标志

值得注意的是:
处于主动错误状态或被动错误状态的节点仍然可以正常通信,这里的正常通信指的是:节点仍然能够从总线上接收报文,也能够竞争总线获胜后向总线上发送报文。但是不代表接收的报文一定正确也不代表一定能正确的发送报文

  1. 总线关闭状态
    1)节点处于总线关闭状态,那么该节点不能收发报文
    2)处于总线关闭状态的节点,只能一直等待,在满足一定条件的时候,再次进入到主动错误状态。

CAN节点错误状态的转换,就是基于这TECREC两个计数器来进行的。

3.2.6 过载帧

过载帧是接收节点向总线上其它节点报告自身接收能力达到极限的帧。
过载帧包括:过载标志和过载界定符两个部分。

过载帧包括:过载标志和过载界定符两个部分。
  • 过载标志:连续6个显性位;
  • 过载界定符:连续8个隐性位。
    与错误帧类似,过载帧中有过载帧重叠部分,且形成过载重叠标志的原因与形成错误帧中的错误重叠标志的原因是相同的

对于过载帧的帧结构可以这样理解:接收节点达到接收极限时,就会发出过载帧到总线上,显然,过载标志的6个连续显性位会屏蔽掉总线上其它节点的发送,也就是说这个时候接收节点通过发送过载帧的方式来破坏其它节点的发送,这样在其发送过载帧期间,其它节点就不能成功发送报文,于是就相当于把其它节点的发送推迟了从而使得接收节点能够处理过载情况。

引起过载的三种情况:

  1. 接收节点自身原因。接收节点由于某种原因需要延迟接收下一个数据帧或者遥控帧;
  2. 在帧间隔的间歇段的第一位和第二位检测到一个显性位(正常的间歇段都是隐性位);
    帧间隔的间隔段本应是三个连续的隐性位,如果接收节点在间隔段检测到显性位,那么就意味着此时有报文发向接收节点,但这个时候当前报文未处理完,是不应该有报文发来的,于是接收节点发送过载帧。
  3. CAN节点在错误界定符或过载界定符的第八位(最后一位)检测到一个显性位0,节点会发送一个过载帧,且错误计数器不会增加。
    接收节点在错误界定符和过载界定符的最后一位检测到显性位,也意味着有报文发向接收节点,但这个时候是不应该有报文发来的,于是接收节点发送过载帧。

3.2.7 帧间隔

帧间隔是用来隔离数据帧(或者遥控帧)的,也就是说,数据帧(或者遥控帧)通过插入帧间隔可以将本帧与先行帧(数据帧、遥控帧、错误帧、过载帧)分隔开来。

值得注意的是,过载帧错误帧的前面不能插入帧间隔

帧间隔有两种不同的形式:

  • 主动错误状态的帧间隔:

  • 被动错误状态的帧间隔:

  • 间隔段:连续三个隐性位;间隔段期间,所有节点不允许发送数据这或遥控帧,只要在这期间监听到显性位,接收节点就会发送过载帧

  • 空闲段:连续隐性位,个数不一定,0个或者多个都可以。总线空闲的时间是任意长的,只要总线空闲,节点就可以竞争总线。

  • 暂停段:只有处于被动错误状态的节点在发送帧间隔的时候,才会在帧间隔中插入8个连续隐性位的暂停段。

暂停段,又叫做延迟传送段,为什么节点处于被动状态时会有这样一段呢。
原因如下:首先,考虑主动错误状态的节点A,发送主动错误标志之后,随之就要重新发送刚刚发送失败的报文,但是为了间隔开与前面刚刚发送的错误帧,总线在错误帧之后就会插入3个隐性位的帧间隔,在这3个隐性位期间,其它的节点不足以判定总线空闲(需要连续11个隐性位才能判定),所以节点A仍然占据着总线的控制权,于是在帧间隔之后,节点A能够接着发送报文。
然而当节点A转入到被动错误状态时,说明它已经不是很可靠了,这个时候如果没有延迟传送段,在节点A发出被动错误标志之后,它仍然能够在3位的帧间隔之后立即重新发送报文,这是不符合我们对被动错误状态的处理要求,于是乎对于发送出被动错误标志的节点,总线在帧间隔中加入了8个连续隐性位的延迟传送段,这样的3+8=11个连续隐性位。从而使得节点A在这个帧间隔期间失去对总线的控制权,从而优先保证其它正常(处于主动错误状态)节点能够使用总线,而不必等着一个已经不可靠的节点A占据总线

3.3 CAN同步

CAN总线使用位同步的方式来确保通信时序,以及对总线的电平进行正确采样。

3.3.1 位时序

在讲位时序之前,首先介绍几个基本概念。
时间份额tQ:CAN控制器工作的最小时间单位,通常对系统时钟分频得到。

假如系统时钟频率36MHz,预分频因子为4,则CAN时钟频率9MHz,即tQ =1/9M。假设一个CAN位包含10个tQ,则一个位周期T=10tQ,从而波特率为1/T=0.9MHz。

为了实现位同步,CAN协议把每一位的时序分解成下图所示的四段。这四段的长度加起来即为一个CAN数据位的长度。一个完整的位由8-25个tQ组成。

3.3.1.1 同步段(Synchronization Segment,SS)

一个位的输出从同步段开始
若总线的跳变沿被包含在SS段的范围之内,则表示节点与总线的时序同步。节点与总线同步时,采样点采集到的总线电平即可被确定为该电平的电位。SS段的大小为1tQ

3.3.1.2 传播段(Propagation Time Segment,PTS)

用于补偿信号在网络和节点传播的物理延时时间,是总线上输入比较器延时和输出驱动器延时总和的两倍。通常1-8tQ

3.3.1.3 相位缓冲段1(Phase Buffer Segment 1,PBS1)

主要用于补偿边沿阶段的误差,其时间长度在重新同步时可以加长。初始大小1-8tQ

3.3.1.4 相位缓冲段2(Phase Buffer Segment 2,PBS2)

也是用于补偿边沿阶段的误差,其时间长度在重新同步时可以缩短。初始大小2-8tQ

时间段1必须大于时间段2

3.3.1.5 同步跳转宽度(Synchronization Jump Width, SJW)

SJW的值(该值是调节范围的最大值)直接影响到重同步时相位缓冲段的可调节的范围(某些情况下频率不稳定等情况),SJW的值可以在1 ~ 4tQ之间选择,我们选择3、4可以使总线获得更宽的波特率容忍度。

3.3.1.6 采样点

采样点是位时间内的一个时间点。在该时间点,读取总线电平并进行分析。采样点位于相位缓冲段 PBS1 的终点。
但当采样模式设置为每位采样 3 次时存在区别:这种情况下,在 PBS1 的终点对某一位进行一次采样,前两次的采样时间间隔为 tQ / 2,而该位的值将根据三个采样值中至少两次采样的相同值决定。
但是采用三次采样经常会影响SJW的跳转,所以实际应用中我们一般都会采用单次采样。

3.3.1.7 波特率

Baud=1/(tss+tseg1+tseg2)
其中tss为同步段时间;tseg1为时间段1的时间,tseg1=tPTS+tPBS1;tseg2为时间段2的时间,tseg2=tPBS2
波特率原则:

  1. Tseg2 >= SJW;
  2. 波特率预分频系数尽量小,SJW尽量大;
  3. 采样点选取在位时间的75%~85%之间。
  4. 采用单次采样。

3.3.2 同步

CAN同步分为硬同步重新同步
同步规则:

  • 一个位时间内只允许一种同步方式;
  • 任何一个“隐性”到“显性”的跳变都可用于同步(同步可以选择多种方式:下降沿或者同时上升沿和下降沿);
  • 硬同步发生在SOF阶段,所有接收节点调整各自当前位的同步段,使其位于发送的SOF位内。
  • 重新同步发生在一个帧的其他阶段,即当总线跳变沿落在某节点位时间的同步段之外。

3.3.2.1 硬同步

当总线上出现帧起始信号(SOF,即隐性到显性的边沿)时,其他节点的控制器根据总线上的这个下降沿对自己的位时序进行调整,把该下降沿包含到SS段内。这样根据起始帧来进行的同步称为硬同步。

可以看到在总线出现帧起始信号时,该节点原来的位时序与总线时序不同步,因而这个状态的采样点采集到的数据是不正确的。所以节点以硬同步的方式调整,把自己的位时序中的SS段平移至总线出现下降沿的部分,获得同步,这时采样点采集到的数据是正确数据。
同步前

同步后

3.3.2.2 重新同步

因为硬同步时只是在有帧起始信号时起作用,无法确保后续一连串的位时序都是同步的,所以CAN引入了重新同步的方式。在检测到总线上的时序与节点使用的时序有相位差时(即总线上的跳变沿不在节点时序的SS段范围),通过延长PBS1段或缩短PBS2段来获得同步,这样的方式称为重新同步

重新同步分两种情况:

  1. 节点从总线的边沿跳变中,检测到它的时序比总线的时序相对滞后2个tQ,这是控制器在下一个时序中的PBS1段增加2Tq的时间长度,使得节点与总线时序重新同步。(SJW越大,则对于过大的滞后能够更快的恢复)。

  2. 节点从总线的边沿跳变中,检测到它的时序相对超前2 tQ,这时控制器在前一个位时序中的PBS2段减少2 tQ的时间长度,获得同步。

在重新同步的时候,PBS1和PBS2段的允许加长或缩短的时间长度定义为,重新同步补偿宽度(SJW,reSynchronization Jump Width)。这里设置的PBS1和PBS2能够增减的最大时间长度SJW=2 tQ,若SJW设置的太小则重新同步的调整速度慢,若太大,则由于一次插入的延迟过大,从而易影响传输速率


4 参考技术文档

一口气从零读懂CAN总线
【干货】浅谈CAN发送仲裁机制
硬件接口协议之“CAN总线仲裁及优先级”
CAN总线学习笔记(3)- CAN协议错误帧

相关文章:

  • 如何跳出forEach循环
  • 大咖论道|银行核心系统国产分布式数据库选型思考
  • 简单5分钟,将lowcode低代码融入到你的中后台管理系统
  • token、cookie、session
  • 强大多云混合多K8S集群管理平台Rancher入门实战
  • 学习编程的第二十四天
  • 第五十一周总结——对象遍历方法
  • java计算机毕业设计民宿预订管理系统设计与实现源码+数据库+系统+lw文档+mybatis+运行部署
  • 渗透测试-微信小程序-公众号测试经验总结
  • innodb存储引擎学习–备份
  • 《nginx》二、nginx反向代理
  • FastAPI 学习之路(三十一)CORS(跨域资源共享)
  • pytorch数据增强
  • ROS1云课→14可视化交互
  • 学习处理Doxygen的xml输出
  • 《剑指offer》分解让复杂问题更简单
  • 【Linux系统编程】快速查找errno错误码信息
  • 03Go 类型总结
  • 10个最佳ES6特性 ES7与ES8的特性
  • Docker 1.12实践:Docker Service、Stack与分布式应用捆绑包
  • Dubbo 整合 Pinpoint 做分布式服务请求跟踪
  • express如何解决request entity too large问题
  • Js基础——数据类型之Null和Undefined
  • SpiderData 2019年2月25日 DApp数据排行榜
  • 阿里云前端周刊 - 第 26 期
  • 近期前端发展计划
  • 聊聊flink的TableFactory
  • 前端工程化(Gulp、Webpack)-webpack
  • 体验javascript之美-第五课 匿名函数自执行和闭包是一回事儿吗?
  • 原生js练习题---第五课
  • postgresql行列转换函数
  • 国内唯一,阿里云入选全球区块链云服务报告,领先AWS、Google ...
  • ​LeetCode解法汇总2583. 二叉树中的第 K 大层和
  • (6)设计一个TimeMap
  • (bean配置类的注解开发)学习Spring的第十三天
  • (HAL库版)freeRTOS移植STMF103
  • (pytorch进阶之路)CLIP模型 实现图像多模态检索任务
  • (二)linux使用docker容器运行mysql
  • (二)基于wpr_simulation 的Ros机器人运动控制,gazebo仿真
  • (剑指Offer)面试题34:丑数
  • (力扣题库)跳跃游戏II(c++)
  • (亲测有效)解决windows11无法使用1500000波特率的问题
  • (原)Matlab的svmtrain和svmclassify
  • (转)nsfocus-绿盟科技笔试题目
  • (转载)虚幻引擎3--【UnrealScript教程】章节一:20.location和rotation
  • .chm格式文件如何阅读
  • .net core 6 redis操作类
  • .NET 的程序集加载上下文
  • .Net的DataSet直接与SQL2005交互
  • .pings勒索病毒的威胁:如何应对.pings勒索病毒的突袭?
  • [20170705]lsnrctl status LISTENER_SCAN1
  • [383] 赎金信 js
  • [Android Pro] AndroidX重构和映射
  • [C/C++] -- 二叉树
  • [C语言]——柔性数组