CAN基础内容详解

概念

CAN(Controller Area Network)总线就是网络系统的控制器区域,想象汽车像身体一样,那么CAN就相当于人体的神经系统,协助人体进行各部分的沟通。以此类推,节点或者车内电子控制单元,都是由CAN总线连接起来的。在汽车系统中,在电控单元数量繁多的配置下,CAN标准就是一个便利工具,通过它,电控单元之间可以相互通信,不需要复杂多样的接线来实现,所有的外围器件都可以挂接在该总线上。设置CAN最初的目的就是减少线束的数量,允许任一电控单元与整个系统通信,同时不会使车载电脑负载。CAN总线是一种有效支持分布式控制或实时控制的串行通信网络。

本文说的CAN即是一种总线,也是一种协议。所以说,我们常听见CAN总线,也常听见CAN协议。

1.CAN特点

CAN总线是一种串行数据通信协议,其通信接口中集成了CAN协议的物理层和数据链路层功能,可完成对通信数据的成帧处理,包括位填充、数据块编码、循环冗余检验、优先级判别等项工作。
(1)可以多主方式工作,网络上任意一个节点均可以在任意时刻主动地向网络上的其他节点发送信息,而不分主从,通信方式灵活。
(2)网络上的节点(信息)可分成不同的优先级,可以满足不同的实时要求。ID值越小,优先权越高。CAN通信基于标识符进行优先排列就能够让最高优先级标识符的通讯免于中断;
(3)非破坏性位仲裁总线结构机制,当两个节点同时向网络上传送信息时,优先级低的节点主动停止数据发送,而优先级高的节点可不受影响地继续传输数据。
(4)可以点对点、一点对多点(成组)及全局广播等几种传送方式接收数据。
(5)数据传输距离远,最远长达10Km、数据传输速率高,最高高达1Mbps;一个由CAN 总线构成的单一网络中,理论上可以挂接无数个节点。实际应用中,节点数目受网络硬件的电气特性所限制。一般作为CAN收发器时,同一网络中允许挂接110个节点。CAN 可提供高达1Mbit/s的数据传输速率,这使实时控制变得非常容易。另外,硬件的错误检定特性也增强了CAN的抗电磁干扰能力。当信号传输距离达到10K时,CAN 仍可提供高达50Kbit/s的数据传输速率。
(6)具有错误检测、错误通知和错误恢复功能。所有单元都可以检测错误(错误检测功能),检测出错误的单元会立即同时通知其他所有单元(错误通知功能),正在发送消息的单元一旦检测出错误,会强制结束当前的发送。强制结束发送的单元会不断反复地重新发送此消息直到成功发送为止(错误恢复功能)。
(7)节点数实际可达110个。
(8)采用短帧结构,每一帧的有效字节数为8个。
(9)每帧信息都有CRC校验及其他检错措施,数据出错率极低。
(10)通信介质可采用双绞线,同轴电缆和光导纤维,一般采用廉价的双绞线即可,无特殊要求。
(11) 数据在整个系统范围内具有一致性。
(12)仲裁失败或传输期间被故障损坏的帧能自动重发。
(13)节点在错误严重的情况下,具有自动关闭总线的功能,切断它与总线的联系,以使总线上的其他操作不受影响,脱离总线的节点不影响总线的正常工作。但是CAN总线如果传输的信息过多,就会造成数据堆积,发生过载现象。


由于CAN总线上述的这些特点,它凭借着可靠、实时、经济和灵活的优势在其他行业也得到了广泛的应用,从汽车电子到工业控制慢慢普及,目前已成为全球范围内最重要的现场总线之一。

2.OSI模型与CAN的关系

国际标准化组织(ISO)对通信系统进行了更详细的划分:

下图为OSI模型与CAN的关系:

CAN-bus的规范定义了ISO规范中的物理层和数据链路层;一些国际组织定义了应用层,例如CiA组织的CANopen、ODVA组织的DeviceNet等;也有一些用户根据需求自行设计应用层。ISO/OSI模型与CAN-bus的对应关系详见下图:

设备之间所谓的通信,其实是相同层次间的信息沟通,例如物理层与物理层的信息交换,应用层与应用层的信息交换,层与层之间是互相独立的。正是基于这种层次化的结构,才使得大家能各司其职,高效而又相互独立的工作。

3.物理层

物理层主要完成设备间的信号传送,把各种信号转换成物理信号,并将这些信号传输到其他目标设备。在这一层中,CAN-bus对信号电平、通信时使用的电缆及连接器等进行了详细规定。

