CAN总线数据链路层分析(四)

参考:ISO11898-1等

前面物理层定义了比特流的一些性质及电气特性,本文主要分析数据链路层。

数据链路层(DLL)示意图

数据链路层(Data Link Layer)的作用主要是将物理层的数据比特流封装成帧,并控制帧在物理信道上的传输,还包含检错、调节传送速率等功能。

在ISO11898-1中,将数据链路层(Data Link Layer)分为两个子层:逻辑链路控制(Logical Link Control,LLC)和媒体访问控制(Medium Access Control,MAC)。

逻辑链路控制(LLC):数据链路层(Data Link Layer)的上层部分,DLL服务通过LLC为网络层提供统一接口。

媒体访问控制(Medium Access Control,MAC):定义了数据帧如何在介质上进行传输,我们知道CAN属于广播式的总线,MAC就分配了帧在信道上的使用权。

每一层都有都有各自定义的PDU(Protocol Data Uint),同层级之间的通信通过交换PDU来实现,两个上下层级通过SDU(Service Data Uint)来进行交互。


在SPI通信中,片选、时钟信号、数据输入及数据输出这四个信号都有单独的信号线。而CAN使用的是两条差分信号线,只能表达一个信号。简洁的物理层决定了CAN必然要配上一套更为复杂的协议。如何用一个信号通道实现同样甚至更强大的功能,答案就是对数据或操作命令进行打包。

一、通信机制

1.1 多主机(Multi-Master)

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

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

1.2 寻址机制

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

1.3 总线访问CSMA/CD+AMP

CAN总线通信原理可简单描述为多路载波侦听+基于消息优先级的冲突检测和非破坏性的仲裁机制(CSMA/CD+AMP)。

CSMA(Carrie Sense Multiple Access)指的是所有节点必须都等到总线处于空闲状态时才能往总线上发送消息;

CD+AMP(Collision Detection + Arbitration on Message Priority)指的是如果多个节点往总线上发送消息时,具备最高优先级的消息获得总线。

多路载波侦听

网络上所有节点以多点接入的方式连接在同一根总线上,且发送数据是广播式的。网络上各个节点在发送数据前都要检测总线上是否有数据传输:若网络上有数据,暂时不发送数据,等待网络空闲时再发;若网络上无数据,立即发送已经准备好的数据。

冲突检测

节点在发送数据时,要不停的检测发送的数据,确定是否与其他节点数据发送冲突,如果有冲突,则保证优先级高的报文先发送。

发送低优先级报文的节点退出仲裁后,在下次总线空闲时自动重发报文

非破坏性仲裁机制

通过ID仲裁,ID数值越小,报文优先级越高。

高优先级的报文不能中断低优先级报文的发送

1.4 报文接收过滤(硬件过滤&软件过滤)

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

二、CAN的报文种类及结构

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

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

2.1 数据帧

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

数据帧可以分为七段:

帧起始(SOF)

 帧起始,表示数据帧开始的段。

标识一个数据帧的开始,固定一个显性位。 ​ 用于同步,总线空闲期间的任何隐性到显性的跳变都将引起节点进行硬同步。只有总线在空闲期间节点才能够发送SOF。

仲裁段(Arbitration Field)

仲裁段,表示该帧优先级的段。

仲裁段的内容主要为本数据帧的ID信息。数据帧分为标准格式和扩展格式两种,区别就在于ID信息的长度:标准格式的ID为11位;扩展格式为29位。在CAN协议中,ID决定着数据帧发送的优先级,也决定着其他设备是否会接收这个数据帧。 仲裁段除了报文ID外,还有RTR, IDE, SRR位。

控制段

控制段,表示数据的字节数及保留位的段。

在控制段,r1(reserved1)和r0(reserved0)为保留位,默认设置为显性位。最主要的是DLC(Data Length Code)段,它是用二进制编码表示本报文中的数据段包含多少个字节。DLC段由4位组成,DLC3−DLC0,表示的数字为0-8. ​

数据段

