首发于模拟电路
一文读懂CAN系统架构和帧结构

一文读懂CAN系统架构和帧结构

简介

上世纪八十年代以来,汽车ECU越来越多,如ABS,电控门窗,电子燃油喷射装置。如果仍然采用常规的点对点布线方式,即电线一段与开关相接,另一端与用电设备相通,将会导致车上电线数目的急剧增加,从而带来线束的冗余及维修成本的提高。这就对汽车的线束分布及信息通讯提出了更高的要求。总线技术可以实现信息的实时共享,解决了传统布线方式中线束多,布线难,成本高等问题,CAN(Controller Area Network)总线技术应运而生。

点对点通信
总线通信

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


CAN总线的很多优点,使得它得到了广泛的应用,如传输速度最高到1Mbps, 通信距离最远到10km,无损位仲裁机制,多主结构。

发展历史

  • 1983年,BOSCH开始着手开发CAN总线;
  • 1986年,在SAE会议上,CAN总线正式发布;
  • 1987年,Intel和Philips推出第一款CAN控制器芯片;
  • 1991年,奔驰 500E 是世界上第一款基于CAN总线系统的量产车型;
  • 1991年,Bosch发布CAN 2.0标准,分 CAN 2.0A (11位标识符)和 CAN 2.0B (29位标识符);
  • 1993年,ISO发布CAN总线标准(ISO 11898),随后该标准主要有三部分:
    • ISO 11898-1:数据链路层协议
    • ISO 11898-2:高速CAN总线物理层协议
    • ISO 11898-3:低速CAN总线物理层协议
注意:ISO 11898-2和ISO 11898-3物理层协议不属于 BOSCH CAN 2.0标准。
  • 2012年,BOSCH发布 CAN FD 1.0 标准(CAN with Flexible Data-Rate),CAN FD定义了在仲裁后确使用不同的数据帧结构,从而达到最高 12Mbps 数据传输速率。CAN FD与CAN 2.0协议兼容,可以与传统的CAN 2.0设备共存于同样的网络

CAN主要由两个协议定义:ISO11898和ISO11519-2,具体区别、对比如下图:

CAN主要由两个协议定义:ISO11898和ISO11519-2,具体区别对比

CAN总线标准

CAN总线标准之规定了物理层数据链路层,至于应用层需要用户自定义。不同的CAN标准仅物理层不同。物理层和数据链路层:ISO11898;应用层:不同的应用领域使用不同的应用层标准。

物理层、数据链路层和应用层
物理层、数据链路层和应用层

标准化

CAN标准分为底层标准(物理层和数据链路层)和上层标准(应用层)两大类。CAN底层标准主要是 ISO 11898系列的国际标准,也就是说不同厂商在CAN总线的物理层和数据链路层定义基本相同;而上层标准,涉及到例如流控制、设备寻址和大数据块传输控制等,不同应用领域或制造商会有不同的做法,没有统一的国际标准。

底层标准

CAN底层标准涵盖OSI模型中的物理层和数据链路层,底层标准包括:

  • ISO 11898-1: 2015 定义CAN总线的数据链路层(DLL)和电气信号标准,描述CAN总线的基本架构,定义不同CAN总线设备在数据链路层通信方式,详细说明逻辑链接控制(LLC)和介质访问控制(MAC)子层部分;
  • ISO 11898-2: 2003 定义高速CAN总线(HS-CAN)物理层标准,最高数据传输速率 1Mbps ,应用为两线平衡式信号(CAN_H, CAN_L),HS CAN是汽车动力和工业控制网络中应用最为广泛的物理层协议;
  • ISO 11898-3: 2006 定义低速CAN总线(LS-CAN, Fault-Tolerant CAN)物理层标准,数据传输速率在 40Kbps ~ 125Kbps 。Fault-Tolerant是指总线上一根传输信号失效时,依靠另外的单根信号也可以通信,LS CAN主要应用于汽车车身电控单元之间通信;
  • ISO 11898-4: 2004 定义CAN总线中的时间触发机制(Time-Triggered CAN, TTCAN),定义与ISO 11898-1 配合的帧同步实体,实现汽车ECU之间基于时间触发的通信方式。注意,ISO 11898-1 是基于事件驱动(Event-Driven)的通信,它对于高负荷总线上,尤其是低优先级的消息会造成较大的延迟,而基于时间触发的ISO 11898-4 标准的初衷也正是为解决该问题,确保CAN总线上可靠的消息传输;
  • ISO 11898-5: 2007 对ISO 11898-2高速CAN总线的补充,并参照ISO 8802-2,定义在总线闲置时的节电特性;
  • ISO 11898-6: 2013 对ISO 11898-2 和 ISO 11898-5 的补充,并参照ISO 8802-2,定义使用可配置的帧实现选择性唤醒总线的机制;
  • ISO 16845-1: 2004 定义测试符合ISO 11898-1标准CAN应用的方法和条件;
  • ISO 16845-2: 2014 定义包括特定功能下可以选择性唤醒总线的CAN收发器的测试实例和测试要求,也称为CAN总线的一致性测试