CAN-bus由ISO标准化后发布了两个标准,分别是ISO11898(125kpbs~1Mbps的高速通信标准)和ISO11519(小于125kpbs的低速通信标准)。这两个标准仅在物理层不同,在数据链路层是相同的。

3.1 CAN收发器与信号电平

位于CAN-bus物理层的器件要完成逻辑信号与电缆上物理信号的转换,该器件称为收发器。

如下图所示为CAN收发器的引脚图。

1、发送时将逻辑信号转换成物理信号,此收发器转换得到的信号为差分电平信号。

2、接收时将物理信号转换成逻辑信号,此收发器将差分电平信号转换为逻辑信号。

CAN-bus使用两根电缆进行信号传输,分别为CAN_High和CAN-Low(简称CAN_H和CAN_L)。CAN收发器根据两根电缆之间的电压差来判断总线电平,这种传输方式称为“差分传输”。电缆上的电平信号只有两种可能,分别为显性电平(代表逻辑0)和隐形电平(代表逻辑1)。如下图所示是ISO11898和ISO11519信号电平的对比

信号使用双绞线进行传输,是因为双绞线上传输差分信号可以抑制共模干扰,能够提高通讯的稳定性、可靠性和抗干扰的能力。

线与原理

如下左图为CAN收发器的引脚图,其中CAN_H引脚在芯片里面等效电路为如下右图所示

CAN收发器开路集电极和总线相连通过切换开关状态输出高低电平。

状态1:截止状态,晶体管截止(开关未接合)
无源:总线电平=1,电阻高
状态0:接通状态,晶体管导通(开关已接合)
有源:总线电平=0,电阻低

因为所有的收发器的输出开关都是并联的,所以在总线上显性电平具有优先权,只要有一个单元输出显性电平(低电平),总线上即为显性电平(低电平)。而隐形电平(高电平)则具有包容的意味,只有所有的单元都输出隐性电平(高电平),总线上才为隐性电平(显性电平比隐性电平更强)。
CAN控制器在发送的同时,会监听总线的当前电平是否与自己发送的电平一致,如果不一致则会进行相应的处理。如果不一致发生在仲裁域,就会迫使输出隐形电平的节点退出发送;如果发生在其他区域,则会出现触发错误。

同步与填充位
通信方式分为两种,同步串行通信与异步串行通信。CAN-bus属于异步串行通信的方式。

异步串行通信的优点是减少了一根时钟线,缺点是各接收器的时钟不可能完全一致,总是会有偏差,有些偏快,有些偏慢,这些误差会累积直到通信出错。

如下图所示为标准波特率时采集的数据。

如下两幅图分别为波特率偏大20%和波特率偏小20%时采样的数据。

由上述几幅图可以看出,由于各接收器的时钟可能会存在偏差,这就导致传输一两个位时,误差可能看不出来,但是传输的位数变多了之后,这些误差会累积直到通信出错。

那么如何解决这个问题呢?
同步!
同步串行通信和异步串行通信的波形图如下图所示。
同步就像给钟表校时一样,隔一段时间所有节点的时钟就同步一次。这样尽管大家的时钟仍有误差,但是可以消除累积误差。
CAN-bus规定信号的跳变沿时刻进行同步,因此只要信号发生变化,节点时钟就会被同步。如下图所示,累积的误差可以限制在两个跳变沿之间,减少错误的发生。

然而这种同步方式又会带来新的问题,比如说发送多个相同位时,并无跳变沿可用于同步,这样就会导致误差不断累积,最后导致通信出错。

那么CAN-bus如何消除这种累积误差?
CAN-bus通过位填充提供同步信号,从而消除累积误差。CAN-bus规定,如果传输的信号连续5个位时相同的,就要插入一个电平相反的位,这个额外插入的位称为“填充位”。

接下来先让我们了解一下位时间这个概念。
一个标称的位时间=1/波特率

同步段用于同步各节点,正常情况下跳变沿落在此段内。
传播段用于补偿网络内的传输延时。
相位缓冲段用来补偿跳变沿的相位误差,可以被再同步处理延长或缩短。
采样点时刻读取的电平代表这个位的电平,一般位于相位缓冲段1的结尾
信息处理时间是从采样点开始留出的一段用于计算后续位电平的时间。