数据段,数据的内容,一帧可发送 0~8 个字节的数据。由DLC确定。

CRC段

CRC 段,检查帧的传输错误的段。

为了保证报文的正确传输,CAN的报文包含了一段15位的CRC校验码,一旦接收端计算出的CRC码跟接收到的CRC码不同,就会向发送端反馈出错信息以及重新发送。CRC部分的计算和出错处理一般由CAN控制器硬件完成,或由软件控制最大重发数。

在CRC校验码之后,有一个CRC界定符,它为隐性位,主要作用是把CRC校验码与后面的ACK段隔开。

ACK段

ACK 段,表示确认正常接收的段。

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

帧结束段(End-of-Frame, EOF)

帧结束,表示数据帧结束的段。

帧结束段由发送端发送7个隐性位表示结束。

2.2 远程帧

(暂略)

2.3 错误帧

CAN网络具有严格的错误诊断功能,该功能已固化在硅片之中,一旦错误被检测,正在传送的数据帧将会立即停止而待总线空闲时再次重发直至发送成功,该过程并不需要CPU的干涉除非错误累计该发送器进入总线关闭( Bus Off )。经过计算,正常使用的CAN总线约一千年才会漏检出一个错误!

错误检测

可检测的错误有:位错误(Bit Error)、填充错误(Stuff Error)、ACK错误(ACK Error)、格式错误(Form Error)、CRC错误(CRC Error)。

位检测->位错误

节点检测到的位与自身送出的位数值不同。

Exception:口仲裁或ACK位期间送出“隐性”位,而检测到“显性”位不导致位错误

填充检测->填充错误

在使用位填充编码的帧场(帧起始至CRC序列)中,不允许出现六个或更多连续相同的电平位。

CRC检测->CRC错误

接收节点计算的CRC序列与接收到的CRC序列不同。

格式检测->格式错误

固定格式位场(CRC界定符、ACK界定符、帧结束)检测到一个或更多显性位。

ACK检测->ACK错误

发送节点在ACK位期间未检测到“显性”位。

错误通知

错误管理的重要概念( ISO11898 )

 1. Fault confinement(错误界定)

CAN nodes shall be able to distinguish short disturbances from permanent failures.Defective transmitting nodes shall be switched off. Switched off means a node is logically disconnected from the bus, so that it can neither send nor receive any frames.
CAN节点可以区分常规错误和永久故障。有故障的发送节点将切换到离线状态。离线意味着在逻辑上与总线断开,既不能发送也不能接收。

2. Error-active(主动错误)

An error-active node shall normally take part in bus communication and send an active error flag when an error has been detected. The active error flag shall consist of six (6) consecutive dominant bits and shall violate the rule of bit stuffing and all fixed formats appearing in a regular frame .

处于主动错误状态的节点能正常参与总线通信的收发和当检测到错误时将发送动错误标志, 错误标志由6个连续的显示位组成(这种连续的6个显示位与常规的填充位和其它帧固定格式不相同,正因为如此,硬件才容易区别)。

3. Error-passive (被动错误)
An error-passive node shall not send an active error flag. It takes part in bus communication, but when an error has been detected a passive error flag shall be sent.The passive error flag shall consist of six (6) consecutive recessive bits. After transmission, an error-passive node shall wait some additional time before initiating a further transmission .
处于被动错误状态的节点不能发送主动错误标志。它能参与正常通信,但当检测到错误时发送的是被动错误标志。被动错误标志由6个连续的隐性位组成。当发送结束后,处于被动错误状态的节点在下一次再次发送时之前需要等待一些额外时间。

4. Bus-off (离线)
A bus-off state shall not have any influence on the bus. It shall neither send any frames nor send ACK, error frames, overload frames. Whether such a node receives frames from the bus depends on the implementation.
Bus off 状态下节点不允许对总线产生任何影响,此时节点既不会发送任何报文或是发送ACK应答、错误帧、过载帧。节点是否能够接收总线报文取决于实际应用情况。