CAN总线底层标准与ISO/OSI模型的对应关系,如图1所示。对于媒体专用接口(Medium Dependent Interface, MDI),没有统一的国际标准。CiA DS-102(CiA: CAN in Automation )仅定义使用专用连接器(DB9),并对PIN定义作出一定规范。

上层标准

虽然底层标准相同,不同应用领域和组织会制定不同的上层标准。有的厂商开发并推广其应用层标准,在某些领域得以广泛应用。对于汽车行业来说,几乎每家厂商都有自己的CAN上层标准。比较流行的有工业自动化领域 CiACANopenRockwellDeviceNet;嵌入式控制领域 KvaserCAN Kingdom;智能设备控制 HoneywellSDS;汽车诊断 ISO 14229定义的 UDS,和中重型汽车CAN总线标准 SAE J1939。如表1示。

表1. CAN上层标准规格

同时,面向汽车的通信协议以通信速度为准进行了分类:

OSI基本参照模型

OSI参考模型为7层,物理层、数据链路层、网络层、传输层、会话层、表示层和应用层,而CAN通信底层仅使用了物理层和数据链路层

CAN通信底层仅使用了物理层和数据链路层

CAN物理层

网络拓扑

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

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

高速CAN总线最高信号传输速率为1Mbps,支持最长距离40m。ISO11898-2要求在高速CAN总线两段安装端接电阻RL(端接电阻一般为120Ω,因为电缆的特性阻抗为120 Ω,为了模拟无限远的传输线。)以消除反射。低速CAN最高速度只有125Kbps,所以ISO11898-3没有端接要求。

端接电阻接法

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

Bus Length(m)Signaling Rate(Mbps)
401
1000.5
2000.25
5000.1
10000.05

收发器

CAN收发器包括 CANH 和 CANL 两根信号,CANH和CANL信号采用差分电平,这样可以取得更好的电磁兼容效果。CAN总线物理传输媒介只需要两根线。

前面的标准部分有介绍,CAN总线分高速CAN和低速CAN,收发器因之也分为高速CAN收发器(1Mbps)和低速CAN收发器(125Kbps)。低速CAN也叫 Fault Tolerant CAN ,指的是即使总线上一根线失效,总线依然可以通信。图4示例高速CAN收发器的基本电路结构。当两个晶体管都关断时,CANH和CANL上电压相同,且都为 0.5VCC ;而当两个晶体管都打开时,CANH 和 CANL 上即存在一定的压差,且压差与负载电阻值相关。ISO 11898-2 要求此时 CANH 和 CANL 压差在 2V*左右。

CAN收发器的特性包括非常低的电磁辐射和很强的抗击共模噪声的能力。另外,CAN收发器可以提供高达 8KV*的ESD保护,在电路设计中可以在收发器附近增加共模电感以进一步降低电磁辐射(图5)。

图4. CAN总线收发器(MCP2551)


图5. 共模电感降低辐射

信号电平

高速CAN和低速CAN总线在物理层信号电平上定义有所不同。图6和图7表示高速和低速CAN总线上信号电平与总线逻辑的对应关系。

高速CAN,定义 CANH 和 CANL 电压相同(CANH = CANL = 2.5V)时为逻辑“1”,CANH和CANL 电压相差 2V(CANH = 3.5V, CANL = 1.5V) 时为逻辑“0”。高速CAN收发器在共模电压范围内(-12V ~ 12V),将CANH和CANL电压相差大于 0.9V 解释为显性状态(Dominant),而将CANH和CANL电压相差小于 0.5V解释为为隐性状态(Recessive)。收发器内部有迟滞电路可以降低干扰。

低速CAN,定义CANH和CANL电压相差 5V (CANH = 0V, CANL = 5V)时为逻辑“1”,相差 2.2V (CANH = 3.6V, CANL = 1.4V)时为逻辑“0”。

在CAN总线上,逻辑“0”和“1”之间显著的电压差是总线可靠通信的保证。参照上面的描述,CAN总线上两种电平状态分别为:

  • 显性(Dominant ): 0
  • 隐性(Recessive ): 1

CAN总线的信号电平具有线与特性,即显性电平(0)总是会掩盖隐性电平(1)。如果不同节点同时发送显性和隐性电平,总线上表现出显性电平(0),只有在总线上所有节点发送的都是隐性电平(1)时,总线才表现为隐性。线与特性是CAN总线仲裁的电路基础。详细仲裁过程见下文“仲裁机制”部分。

图6. 高速CAN信号电平( ISO 11898-2)
图7. 低速CAN信号电平( ISO 11898-3)

连接器

在前文有提到,业界只规定了9 Pin D-Sub 类型的CAN总线连接器,其信号定义如图8所示。


图8. CAN 9 Pin D-Sub引脚定义

三种CAN标准物理层比较

除了上文介绍的高速CAN和低速CAN外,还有标准定义另外一种CAN物理层结构,即 Single Wire CAN。单线CAN可以减少一根传输线,但是要求节点间有良好的共地特性(相当于第二根信号线)。单线CAN的信号抗干扰能力相对较弱,在设计中需要提高信号幅度以增加信噪比,如此又会让它自身的辐射能力增加,因此必须降低其信号传输速率以达到电磁兼容的要求。综上,单线CAN仅适合应用在低速的车身电子单元、舒适及娱乐控制领域。低速CAN总线由于信号速度不高,在一根信号线失灵的情况下,仍可工作于单线模式。