只有采样点设置正确了,我们才能进行正确的采样,获得正确的数据。
不同的波特率下,1位时间的时间份额不相同,采样点也不相同,如下图为不同波特率下的采样点设置。

不同波特率下的时间份额设置可参考下表。

4.传输速率与距离

CAN——Control Area Network 的缩写,小范围实时通信网络,通信距离与速率成反比。如下图所示,横轴为通信距离,竖轴为通信速率,距离越远,速率越低。

注:当通信距离太长时可以使用CAN 网关或网桥等设备划分子网,使子网通信速率与距离在规定范围内。

下表是关于通信速率、总线长度与支线长度的关系,表中数值为CiA组织的建议值。这些推荐值能够保证通信的稳定性和可靠性。

5.终端电阻与连接器

根据电磁场和微波理论,高频电路中负载阻抗需与传输线的特性阻抗一致,否则电信号在线束终端遭遇阻抗突变,发生反射现象,造成波形震荡。反射信号叠加到原信号上,会改变原波形的形状。极有可能出现总线错误:将显性读成隐性,或隐性读成显性。

我们都知道光从空气进入水中的时候光的线路会发生变化,那是因为光从一种介质进入另一种介质时,光会发生反射,从而改变了原来的光路。同理,由于电信号在阻抗不连续、阻抗不匹配的线路中传播会导致信号的反射,就会产生信号串扰、消息丢失、总线紊乱这一系列的问题。

那么信号反射这个问题该如何解决呢?

终端电阻可以用于减少通信线路上的反射,避免引起电平变化而导致数据的传输错误。

高速CAN与低速CAN终端电阻接法不同。高速CAN终端电阻接在线缆终端,可以保证特性阻抗连续;低速CAN分别接在两条线上。

CAN总线的终端电阻仅限于下表中规定的范围( ISO11898-2 )。

注:在汽车电子领域,一般都是用120欧姆的终端电阻。但是在工业自动化等其它应用领域,如果通信距离过长,为了保证CAN电平的最小幅值,需要匹配更大的终端电阻。

选作CAN总线的电缆必须达到下面给出的规格( ISO11898-2 ),这些规格主要用于标准化电气特性,并不涉及机械或材料方面的参数。

用于将ECU连入CAN总线的连接器必须符合下表中所规定(ISO11898-2)的要求,本规范的这个部分旨在标准化那些最重要的电气参数,并不涉及机械或材料方面的参数。

6.CAN总线拓扑结构

下图是高速CAN总线的拓扑结构,总线长度、支线长度和节点距离可以参考下图和表格。

下图是低速CAN总线的拓扑结构。

7.CAN分类

先理解CAN的物理层和数据链路层
物理层是指微控制器与 CAN 总线连接的驱动电路。物理层的三个子层:信令子层功能通常由集成 CAN 控制器的高级微控制器实现;介质附件子层功能由各芯片制造商提供的 CAN 收发器实现;介质从属接口子层规定了 CAN 总线相应连接器和电缆的特性。

数据链路层属于 CAN 的核心部分,它又可以进一步划分成两个子层:一个子层负责报文过滤、过载管理和管理恢复等功能;另一个子层负责数据的打包和解包、物理地址编码寻址、媒介访问管理、数据错误管理等功能。

常用的CAN总线分为:单线CAN、低速容错CAN、高速CAN。

高速CAN
根据线缆的长度提供从40Kbit/s到1Mbit/s的波特率。这是物理层最流行的标准,这是因为它允许设备间简单的线缆连接。DeviceNet以及CANopen规范就是使用了这种物理标准。高速CAN网络在每个网络端点端接一个120欧姆的电阻。

低速/容错CAN
提供从40 Kbit/s到125 Kbits/s的波特率。该标准允许在CAN总线连线失败时CAN总线通信得以继续进行。在低速/容错CAN网络,每种设备都有它自己的终端。

注意: 由于终端的类型不同,因此高速和低速/容错CAN设备不能在同一个网络中使用

在讨论它们的区别之前先明确以下几点:
1、讨论它们是A类、B类还是C类总线并没有多大意义,因为高速CAN同样可以使用低速CAN的波特率(单线CAN的波特率一般为33.3KHz),而且在实际应用中也不会有问题。但低速CAN使用高速CAN的波特率就会出现问题,这个问题不是纯粹由波特率引起的,而是由收发器引起的,因为在电平转换效率方面,低速CAN的收发器明显比高速CAN的收发器低。

