赞
踩
想要了解CAN协议,我们首先从最朴素的需求出发,或许对您理解起来会更直白,不过由于个人水平有限如博文有谬误还请各位看官指正勘误,还望海涵。
一、为什么会出现CAN网络协议
CAN网络广泛运用在汽车行业,但在CAN网络出现之前,传统汽车电气系统中各个模块之间是采用点对点的通信方式:
每个模块功能也比较单一,形成庞大的布线系统。各个控制模块之间连接相互交错,但并且随着汽车各控制模块逐步向自动化、智能化发展,汽车电气系统也日益复杂,这种传统的点对点布线方法进一步加剧了粗大线束与汽车有限空间的矛盾。
为了应对这些问题,CAN总线应运而生:
这种布线形式是不是更简单、清晰。
接下来我们一步步去探究CAN协议吧
二、CAN总线的特点
CAN总线是一种异步串行数据通信协议,其通信接口中集成了CAN协议的物理层和数据链路层功能,可完成对通信数据的成帧处理,包括位填充、数据块编码、循环冗余检验、优先级判别等工作。 CAN总线的特点主要如下。
(1)多主通信,网络上任意一个节点均可以在任意时刻主动地向网络上的其他节点发送信息,不分主从,通信方式灵活。
(2)采用无破坏性的基于优先级的逐位仲裁,标识符越小,优先级越高。若两个节点同时向网络上传送数据,优先级高的报文获得总线访问权,优先级低的报文会在下一个总线周期自动重发。
(3)可以采用点对点、点对多及全局广播等传送方式收发数据。
(4)直接通信距离最远可达10km(速率5kb/s以下)。
(5)通信速率最高可达1Mb/s(此时距离最长40m)。
(6)节点数实际可达110个。
(7)每帧信息都有CRC校验及其他检错措施,数据出错率极低。
(8)通信介质可采用双绞线、同轴电缆和光导纤维,一般采用廉价的双绞线即可,无特殊要求。 (9)节点在错误严重的情况下,具有自动关闭总线的功能,以切断它与总线的联系,使总线上的其他操作不受影响。
三、数据是怎么在CAN总线中传输的呢
CAN总线是通过两条线来传输信号:CAN高线、CAN低线。信号由两条线的电位差将物理信号转换成数字信号,以高速CAN为例,CAN高为3.5V,CAN低为1.5V,电位差为2V,此时定义为显性,对应数字信号:0;CAN高与CAN低均为2.5V时,电位差为0V,此时定义为隐性,对应数字信号:1。
如下图所示,高速CAN及低速CAN的物理层定义
通过上述的转换,产生了010101是不是跟二进制的数字信号对应上了。为了消除信号反射高速CAN在总线终端会接上终端电阻。
CAN总线由显性电平和隐性电平,执行的是线”与“逻辑,即只要总线上有一个节点发送显性电平,则总线为显性电平(即逻辑0),只有总线上发送的所有电平都为隐性时,总线才为隐性电平(即逻辑1)。
四、信号是以怎样的形式通信的呢
CAN总线的数据单元称为帧,不同的帧由固定格式定义:
数据帧
远程帧(也叫遥控帧)
错误帧
过载帧
帧间隔
1、数据帧的结构解析(用于发送节点向接收节点传送数据)
数据帧分别由标准帧结构和扩展帧格式,除了仲裁段有差别,其他的位都一致
SOF:帧起始,顾名思义,标识数据帧开始传输的位,告诉其他节点我要开始传输数据了,为显性(0),同时总线上其他节点监测到帧起始后会硬同步,后续再详细说说同步,这里可以简单的将硬同步理解成大家将接收信号的时间与发送节点统一起来。
仲裁段:
标准帧有11位的用来保存信号的ID,RTR为远程帧位(数据帧时为显性0,如果为隐性1时则表示此帧为远程帧),总共12位。
扩展帧的ID段分为两段,第一段为11位与标准帧一样,SRR及RTR位,作用与标准帧的RTR一样(默认是显性0,如果为隐性1则表示此帧为远程帧),IDE位用于区分标准帧及扩展帧,IDE为显性0则为标准帧,IDE为隐性1则为扩展帧。
CAN总线的特点之一就是无破坏性逐位仲裁,下面我们来看看怎么无破坏怎么逐位仲裁的。
CAN总线为多主通信,简而言之就是允许多个节点同时发送信号到总线上,节点发送信号的同时CAN收发器也会监控总线上的电平信号,通过监测仲裁段节点发送及接收的信号情况,来判断是否仲裁胜出,胜出的节点获得继续发送信号的权力,失败的马上停止发送信号并在下一位转为接收状态,等待接收完成后再次进入发送状态,并重新参与仲裁,不破坏未发送的数据(所谓的无破坏性)。
如何判断胜出呢?由于线”与“逻辑,从对仲裁段第一位开始,逐个比对仲裁段的电平,如果发送节点发送电平,与监测到的总线电平不一致,仲裁失败转为接收;如果一致则继续比对下一位仲裁段位电平,直到决出胜负,获得总线发送权。
控制段:
标准帧的控制段由IDE、r0保留位、DLC数据字节长度组成,IDE位为显性0,r0位也为显性0,DLC位为4个位的长度用来表示传输数据的字节长度,标准帧及扩展帧传输的数据字节均为0~8个字节。如果发送节点DLC=9~15,接收节点不视为错误。
扩展帧的控制段由r0、r1保留位、DLC数据字节长度组成,r0、r1为显性,DLC的定义与标准帧的一致。
数据段:用于保存数据帧传输的数据,其位数由控制段DLC决定。
CRC段:此段是为了校验帧传输是否正确的作用,由15个CRC校验位与CRC界定符(默认隐性1),CRC校验计算范围包括帧起始、仲裁段、控制段、数据段。接收节点也以相同的方式计算CRC值进行比对,不一致时就会引入错误处理机制。
ACK段:也叫应答段,由ACK位(默认隐性)和ACK界定符(默认隐性)组成,如果接收节点正确接收了帧会发送一位显性电平(由于CAN总线线”与“逻辑,发送节点也能监测到应答的显性电平)。
EOF:帧结束,由7个连续的隐性位组成。
好啦,最复杂的数据帧如果搞定了,后面的帧结构都更简单了
2、远程帧的结构解析(用于接收单元向具有相同 ID 的发送单元请求数据)
远程帧也由标准帧与扩展帧两种,不知道您还是否记得数据帧中RTR、SRR这两个远程帧标识位呢,远程帧与数据帧除了没有数据段,其他的都是一样的结构,CRC校验范围为帧起始、仲裁段、控制段。
SOF:帧起始,顾名思义,标识数据帧开始传输的位,告诉其他节点我要开始传输数据了,为显性(0),同时总线上其他节点监测到帧起始后会硬同步,后续再详细说说同步,这里可以简单的将硬同步理解成大家将接收信号的时间与发送节点统一起来。
仲裁段:
标准帧有11位的用来保存信号的ID(此时为被请求数据节点的ID),RTR为远程帧位(默认隐性1),总共12位。
扩展帧的ID段分为两段,第一段为11位与标准帧一样,SRR及RTR位,作用与标准帧的RTR一样(默认为隐性1),IDE位用于区分标准帧及扩展帧,IDE为显性0则为标准帧,IDE为隐性1则为扩展帧。
控制段:
标准帧的控制段由IDE、r0保留位、DLC数据字节长度组成,IDE位为显性0,r0位也为显性0,DLC位为4个位的长度用来表示请求传输数据的字节长度。结合远程帧的用途可知,DLC为被请求数据的节点发送数据帧的数据字节长度。
扩展帧的控制段由r0、r1保留位、DLC数据字节长度组成,r0、r1为显性,DLC的定义与标准帧的一致。
CRC段:此段是为了校验帧传输是否正确的作用,由15个CRC校验位与CRC界定符(默认隐性1),CRC校验计算范围包括帧起始、仲裁段、控制段(远程帧无数据段)。接收节点也以相同的方式计算CRC值进行比对,不一致时就会引入错误处理机制。
ACK段:也叫应答段,由ACK位(默认隐性)和ACK界定符(默认隐性)组成,如果接收节点正确接收了帧会发送一位显性电平(由于CAN总线线”与“逻辑,发送节点也能监测到应答的显性电平)。
EOF:帧结束,由7个连续的隐性位组成。
3、错误帧的结构解析(用于当检测出错误时向其它单元通知错误)
错误帧由错误标志和错误界定符组成
错误标志:
主动错误标志:6个位的显性位,处于主动错误状态的节点检测出错误时输出的错误标志
被动错误标志:6个位的隐性位,处于被动错误状态的节点检测出错误时输出的错误标志
错误界定符:8个位的隐性位。
4、过载帧的结构解析(用于接收单元通知其尚未完成接收准备,简直就是直呼你不要过来啊,我还没准备好)
过载帧由过载标志与过载界定符组成
过载标志:6个位的显性位(咋滴啦跟主动错误帧一毛一样呢)
过载界定符:8个位的隐性位(又来一个跟错误界定符一样的呢)
5、帧间隔的结构解析(用于分隔数据帧和遥控帧)
数据帧和遥控帧可通过插入帧间隔将本帧与前面的任何帧(数据帧、 遥控帧、错误帧、过载帧)分开。 过载帧和错误帧前不能插入帧间隔。
间隔:3个位的隐性位
总线空闲:隐性电平
延迟传送(发送暂时停止):8个位的隐性位,只在处于被动错误状态的节点刚发送一个消息后的帧间隔中包含的段。
结合数据帧、远程帧可以知道,从ACK界定符开始到帧间隔,一共11位隐性位,可以判断出此情况下总线处于空闲状态。
五、怎样保证CAN总线上各节点数据的收发保持一致呢
CAN总线为异步串行传输,没有时钟线。
还记得那个显性位的帧起始不,我们把一个位数据传输的过程再拆细一点来看看。
这里需要引入两个概念:位速率、位时序
位速率:由发送单元在非同步的情况下发送的每秒钟的位数
一个位时间可以分为四个段:
同步段(SS)
传播时间段(PTS)
相位缓冲段 1(PBS1)
相位缓冲段 2(PBS2)
这些段又可以由Time Quantum(以下称为 Tq)的最小时间单位构成。
1 位分为 4 个段,每个段又由若干个 Tq 构成,这就称为位时序。
1 位由多少个 Tq 构成、每个段又由多少个 Tq 构成等,可以任意设定位时序。通过设定位时序,多个单元可 同时采样,也可任意设定采样点。
各个时间段什么作用呢:
采样点就是读取总线电平,并将读到的电平作为位值的点。当接收到总线上的帧起始,接收节点就通过同步段去同步接收的时序,并按设定好的时序去采样读取总线上的电平。如果未硬同步读取的数据可能与发送节点发出的数据不一致。
但随着时间的推移、信号在总线上传输延迟以及连续相同位的传输,累计误差可能导致发送和接收节点位时序不一致,这时我们又要怎么预防呢?我们就要继续引入位填充及重同步(再同步)概念了。
位填充:为防止突发错误而设定的功能。当发送节点发送连续相同 5 位的电平持续时则添加一个位的相反类型的位。(接收节点会以同样的逻辑当接收到连续五个相同电平信号后,会剔除位填充作为数据再去做处理)
由于有位填充,就存在类似帧起始的下降沿或者上升沿,利用这些下降沿、上升沿接收节点可以重新同步与发送节点的位时序,原理与硬同步一样。
六、CAN总线错误处理机制
CAN总线上难免出现各种错误,并且节点在出现严重错误时可以使该节点从CAN总线上脱离,从而不影响其他节点的正常工作。
错误的种类:
位错误:发送电平与检测的总线电平不一致(不包含仲裁段仲裁、位填充、ACK应答位)
填充错误:不符合位填充规则
CRC错误:发送节点与接收节点计算的CRC值不一致
格式错误:检测出与固定格式位段不一致电平
ACK错误:发送节点监测总线上应答的电平位隐性
CAN各节点有三种错误状态:
主动错误状态
主动错误状态是可以正常参加总线通信的状态。 处于主动错误状态的单元检测出错误时,输出主动错误标志。
被动错误状态
被动错误状态是易引起错误的状态。 处于被动错误状态的单元虽能参加总线通信,但为不妨碍其它单元通信,接收时不能积极地发送错误通知。 处于被动错误状态的单元即使检测出错误,而其它处于主动错误状态的单元如果没发现错误,整个总线也被 认为是没有错误的。 处于被动错误状态的单元检测出错误时,输出被动错误标志。 另外,处于被动错误状态的单元在发送结束后不能马上再次开始发送。在开始下次发送前,在间隔帧期间内 必须插入“延迟传送”(8 个位的隐性位)。
总线关闭态
总线关闭态是不能参加总线上通信的状态。 信息的接收和发送均被禁止。 这些状态依靠发送错误计数和接收错误计数来管理,根据计数值决定进入何种状态。
节点始终处于 3 种状态之一。
错误状态和计数值的关 系如表图:
节点根据所在的状态以及错误类型去发送错误帧,并记录发送及接收到的错误次数,再根据发送错误累积的计数值和接收错误累积的计数值去变更节点所处错误状态。
七、总结
好啦,感谢大家耐心的看到结尾,本文对您理解CAN总线是否起到一点点作用呢,如果有什么需要改进的,欢迎大家收藏留言关注,后续还将继续解读LIN总线协议,我们一起学习探讨吧,谢谢!
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。