三种CAN总线物理层的对比如表3列出。总线连接拓扑图如图9,对于端接,高速CAN端接是在总线两端,而低速CAN和单线CAN的端接都是在各节点位置。

表3. 三种CAN物理层标准比较


图9. 三种CAN总线物理层的比较

CAN数据链路层

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

通信原理

多主机(Multi-Master)

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

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

寻址机制

不同于其它类型的总线,CAN总线不设定节点的地址,而是通过消息的标识符(Identifier)来区别消息。CAN总线消息是广播式的,也就是说在同一时刻所有节点都检测到同样的电平信号。

接受节点通过识别消息中的标识符,与该节点预设的过滤规则对比,如果满足规则就接收这条消息,发送应答,否则就忽略这条消息,关于这部分介绍见下文“条件接收”部分。

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

总线访问CSMA/CD+AMP

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

  • 多路载波侦听:网络上所有节点以多点接入的方式连接在同一根总线上,且发送数据是广播式的。网络上各个节点在发送数据前都要检测总线上是否有数据传输:若网络上有数据,暂时不发送数据,等待网络空闲时再发;若网络上无数据,立即发送已经准备好的数据。
  • 冲突检测:节点在发送数据时,要不停的检测发送的数据,确定是否与其他节点数据发送冲突,如果有冲突,则保证优先级高的报文先发送。
  • 非破坏性仲裁机制:通过ID仲裁,ID数值越小,报文优先级越高。
多路载波侦听+基于消息优先级的冲突检测和仲裁机制(CSMA/CD+AMP)

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

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

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

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

报文接收过滤

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


前面有提到消息在CAN总线上是广播式的,但并不是所有节点都会对总线上所有消息感兴趣。节点通过控制器中过滤码(Filter Code)和掩码(Mask Code),再检验总线上消息的标识符,来判断是否接收该消息(Message Filtering)。

对于掩码,“1”表示该位与本节点相关,“0”表示该位与本节点不相关。举例如下:

例1:仅接收消息标识符为00001567(十六进制)的帧

  • 设置过滤码为00001567
  • 设置掩码为1FFFFFFF

节点检测消息的标识符的所有位(29位),如果标识符为00001567接收,否则舍弃。

例2:接收消息标识符为00001567 到 0000156F 的帧

  • 设置过滤码为00001560
  • 设置掩码为1FFFFFF0

节点检测消息的标识符的高25位,最低的4位则不care。如果标识符最高25位相同则接收,否则舍弃。

例3:接收消息标识符为00001560 到 00001567 的帧

  • 设置过滤码为00001560
  • 设置掩码为1FFFFFF8

节点检测消息的标识符的高26位,最低的3位则不care。如果标识符最高26位相同则接收,否则舍弃。

例4:接收所有消息帧帧

  • 设置过滤码为0
  • 设置掩码为0

节点接收总线上所有消息。

应答机制

应答位(ACK)用来表示节点已经收到有效的帧。任何节点如果准确无误地接收到帧,则要向总线上发送显性位,该显性位将掩盖发送节点输出的隐性位,使总线上表现为显性。如果发送节点检测应答位为隐性,那么说明没有节点收到有效帧。接收节点可能在应答位输出隐性表示它没有收到有效帧,但另外有收到有效帧的节点也可能输出显性表示它收到有效帧,这样总线上总体上表现为显性,发送节点也无从得知是否总线上所有节点都收到有效的帧。

位填充

CAN总线使用到的是非归零编码(NRZ),NRZ编码的优点是效率高,但却不易区分哪里是bit开始,哪里是bit结束。因此为确保在同步通信过程中有足够的电平跳变,规范中应用到位填充机制,即在每连续5个相同电平后插入 1个反相电平,接收节点在收到消息后自动将填充位删除。在帧内除了CRC界定符、ACK域和EOF外,其余部分均应用到位填充机制。在应用到位填充的域,检测到连续 6个显性位或隐性位均视为报错。检测到错误后,节点将发出主动错误标志。注意如前文述,主动错误标志为连续6个显性位,它是不符合位填充规则的,因此检测到该电平的所有节点都会报错。

位填充意味着实际传输的数据帧长度可能更长,图14示例位填充前后的数据帧的变化,紫色位是位填充增加的位,接收节点收到消息后会自动删除这些位。

图14. 数据帧在位填充前后的比较

错误检验

完善的错误校验机制是CAN总线高可靠性的有效保证。CAN总线包括 5种错误校验机制,其中 3种在消息层面(Message Level),2种在比特层面(Bit Level) 。如果消息出现五种错误中的任何一种,接收节点将不接收消息,并且产生错误帧通知发送节点重新发送消息,直到接收节点正确地收到消息。如果失效的节点持续不断地报错,导致总线挂死,那么在报错次数达到设定的上限时,它将被控制器从总线上移除(详见“故障限制”部分)。