2、它们的位传输时序、位仲裁、错误、校验、帧结构等等(即所谓的数据链路层)是没有区别的。至于数据链路层以上的诸如传送层、网络层、会话层、应用层等的协议,都是人为规定的,也不足以成为它们的区别。

3、这三种总线的区别主要在物理层面上。而以传输介质和线的数量来论——单线CAN只有一条导线,低速容错CAN和高速CAN通过双绞线传输——这点显而易见,不足为奇。

4、因此这三种总线的主要区别在于电平逻辑
这个区别可以从以下几种情况来说明:空闲时、有效时、睡眠时、唤醒时。这里假设收发器的电源为标准的5V和12V。

空闲时(即通常说的隐性位)

有效时(即通常说的显性位)

睡眠时

唤醒时

CAN总线的这些物理特性直接反映在收发器上。无论是哪种CAN总线,经过收发器后与微控制器的接口(TXD和RXD引脚)都是一样的,这时的电平逻辑也会变得一致。现在有很多单片机内部集成了CAN模块,还有各种收发器可以方便的转换,CAN总线的应用更多地变成了上层协议的事情,已经越来越少人真正关注总线底层的问题,也很少人愿意从事总线方面的基础性的研究了。

CAN FD

CAN FD 标准将CAN报文的数据段可提升到更高的位速度,其中可提升通信速率的数据段包含两个控制位、数据长度位,数据位以及CRC校验位。CAN FD报文通信时,在仲裁段和紧接着的数据控制段都是使用标准的通信波特率,当来到数据段时,CAN FD总线的通信波特率就会切换到更高的通信波特率。此时在CAN总线上只有一个CAN节点传输,其他节点进入监听模式。当这个数据段传送完毕后,通信波特率又重新切换到标准模式下。CAN FD通信时经常会使用到两种通信波特率,因此对新标准”FD”赋予的解释为:灵活的数据速率(“Flexible Data rate”)

另一方面CAN FD还有一个新的功能就是减少控制位的开销。对比目前CAN2.0标准最大8个字节的数据,CAN FD数据位最大的字节数提高至64位,CAN FD具有更高的有效传输负载。例如,CAN FD总线以2Mbit/s的速率、64位数据与CAN 250Kbit/s、8位数据传输对比,很明显在相同时间下,CAN FD的有效传输负载是CAN传输负载的8倍。CAN FD标准向下兼容CAN2.0A/B标准,CAN FD节点可以与现存的CAN2.0协议的节点进行通信,当然在这种情况下不能够使用CAN FD帧。这种兼容性为了CAN2.0设备能够平滑地过渡到CAN FD功能的硬件上。

8.数据链路层

CAN总线的报文帧共分为数据帧、远程帧、错误帧、过载帧和帧间隔5种类型

数据帧:用于发送节点向接收节点传送数据,是使用最多的帧类型。

远程帧:用于接收节点向某个发送节点请求数据。

错误帧:用于当某节点检测出错误时向其他节点通知错误的帧。

过载帧:用于接收节点向发送节点通知自身接收能力的帧。

帧间隔:用于将数据帧或远程帧与前面的帧分离的帧。

8.1 数据帧
数据帧是使用最多的帧,它由7个不同的位场组成:帧起始、仲裁场、控制场、CRC场、应答场、帧结尾。其中根据仲裁段ID码长度的不同,分为标准帧和扩展帧。数据场的长度可以为0。

1、帧起始和帧结束
帧起始和帧结束用于界定一个数据帧,无论是标准数据帧还是扩展数据帧都包含这两个段。

帧起始标志着数据帧和远程帧的起始,由一个单独的显性位组成。总线空闲时,发送节点发送帧起始,其他接收节点同步于该帧起始位。

帧结束由7个连续的隐形位组成。

2、仲裁段
如果多个节点同时发送数据时该怎么办呢?CAN-bus是如何解决总线竞争的问题呢?

该问题由仲裁段给出答案。

CAN-bus并没有规定节点的优先级,但通过仲裁段帧ID规定了数据帧的优先级。根据CAN2.0标准版本的不同,帧ID分为11位和29位两种。

3、总线仲裁
CAN控制器在发送数据的同时监测数据线的电平是否与发送数据对应电平相同,如果不同,则停止发送并做其他处理。

1)假设节点A、B和C都发送相同格式相同类型的帧,如标准格式数据帧,它们竞争总线的过程是:

从该分析过程得出结论是:帧ID值越小,优先级越高;