5. TEC&REC (发送错误计数器&接收错误计数器)
CAN协议描述的出错管理,完全由硬件通过发送错误计数器(CAN_ ESR寄存器里的TEC域),软件可以读出它们的值来判断CAN网络的稳定性。

  • 每个节点都含有REC和TEC
  • 当接收错误产生时,REC增加;
  • 正确接收到数据帧,REC减少
  • 当发送错误产生时,TEC增加;
  • 正确发送一帧数据帧,TEC减少;
  • REC、TEC的数值会引发节点状态改变

6. 节点的三种状态

  • Error Active

正常的进行总线通信错误产生时,发送主动错误帧

  • Error Passive

能够进行总线通信错误产生时,发送被动错误帧

  • Bus Off

不能收发任何报文

特例:如果总线上只有一 个节点,该节点发送数据帧后得不到应答,TEC最大只能计到128,即节点只会进入被动错误状态而不会进入总线关闭状态

错误通知

总线通信错误以向总线上发送错误帧作为标志。

  • 检测错误->发送错误帧->通知报文错误
  • 错误帧的发送

位错误、填充错误、格式错误或ACK错误产生后>当前发送的下一-位发送错误帧
CRC错误->紧随ACK界定符后的位发送错误帧

  • 错误帧发送后->总线空闲时自动重发出错的数据帧!

错误帧的格式(包括错误标志与错误界定符)

  • 错误标志

主动错误标志: 6个连续显性位;

被动错误标志: 6个连续隐性位;

  • 错误界定符

8个连续隐性位

错误标志的叠加

  • 主动错误
  • 错误标志: 6个连续显性位

破坏填充规则,诱发其它节点发送错误标志;
破坏固定位场(CRC界定符、ACK界定符及EOF)的固定格式,诱发其它节点发送错误标志;

  • 0~6个错误标志叠加
  • 错误标志发送后,每个站都送出隐性位,并监视总线,直到检测到隐性位,此后开始发送剩余的7个隐性位。

  • 被动错误
  • 错误标志: 6个连续隐性位
  • 由发送节点发送的被动错误标志,会诱发接收节点发送错误标志,特例:

仲裁期间发送,如果有其它节点发送报文
ACK位发送

  • 由接收节点引起的被动错误标志不会诱发总线上的任何活动
  • 被动错误节点必须检测到总线上6个连续相同的极性位后,才认为错误标志被送出

错误帧的发送

  • 位错误

  • 格式错误

  • CRC错误

错误恢复

错误状态的转换关系

错误计数值得变动条件

Bus Off 问题现象分析

(暂略)

2.4 超载帧

(暂略)

2.5 帧间隔

(暂略)

三、位时序

在讲位时序之前,先介绍几个基本概念。

Time Quantum 时间份额tQ :CAN控制器工作的最小时间单位,通常对系统时钟分频得到。

波特率:单位时间内(1s)传输的数据位,公式:1/位时间。举个例子,系统时钟频率36MHz,预分频因子为4,则CAN时钟频率9MHz,则Tq=1/9M。假设一个CAN位包含10个Tq,则一个位周期T=10Tq,从而波特率为1/T=0.9MHz.

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

同步段(SS,Synchronization Segment)

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

传播段(PTS,Propagation Time Segment)

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

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

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

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

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

四、同步

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

CAN同步分为硬同步和重新同步。

硬同步

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

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

同步前

同步后

重新同步

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

第一种, 节点从总线的边沿跳变中,检测到它的时序比总线的时序相对滞后2个Tq,这是控制器在下一个时序中的PBS1段增加2Tq的时间长度,使得节点与总线时序重新同步。

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

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

同步规则:

  • 一个位时间内只允许一种同步方式
  • 任何一个“隐性”到“显性”的跳变都可用于同步
  • 硬同步发生在SOF阶段,所有接收节点调整各自当前位的同步段,使其位于发送的SOF位内。
  • 重新同步发生在一个帧的其他阶段,即当跳变沿落在同步段之外。
  • 12
    点赞
  • 84
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值