消息层面的错误校验机制体现在数据帧(图10)中的 CRC校验域和 ACK域。CRC校验域包括传输数据的 15 bit Checksum值和 1 bit 界定符。ACK域包括 1 bit ACK位和 1 bit 界定符。消息层面的校验还包括格式错误校验,格式错误校验会检查消息帧中必须为隐性的位,如果这些位表现为显性,那么节点将报格式错误。格式错误检查的隐性位包括SOF、EOF、ACK界定符和CRC界定符。

在比特层面,发送节点在发送消息的同时会检测总线电平,如果检测到总线的状态和它发送的状态不符,则发送节点将报错。该过程的两处例外是消息帧处于标识符仲裁阶段和消息应答阶段。

最后一种错误校验机制源于CAN总线的位填充机制。除了错误标志和EOF,如果节点检测到连续 6个相同电平,它即报填充错误。主动错误标志包括连续6个显性位,总线上所有检测到主动错误标志的节点都会报错,而产生各自的错误帧,这意味着总线上的错误帧可能由原先的 6 bit到反馈叠加至 12 bit不等。错误帧后面紧接着8个隐性位界定符(如图10)。在总线空闲时,消息通过竞争仲裁获得总线占用权后将重新传送。

综上,CAN总线的错误类型包括以下五种:

  • CRC错误(CRC Error)

在发送消息时,发送节点会根据特定的多项式计算出由数据帧SOF位到数据域最末位的Checksum值,并将该值放在数据帧的CRC域,随着数据帧广播到总线上。接收节点在收到数据后,应用同样的多项式计算Checksum值,并与收到的Checksum值对比。如果两者一致,正常接收;如果不一致,则舍弃该消息,并发送错误帧请求发送节点重传消息。CRC校验过程如图15所示。

CAN 2.0 规范定义CRC校验应用的多项式为:

g_{CAN}(x)=x^{15}+x^{14}+x^{10}+x^{8}+x^{7}+x^{4}+x^{3}+1=1100 0101 1001 1001 \tag{1}

图15. CRC校验机制
  • 应答错误(ACK Error)

发送单元在ACK位中检测到隐性电平时所检测到的错误(ACK没被传送过来时所检测到的错误)。

  • 格式错误(Form Error)

检测出与固定格式的位段相反的格式时所检测到的错误。

  • 位错误(Bit Error)

比较输出电平和总线电平(不含填充位),当两电平不一样时所检测到的错误。

  • 填充错误(Stuff Error)

在需要位填充的段内,连续检测到 6位相同的电平时所检测到的错误。

故障限制

CAN总线上的每个节点控制器都会检测消息是否出错,如果节点发现消息出错,它将发送错误标志,从而打断总线上正常的数据传输。总线上其它没有发现原始消息错误的节点,在收到错误标志后将采取必要的措施,比如舍弃当前总线上的消息。CAN节点内部有两种错误状态计数器 TECREC。节点通过特定的规则管理这两个计数器的值,其中:

  • TEC /Transmit Error Counter,发送错误状态计数器,出现一次错误该计数器值 +8;
  • REC /Receive Error Counter,接收错误状态计数器,出现一次错误该计数器值 +1;
  • 消息成功发送或接收一次,对应的 TEC 或 REC 值相应 -1

TEC增加的速度快于 REC增加的速度,这是因为有很大概率地是发送节点,而不是接受节点出错!基于 TECREC数值的变化,CAN规范定义了节点的 3种基本错误状态:

  • Error Active:正常状态,在此状态下,节点可以发送所有类型的帧,包括错误帧;
  • Error Passive:节点可以发送除错误帧以外的所有帧;
  • Bus Off:节点被控制器从总线上隔离

节点的三种错误状态切换关系如图16所示。

图16. CAN总线节点错误状态切换图


波形举例

图17示例CAN通信过程信号波形。在1时刻,节点A向总线上发送消息;在2 时刻,节点B和C收到消息,发送响应应答;在3时刻,节点B和C同时向总线上发送消息,竞争仲裁后节点C获得总线占用权,在4时刻继续发送未传输完毕的数据;节点A和B在5 时刻响应C发送的消息;在总线空闲的6时刻,B发送消息到总线上;在7 时刻节点A和B响应节点B发送的消息;在8 时刻,节点A向空闲总线上发送消息。

图17. CAN通信过程举例

同步

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

位时序

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

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同步分为硬同步和重新同步。

同步规则:

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

硬同步