2)对于同为扩展格式数据帧、标准格式远程帧和扩展格式远程帧的情况同理。

3)由于数据帧的RTR位为显性电平,远程帧的RTR位为隐性电平,所以帧格式和帧ID都相同情况下,数据帧的优先级比远程帧优先级高:

节点B仲裁失败退出发送,进入只听模式;

节点A获得总线,继续发送剩余数据。

4)由于标准帧的IDE位为显性电平,扩展帧的IDE位为隐性电平,对于前11位ID相同的标准帧和扩展帧,标准帧优先级比扩展帧高。

当发送IDE位时,由于线与的原理,总线上出现显性电平:

节点B仲裁失败,进入只听模式。

节点A获得总线,继续发送剩余数据

4、控制段

控制段共6位,标准帧的控制段由扩展帧标志位IDE、保留位r0和数据长度代码DLC组成;扩展帧控制段则由IDE、r1、r0和DLC组成。

5、数据段

一个数据帧传输的数据量为0~8个字节,这种短帧结构使得CAN-bus实时性很高,非常适合汽车和工控应用场合。

6、CRC段

CAN-bus使用CRC校验进行数据检错,CRC校验值存放于CRC段。CRC校验段由15位CRC值和1位CRC界定符构成。

7、ACK段

当一个接收节点接收的帧起始到CRC段之间的内容没发生错误时,它将在ACK段发送一个显性电平。

8.2 远程帧

一个节点可以向另一个指定的节点发送远程帧,以要求获取数据。

与数据帧相比,远程帧结构上无数据段,由6个段组成,同理分为标准格式和扩展格式,且RTR位为1(隐性电平)。

数据帧与远程帧的区别如下:

8.3 错误帧

尽管CAN-bus是可靠性很高的总线,但依然可能出现错误;CAN-bus的错误类型共有5种。

CAN-bus错误类型:

1、CRC错误

发送节点计算得到的CRC值与接收到的CRC值不同时发生错误

2、应答错误

发送节点在ACK阶段没有接收到应答信号时发生该错误

3、位发送错误

发送节点在发送时发现总线电平与发送电平不相同时发生该错误

4、位填充错误

通信线缆上传输信号违反“位填充”规则时发生该错误

5、格式错误

传输的数据帧格式与任何一种合法的帧格式不符时发生该错误

当出现5种错误类型之一时,发送或接收节点将发送错误帧。错误帧的结构如下,其中错误标识分为主动错误标识和被动错误标识。

主动错误标识由6个显性位组成,这违反了“位填充”规则。可以理解为当一个节点发现通信错误时,它将会主动将帧彻底破坏掉,让其他节点都知道它接收出错了。

为防止自身由于某些原因导致无法正常接收的节点一直发送错误帧,干扰其他节点通信,CAN-bus规定了节点的3种状态及其行为。

【REC表示接收错误计数器,TEC表示发送错误计数器,复位时两者都被清0。】

主动错误:设备正常参与总线通信,检测到错误时发送主动错误标识。

被动错误:设备正常参与总线通信,检测到错误时发送被动错误标识。

总线关闭:数据帧的收发都被禁止。

8.4 过载帧
当某个接收节点没有做好接收下一帧数据的准备时,将发送过载帧以通知发送节点;过载帧由过载标志和过载帧界定符组成。

过载帧结构:

由于存在多个节点同时过载且过载帧发送有时间差问题,可能出现过载标志叠加后超过6个位的现象。

8.5 帧间隔

帧间隔用于将数据帧或远程帧和他们之前的帧分离开,但过载帧和错误帧前面不会插入帧间隔。

1、帧间隔过后,如果无节点发送帧,则总线进入空闲。

2、帧间隔过后,如果被动错误节点要发送帧,则先发送8个隐性电平的传输延迟,再发送帧。

保证主动错误节点优先发送,避免被动错误节点因硬件故障干扰整个网络。

8.6 总结

CAN-bus整个链路层处理数据的流程是:

在收发报文的过程中,收发错误计数器会根据错误类型和节点状态自动增减计数,如下:

1、复位时将错误计数器初始化为0

2、检测到一次失败的传输,接收错误计数器REC加1

3、REC加8

4、成功收到一帧报文,REC减1

5、在发送时检测到错误,发送错误计数器TEC加8

6、成功发送一帧报文,TEC减1

7、如果TEC小于127,TEC加8

8、如果TEC大于255,从CAN-bus断开连接。