当总线上出现帧起始信号(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设置的太小则重新同步的调整速度慢,若太大,则影响传输速率。


CAN的数据帧(报文)种类及结构

数据帧(报文)的种类

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

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

CAN总线定义四种帧类型,分别为数据帧、远程帧、错误帧和过载帧。数据帧就是总线上传输用户数据的帧,其最高有效载荷是 8 Byte,除了有效载荷外,数据帧还包括必要的帧头帧位部分以执行CAN标准通信,比如消息标识符(Identifier)、数据长度代码、校验信息等。远程帧是用来向总线上其它节点请求数据的帧,它的帧结构与数据帧相似,只不过没有有效载荷部分;错误帧是表示通信出错的帧。数据帧和远程帧有标准格式和扩展格式两种格式。标准格式有 *11* 位的标识符 , 扩展格式有 *29* 位标识符。

各种帧的用途分别为:

  • 数据帧:用于发送单元向接收单元传送数据的帧;
  • 远程帧:用于接收单元向具有相同标识符的发送单元请求数据的帧;
  • 错误帧:用于当检测出错误时向其它单元通知错误的帧;
  • 过载帧:用于接收单元通知其尚未做好接收准备的帧


CAN-bus通信帧共分为数据帧、远程帧、错误帧、过载帧和帧间隔五种类型。

1.数据帧

结构上由7个段组成,其中根据仲裁段ID码长度的不同,分为标准帧(CAN2.0A)和扩展帧(CAN2.0B)。

标准帧(CAN2.0A)和扩展帧(CAN2.0B)
标准帧(CAN2.0A)和扩展帧(CAN2.0B

数据帧的帧结构如图10所示,图中示例标准数据帧(Standard)和扩展数据帧(Extended)两种格式。

图10. CAN标准格式和扩展格式的数据帧/远程帧格式

各字段定义及长度分别为:

  • SOF:表示数据帧开始;(1 bit)
  • Identifier:标准格式11 bit,扩展格式29 bit包括Base Identifier(11 bit)和Extended Identifier(18 bit),该区段标识数据帧的优先级,数值越小,优先级越高;
  • RTR:远程传输请求位,0时表示为数据帧,1表示为远程帧,也就是说RTR=1时,消息帧的Data Field为空;(1 bit)
  • IDE:标识符扩展位,0时表示为标准格式,1表示为扩展格式;(1 bit)
  • DLC:数据长度代码,08表示数据长度为08 Byte;(4 bit)
  • Data Field:数据域;(0~8 Byte)
  • CRC Sequence:校验域,校验算法G(x) = x15 + x14 + x10 + x8 + x7 + x4 + x3 + 1;(15 bit)
  • DEL:校验域和应答域的隐性界定符;(1 bit)
  • ACK:应答,确认数据是否正常接收,所谓正常接收是指不含填充错误、格式错误、 CRC 错误。发送节点将此位为1,接收节点正常接收数据后将此位置为0;(1 bit)
  • SRR:替代远程请求位,在扩展格式中占位用,必须为1;(1 bit)
  • EOF:连续7个隐性位(1)表示帧结束;(7 bit)
  • ITM:帧间空间,Intermission (ITM),又称Interframe Space (IFS),连续3个隐性位,但它不属于数据帧。帧间空间是用于将数据帧和远程帧与前面的帧分离开来的帧。数据帧和远程帧可通过插入帧间空间将本帧与前面的任何帧(数据帧、遥控帧、错误帧、过载帧)分开。过载帧和错误帧前不能插入帧间空间。

1.1.帧起始、帧结束

  • 帧起始(SOF)

标识一个数据帧的开始,固定一个显性位。

帧起始(SOF)

用于同步, 总线空闲期间的任何隐性到显性的跳变都将引起节点进行 硬同步。只有总线在空闲期间节点才能够发送SOF。

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

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

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


1.2.仲裁段仲裁段(Arbitration Field)


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

仲裁段除了报文ID外,还有RTR, IDE, SRR位。

仲裁段


显性隐性

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

显性隐性


1.2.1.仲裁段




  • 从该分析过程得出结论是:帧ID值越小,优先级越高
  • 对于同为扩展格式数据帧、标准格式远程帧和扩展格式远程帧的情况同理。


1.2.2.仲裁机制

如果多个节点同时往总线上发送消息,总线的使用权是通过消息帧标识符的逐位仲裁机制决定的,在仲裁过程中消息是不会丢失的。这里的不会丢失的意思是指仲裁完成后,获得总线控制权的消息内容没有被仲裁过程篡改,将继续在总线上发送没有传输完的消息。

在CAN总线上,标识符值越小,消息的优先级越高。标识符全零的消息,由于它将总线电平保持在显性的时间最长,因此优先级最高。CAN总线的仲裁机制如图13所示,几点说明:

***Wire-AND Bus Logic:***只有节点发送的全是隐性,总线电平才表现为隐性;

***Arbitration Logic:***所有发送节点在发送数据的同时,也检测总线上的电平状态。如果总线电平状态与它发送的电平状态一致,则继续发送(Next);如果发送为显性,总线电平状态为隐性,则传输出现故障(Fault);如果发送为隐性,总线电平状态为显性,则该节点退出对总线占用权的竞争(Stop);

节点A和节点C同时向总线上发送数据,在仲裁阶段,逐位对比总线上电平与自身发送的电平,在标识符的第四位(ID7),节点C检测到总线上电平与其自身发送电平不一致,它自动退出对总线的竞争,节点A则继续发送数据

图13. CAN总线仲裁机制

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

为消息划分优先级比较适合于实时控制系统,这样可以确保重要的信息优先发送,相对次要的消息延迟发送,系统设计师应该根据应用的特点为不同消息确定不同的优先级(标识符),在类似 DeviceNet 这些规范组织的定义中,对于同样类型的消息,比如温度传感器,即使它们可能来自不同的供应商,但消息标识符是一致的。

对于车身控制CAN网络(舒适+信息娱乐),其特点是消息标识符种类多,而且消息发送没有固定频率或规律,在此类应用的CAN控制器,例如 Freescale 的 MSCAN(Motorola Scalable Controller Area Network)的设计中,控制器内部包括 FIFO 寄存器,它将具有相同标识符的消息按顺序保存,从而避免接收缓冲器溢出。而对于动力系统控制的CAN网络,总线上的消息特点是速度快,但是存在一定规律,此类应用的CAN控制器,例如 Freescale 的 *FlexCAN*(CAN 2.0B-Compliant),它包括 16 ~ 64 个称为“*mailbox*”的接收缓冲器,运行时根据特定的过滤规则,将不同标识符的消息送到各自对应的 *mailbox* 。


1.3.控制段

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


1.4.数据段

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


1.5.CRC段

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


1.6.ACK段

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




2.远程帧

一般地,数据是由发送单元主动向总线上发送的,但也存在接收单元主动向发送单元请求数据的情况。远程帧的作用就在于此,它是接收单元向发送单元请求发送数据的帧。远程帧与数据帧的帧结构类似,如上图X所示。远程帧与数据帧的帧结构区别有两点:

  • 数据帧的 RTR*值为“0”,远程帧的 RTR*值为“1
  • 远程帧没有数据块

远程帧的 *DLC* 块表示请求发送单元发送的数据长度(Byte)。当总线上具有相同标识符的数据帧和远程帧同时发送时,由于数据帧的 *RTR* 位是显性的,数据帧将在仲裁中赢得总线控制权。


数据帧与远程帧的区别



3.错误帧

CAN-bus 错误类型



错误帧

用于在接收和发送消息时检测出错误时,通知错误的帧。错误帧由错误标志和错误界定符构成。错误帧的帧结构如图11示。

  • 错误标志:

6-12个显性/隐性重叠位

  1. 主动错误标志(6个显性位): 处于主动错误状态的单元检测出错误时输出的错误标志
  2. 被动错误标志(6个隐性位): 处于被动错误状态的单元检测出错误时输出的错误标志
  • 错误界定符:*8* 个隐性位
图11. 错误帧的帧结构


4.过载帧

过载帧是用于接收单元通知发送单元它尚未完成接收准备的帧。在两种情况下,节点会发送过载帧:

  • 接收单元条件的制约,要求发送节点延缓下一个数据帧或远程帧的传输;
  • 帧间空间(Intermission)的 3 bit 内检测到显性位

每个节点最多连续发送两条过载帧。过载帧由过载标志和过载界定符(8 个隐性位)构成。数据帧的帧结构如图12所示。


图12. 过载帧的帧结构

5.帧间隔




CAN应用层

简介

CANopen是一种架构在控制局域网络(Controller Area Network, CAN)上的高层通信协议,包括通信子协议及设备子协议,常在嵌入式系统中使用,也是工业控制常用到的一种现场总线

CANopen 实现了OSI模型中的网络层以上(包括网络层)的协定。CANopen 标准包括寻址方案、数个小的通讯子协定及由设备子协定所定义的应用层。 CANopen 支持网络管理、设备监控及节点间的通讯,其中包括一个简易的传输层,可处理资料的分段传送及其组合。一般而言数据链结层及物理层会用CAN来实作。除了 CANopen 外,也有其他的通讯协定(如EtherCAT)实作 CANopen 的设备子协定。

CANopen由非营利组织CiA(CAN in Automation)进行标准的起草及审核工作,基本的 CANopen 设备及通讯子协定定义在 CAN in Automation (CiA) draft standard 301中。针对个别设备的子协定以 CiA 301 为基础再进行扩充。如针对 I/O 模组的 CiA401 及针对运动控制的 CiA402。

就OSI通信系统模型而言,CAN覆盖前两个级别:物理层和数据链路层。物理层定义了所使用的线路,电压,高速特性等。标准的CAN协议实现数据链路层,它是基于帧的(消息)协议。CANopen涵盖了上面五层:网络(寻址,路由),传输(端到端可靠性),会话(同步),表示(以标准方式编码的数据,数据表示)和应用。应用层描述了如何配置,传输和同步CANopen设备。

设备模型

以下是所有 CANopen 设备都要具备的功能:

通讯单元 处理和网络上其他模组通讯所需要的通讯协定。 设备的启动及重置由状态机(state machine)控制。状态机需包括以下的几个状态:Initialization, Pre-operational, Operational 及 Stopped。当接收到网络管理 (NMT) 通讯对象,状态机会转换到对应的状态。 对象字典 (Object Dictionary) 是一个有 16 位元索引 (Index) 的变量阵列。每个变量可以(但非必须)有 8 位元的子索引 (Subindex)。变量可用来调整设备的组态,也可以对应设备量测的资料或设备的输出。 当状态机设定为 operational 之后,设备的应用 (application) 部份就会实现设备预期的机能。此部份可以由对象字典中的变量调整其设定,而资料由通讯层传送或接收。

对象字典

CANopen 设备都需要具备对象字典,用来设定设备组态及进行非即时的通讯。对象字典的entry 定义如下:

索引 (Index):对象 16 位元的位址。 对象名称 (Object name):一个代表对象的 symbolic type,可以是阵列、纪录或只是一个变量。 名称 (Name):描述此 entry 的字串。 形态 (Type):变量的资料形态。 属性 (Attribute):提供此 entry 是否可读/可写的资料,有下列四种:可读/写、只读、唯写、只读常数。 必须 (Mandatory)/可选 (Optional)字段定义属于特定设备规范下的设备,是否必须实现某些对象。 在 CANopen 标准中定义了对象字典中的基本资料型态,包括逻辑值、整数及浮点数。也定义了复合对象:如阵列、记录及字串。复合对象用一个 8 位元的数值作为其子索引(subindex)。记录或阵列中子索引 0 的位置记录数据结构的元素个数,资料型态为 UNSIGNED8。

例如在 CiA301 标准中,设备通讯的参数放在索引范围 0x1000 - 0x1FFF (通讯行规区)。此区域的前几项如下:

索引对象名称名称形态属性M/O
0x1000VARdevice typeUNSIGNED32只读M
0x1001VARerror registerUNSIGNED8只读M
...
0x1008VARmanufacturer device nameVis-String常数O
...

若配合适当的工具,可以用编辑电子资料表(electronic data sheet, EDS)档案的方式规划一个设备,并且将变量的数值上传到设备中。EDS 档案的格式通常会是INI档。

通讯对象

CANopen 的物理层 CANbus 每次传送的数据量不大,其中包括 11 位元的 ID、远端传输请求(RTR)位元及大小不超过8字节的资料。CANopen 将 CANbus 11 位元的 ID 分为 4 位元的功能码及 7 位元的 CANopen 节点 ID。7 位元的 ID 共有 128 种不同的组合,其中 ID 0 不使用,因此一个 CANopen 网络上最多允许 127 台设备。CANbus 在 CAN 2.0 B 规格中允许 29 位元的 ID,因此若配合 CAN 2.0 B 使用,CANopen 网络上可以超过127 台设备,不过在实际运用中,大多数的 CANopen 网络上设备数量均低于此数值。

CANopen 的帧结构

CANopen 将 CANbus 的 11 位元 ID 称为通讯对象 ID (COB-ID)。当传输数据发生冲突时,CANbus 的仲裁机制会使 COB-ID 最小的讯息继续传送,不用等待或重传。COB-ID 的前 4 个位元是 CANopen 的功能码,因此数值小的功能码表示对应的功能重要,允许的延迟时间较短。

以下是一个标准的 CANopen 页框

功能码节点 IDRTR资料长度资料
长度4 位元7 位元1 位元4 位元0-8 字节

在 CANopen 标准中,部份 COB-ID 被保留作网络管理及 SDO 通讯用。而在设备初始化后,有些功能码和 COB-ID 会对映到标准的功能,不过后续仍可以规划为其他用途。

  • 11 位 进一步分成位 4个功能码和7位 ID。7位大小限制CANopen网络上的设备数量限制为127个节点。
  • 在一个控制系统中,设备的ID 和 数据的格式都是由系统厂商规定的。例如笔者曾经开发过一个汽车上的方向盘角度传感器。就是由汽车厂提供的帧数据格式和ID 数据表,来设计的。与博世的同类产品不相同。

我们一直在讲,底层通信协议只是解决语法的问题,没有解决语法的问题-数据代表上面含义?

CANOpen 是建立在CANBUS链路层基础上的应用协议,解决语义的问题(8个字节什么代表意思?)。让不同厂商的产品能够真正的互联互通。

基于对象的通信

每个设备都有各种数据要和外界交换,例如方向传感器的角度,速度和加速度。这些参数具有名称,类型,长度等特征。访问这些参数的方式最简单的方式就是定义地址和长度。然后读取。PLC 中modbus 协议就是这么简单粗暴的方法。这种低级的方式显然比较容易出错。设置复杂。

控制协议越来越多地采纳了面向对象程序设计的思想。将每个参数定义成为一个数据对象。并且可以采样人类可读方式编写,例如采样XML 语言来描述。

CANopen 采用了类似的思想,它将参数定义为对象,每个设备中都有一个对象字典,对象字典可以一个文件描述,它叫做EDS(Electronic data sheet),它采用了INI 文件格式。

为了简化协议中的数据交换,CANopen 协议中只是自定对象的索引(index)和子索引(sub index)并不传递对象的所有信息。这就好比只交换字典中的的页码和行,列。通信双方各自去查字典。了解具体的含义。

于是,CANBUS 可怜的8个字节又分成了三个部分。一个字节用于说明符,三个字节用于节点索引和子索引,四个字节用于传输中的实际数据,真正的数据只有4个字节了。

当所有需要传输的数据都不能放入一条消息中时,将选择分段传输,因此必须使用多个消息或“段”来传输数据,说明符的第7 为1 表示有后续数据。


通讯模型

CANopen 设备间的通讯可分为以下三种通讯模型。

在 master/slave 模型中,一个 CANopen 设备为 master,负责传送或接收其他设备(称为 slave)的数据。NMT 协定就使用了 master/slave 模型。 客户机/服务器(client/server)模型定义在 SDO 协定中,SDO client 将对象字典的索引及子索引传送给 SDO server,因此会产生一个或数个需求数据(对象字典中,索引及子索引对应的内容)的 SDO 封包。 生产者/消费者(producer/consumer)模型用在 Heartbeat and Node Guarding 协定。由一个生产者送出数据给消费者,同一个生产者的数据可能给一个以上的消费者。又可分为二种: push-model:生产者会自动送出数据给消费者。 pull-model:消费者需送出请求讯息,生产者才会送出数据。


CANopen参考模型
CANopen设备模型

协议

NMT 协议NMT(网络管理, Network management)协议会定义(设备内部)状态机的状态变更命令(如启动设备或停止设备)、侦测远端设备 bootup及故障情形。

NMT master 使用的模组控制协定可变更设备的状态。其 COB-ID 为 0,其功能码及节点 ID 均为 0,因此网络上的所有节点均会处理这个信息。在此信息的数据部份会有此信息实际针对节点的ID,此 ID 也可为 0,表示所有节点都要变更为指定的状态。

心跳协议(Heartbeat protocol)是用来监控网络中的节点及确认其正常工作。心跳信息的生产者(一般是 slave 设备)周期性的送出功能码 1110、ID 为本身节点 ID 的讯息,信息的数据部分有一个表示节点状态的位。而心跳信息的消费者负责接收上述数据,若在指定时间(于设备的对象字典中定义)内,消费者均未收到信息,可采取相应动作(例如显示错误或重置该设备)。

其格式为:

COBID + DATA(status of node)

CANopen 设备需要在 bootup 时自动从 Initializing 状态切换至 Pre-operational 状态,设备会在切换完成后送出一个心跳信息,这就是心跳协议。

有一种 pull model 的 NMT 协议,称作节点监控(Node guarding)协议,也可以作从机的监控。

SDO 协议

服务数据对象(SDO)可用来存取远端节点的对象字典,读取或设定其中的数据。提供对象字典的节点称为SDO server,存取对象字典的节点称为SDO client。SDO 通讯一定由SDO client 开始,并提供初始化相关的参数。

在CANopen的术语中,上传是指由 SDO server 中读取数据,而下载是指设定 SDO server 的数据。

由于对象字典中的数据长度可能超过8个字节,无法只用一个CAN数据包传输,SDO也支援长数据包的分割(segmentation)和合并(desegmentation)。这样的对象有二种:SDO下载/上传(SDO download/upload)及SDO区块下载/上传(SDO Block download/upload)。CANopen协议较新版本支援SDO区块传输,可以允许传输大量的数据,且传输的overhead可以较低。

负责处理SDO数据传输的COB ID可在对象字典中设置。在对象字典的索引0x1200至0x127F可设定SDO server的COB ID,最多可设定到127个。而SDO client可以在对象字典的索引0x1280至0x12FF中设定。不过预定义连结(pre-defined connection set)定义在开机后(Pre-operational状态)可用来设定设备组态的SDO。接收用的COB ID为0x600 +节点ID,而传送用的COB为0x580 +节点ID。

PDO 协定

过程数据对象 (PDO) 协议可用来在许多节点之间交换即时的数据。可透过一个 PDO ,传送最多 8 字节(64位)数据给一设备,或由一设备接收最多 8 字节(64位元)的数据。一个 PDO 可以由对象字典中几个不同索引的数据组成,规划方式则是透过对象字典中对应 PDO mapping 及 PDO 参数的索引。

PDO 分为两种:传送用的 TPDO 及接收用的 RPDO。一个节点的 TPDO 是将数据由此节点传输到其他节点,而 RPDO 则是接收由其他节点传输的数据。一个节点分别有 4 个 TPDO 及 4 个 RPDO 。

PDO 可以用同步或异步的方式传送:同步的 PDO 是由 SYNC 信号触发,而异步的 PDO 是由节点内部的条件或其他外部条件触发。例如若一个节点规划为允许接受其他节点产生的 TPDO 请求,则可以由其他节点送出一个没有数据但有设置 RTR 位元的 TPDO(TPDO 请求),使该节点送出需求的数据。

借由 RPDO 也可以使两种设备同时启动。

优势概述

1.物理层非常稳定;2. 数据链路层可靠,因为相比其他所有总线,只有CAN可以做到达到汉明间距(Hamming Distanz)为6,能够检测报文里多达5个随机引入的位错误及15位突发性错误。3. 灵活,兼容性高;4. 可互操作性高;5. 价格低 (对于设备生产商来说);6. CAN产品尺寸小,节省空间;7.支持冗余备用

CANopen 专有名词

PDO 过程数据对象 - 对应实际物理量的输入及输出。数据的单位可能是 RPM, V, Hz, mAmp...。
SDO 服务数据对象 - 一般来说是组态设定的数据,如节点位置、节点ID、通信速度、位移、增益等。……
COB-ID - CAN 对象编号
CAN ID - CAN Identifier. 是在每个 CAN 数据前面的信息识别码,共 11 位元。
EDS - 电子数据手册(Electronic data sheet)是 INI 格式或XML格式(从2007年底开始)的文件。
DCF - 设备配置文件(Device configuration file),是加强版的 EDS,可以设置节点 ID 及通信速度。

更多协议介绍,请参考:

CANopen应用程序框架图


CANopen开发流程图(最小程序)


CANopen源代码框架图

编辑于 2023-07-12 16:01・IP 属地广东