您的位置:首页 > 其它

CAN总线

2020-06-25 04:27 218 查看

一.CAN总线简介与特点

1.CAN总线在1983年始于德国Bosch公司开发的一种串行数据通信总线。它总线上挂接的设备不分主从(或者可以成为多主的工作方式),这种工作方式得益于总线采用了非破坏性的总线仲裁技术。相比于其他一些总线采用的站地址编码,CAN总线使用了报文标识符。通过对于报文标识符的过滤可以实现点对点,一点对多点传送和全局广播等几种数据传送方式。
2.①CAN总线的通信距离最高可以达到10km(5kbit/s),在40m通信距离的时候,速度可以达到1Mbit/s。
②在一条CAN总线上节点数可以达到110个。
③在数据传送的时候,采用的是短帧结构,传输的时间短,受到干扰概率大大降低。
④CRC等检错措施,保证通信的高可靠性。
⑤CAN节点具有自动关闭的功能。
⑥CAN的通信介质可以使用双绞线,同轴电缆或者光纤。

二.CAN总线的通信

1.CAN总线的物理层和链路层

2.Bosch公司发布的CAN标准

CAN2.0A支持标准的11位标识符;
CAN2.0B同时支持标准的11位标识符和扩展的29位标识符。
注:标准CAN和扩展CAN——最初,CAN标准把仲裁字段中的标识符长度定义为11位。后来客户的需求推动了该标准的延伸。新格式通常称为扩展CAN,标识符不允许少于29位。为了区分这两种帧类型,在控制字段中使用了一个保留位。CAN2.0B的节点可以是主动型,这也就意味着该节点可以发送和接收扩展帧。CAN2.0B也可以是被动型,这也就意味着它可以静默的丢弃扩展帧。如果在向前追溯的话,1.X可以表示初始规范与其发布的修订版本。如今新型的CAN控制器通常用的是2.0B的类型。1.X或者2.0A类型的控制器如果接收到29个仲裁位的报文会很麻烦。2.0B类型的控制器容许这些报文,如果他们正确的话会进行应答,然后将这些报文丢弃。2.0B主动型既可以传送也可以接收这些报文。它实际上也就是兼容了1.X类型与2.0A类型。并且可以在同一个总线上使用他们,前提是保证2.0B类型的控制器不发送扩展帧即可!有些时候人们说标准CAN优于扩展CAN,原因就在于扩展CAN报文会产生更多的间接费用。这种说法也未必正确,如果您使用仲裁字段来传送数据,那么扩展CAN实际发生的间接费用可能比标准CAN要少。

3.CAN的物理层与链路层的划分


其实这种层叠结构的划分不仅对于使用起来有很大的方便,而且对于我们的去学习CAN相关知识也是非常有层次的。

4.手绘的简易CAN通信模型


从上图中我们能很清楚的知道,想要对于CAN信号的传输与应用,一定要同时具有CAN的控制器和CAN的收发器。(有些CPU内置了CAN的控制器,就不在需要外部额外增加控制器)

5.CAN通信的数值位表示

1.CAN总线使用不归零的位填充
有两种不同的信令状态:显性(逻辑0)和隐形(逻辑1)
2.这些信令状态对应于所在的物理层的某种电平。模块以线与的逻辑连接到总线上,哪怕只有一个节点发送逻辑0,则总线就会处于显性状态,不管有多少隐形状态的节点传送,则整个总线都处于显性状态。

所谓的显性位指的是CAN_H-CAN_L>0.9V,隐形位指的是CAN_H-CAN_L<0.5V,如果二者差值在0.5~0.9V之间的话是一个不确定的逻辑状态。

6.CAN总线与节点的电气连接


重点注释:在上图中可以得知,CAN模块在给总线发送一个逻辑之后,这个信号还会传回给自己。主要的原因就是:如果模块1向总线发送了一个显性逻辑,并且它传回给自己一个显性逻辑。模块一就能知道是自己将整个总线变成了显性。如果模块一向总线发送了一个隐形逻辑,但是它却收到了来自总线的显性逻辑,那就证明并不是模块一自己将整个总线变成了显性。

7.CAN总线的终端匹配电阻

**ISO11898 CAN总线规定不管通信距离有多远,不管传输速率有多快,必须进行端接。这不仅仅是为了避免信号反射的问题。CAN收发器在结构上,由隐形电平变为显性电平的时候是由晶体管进行驱动的,但是从显性变回隐形,是依靠终端电阻来进行放电的,如果不外加端接电阻,就会由双绞线形成的分布电容来进行缓慢的放电,这样就会导致位宽错误。因此终端电阻必须加。并且和RS485所加的终端匹配电阻类似,其阻值等于双绞线的特征阻抗。我们一般在设计电路的时候,每个板子都会预留终端电阻(因为你自己也不清楚自己的产品会被用在哪个节点上,可能是中间的节点,也可能首位两端的节点),这样就容易造成终端电阻的漏接或者多接。我们可以通过测量CAN_L与CAN_H之间的电压差来推测终端电阻是否漏接。
如果终端匹配电阻为120Ω,CAN的压差与终端电阻的数量如下所示:
①端接电阻数量为1,总线差分电压幅值为2.5V
②端接电阻数量为2,总线差分电压幅值为2V;
③端接电阻数量为3,总线差分电压幅值为1.5~1.7V;
④端接电阻数量为4,总线差分电压幅值为1.1~1.3V;
⑤端接电阻数量为5,总线差分电压幅值为0.9~1.1V;

7.CAN总线如何传送“0”和“1”呢?

1.位定时
①标称位速率:理想发送节点在没有重同步的情况下每秒发送的位数量
②标称位时间:标称位时间=1/标称位速率,就是CAN总线在进行通信的时候,一位数据持续的时间。
2.位时间的结构图:

①同步段:用于同步总线上不同的节点,是CAN总线位时间中每一位的起始部分;
②传播段:传播段用于补偿网络内的物理延迟;
③相位缓冲段:用于补偿边沿阶段的误差;
④采样点:采样点是读取总线电平并且转换为一个对应值的时间点;
注:CAN总线中将一个位传送的时间又具体划分了成了四个小段,采样点设置在缓冲区1和2之间,这样做的目的就是为了能够十分准确的传输信号电平。
3.同步:
同步使CAN总线系统的收发两端在时间上保持步调一致,但是由于节点的振荡器漂移,传播延迟以及噪声干扰等引起的位时间偏差成为相位误差。解决每个节点之间不同步的方法有如下两个:
①硬同步:硬同步只是在总线空闲的时候通过一个从“隐形位”到“显性位”的跳变来完成,此时不管有没有相位误差,所有节点的位时间重新开始,使得接收的节点和发送的节点同步段处在同一时刻内。硬同步只是发生在报文的同步段。所有接收的节点各自调整当前位的同步段,调整位宽不限。

②重同步:在报文的随后位中,每当有从“隐形位”到“显性位”的跳变,并且该跳变落在了同步段之外,就会引起一次重同步。重同步的机制可以根据跳边沿加长或者缩短位时间来调整采样点的位置,保证正确采样。重同步跳转宽度(SJW)定义为相位缓冲段1可以被加长或者相位缓冲段2可以被缩短的上限值。

二.CAN总线的数据链路层

1.逻辑链路控制子层LLC

①验收过滤:通过验收过滤确定是否被接受数据帧。
注:上一篇文章中我们说到RS485总线只有一对一或者一对多的收发功能,不能实现广播的传输模式,但是CAN总线中可以实现选择性广播进行数据传输。
②超载通知:如果接收节点由于内部原因要求延迟下一个数据帧/远程帧,则发送超载数据。
③恢复管理:发送期间,对于丢失仲裁或者被错误干扰的帧,LLC子层具有重新发送的功能。
注释:CAN总线上的节点是如何实现验收过滤的功能呢?下图为一个基本的示意图:

例如节点2向总线上发送数据,另外的三个节点都会有过滤器,三个节点在接收数据之前会将数据存储在过滤器内,如果发现不是自己需要的数据则会主动丢弃,如果是自己需要的数据就会接收。

2.CAN非破坏性总线仲裁的实现

CAN总线做了改进并采用CSMA/CA(Carrier Sense Multiple Access with Collision Avoidance)访问总线,按位对标识符进行仲裁。各节点在向总线发送电平的同时,也对总线上的电平读取,并与自身发送的电平进行比较,如果电平相同继续发送下一位,不同则停止发送退出总线竞争。剩余的节点继续上述过程,直到总线上只剩下1个节点发送的电平,总线竞争结束,优先级高的节点获得总线的控制权。
**注:总线规定,每一个数据帧都有一个标识符(ID),这个标识符决定了优先级。打个比方,CAN总线是CAN_H和CAN_L的结合来表示隐形电平和显性电平,实质上也就可以将这两根线等效为一根线用高低电平来进行表示。现在CAN总线处于空闲的状态,有两个节点想要去占用CAN总线发送数据。其中节点一的标识符为0011 0010;节点二的标识符为0011 0000,在进行仲裁到底该那个节点可以占用总线的时候,是按位来进行的。接下来进行的动作是这样的,节点一和节点二同时向总线发送0,由于显性电平会覆盖隐形电平(和线与的原理是相同的),总线一定向节点一回复一个0,并且向节点二回复一个0,这个时候他们收到的和发出的相同,继续向后走;一直到两个节点同时向总线发送第七位的时候,节点一向总线发送的是1,节点二向总线发送的是0,但是由于CAN总线的特性,节点一一定会收到一个0,节点二也会收到一个0,但是节点一收到的和发出去的不相同了,这就证明,除了节点一之外还有一个优先级更高的节点想要来占据总线进行数据传输。这个时候节点一就会自动的退出,等待节点二发送完之后再进行数据的发送。这就是总线仲裁原理的实现。

3.CAN总线帧的结构

一.CAN总线中帧的分类

1.总线上的信息以不同的固定报文格式发送
①.数据帧(date frame):数据帧携带数据从发送器至接收器。
②.远程帧(Remote frame):接收单元向发送单元请求发送具有相同标识符数据所用的帧。
③.出错帧(Error Frame):任何单元检测到一总线错误就会发出出错帧。
④.超载帧(Overload Frame):超载帧用以在先后的数据或远程之间提供一附加的延时。

二.四种帧的详解

1.数据帧
数据帧在结构上由七段构成,根据仲裁段中位数的不同分为标准帧(CAN2.0A)和扩展帧(CAN2.0B)

①帧起始:在总线处于空闲状态的时候,通过从隐性位到显性位的跳变,这个段只有一个位,并且所有的节点都在此时完成一次硬同步(上文中我们谈到的硬同步的机理)
②帧结束:帧结束这一段由七个连续的隐性位组成
③仲裁段:在帧起始之后是仲裁段
标准帧:由12个位组成,分别为11个识别位(ID)和一个远程发送请求位(RTR)
其中RTR用于区分报文是数据帧(RTR为显性状态)还是远程帧(RTR为隐性状态),其中远程帧的优先级是低于数据帧的。
扩展帧:由十一位的基本ID、SSR位、IDE位、和18位扩展ID组成,其中SSR和IDE位都是隐性状态。
注:在扩展帧中,SSR位是用来替代标准帧中远程帧请求位,占一个bit。IDE为识别符扩展位,占一个bit,在标准帧中,该位位于控制段,在扩展帧中,该位位于仲裁段。
④控制段

控制段一共有六位,标准帧的控制段由IDE,r1以及DLC0~DLC3组成,扩展帧的数据段由r0,r1以及数据长度码组成。其中数据长度码是用来说明报文中包含的数据字节。
⑤数据段:一个数据帧传输的字节范围是0~8个,这种短帧的传输结构让CAN总线抗干扰能力强,并且数据传送量特别小,发送和接收的时间会变得特别短,实时性就很高。
⑥CRC段:

CRC段由15位的CRC序列和1位隐性位CRC界定符组成;CRC序列存在的目的就是为了检测报文传输是否正确。
⑦应答段:当接收节点收到的起始帧到CRC段之间没有任何错误的时候,他就会在应答段向总线发送一个显性电平,来表示自己收到了正确的信息。此时发送节向总线发出的是隐性电平,由于总线上线与的原因,导致总线会变成显性电平,发送节点就会根据总线电平的状态来判断是否有接收器接收到了自己的信息。
2.远程帧
一般的情况下,数据的传输是由源节点自主完成的,但是也可能发生终结点向源节点请求发送数据的情况,就是远程数据请求。要做到这一点,终结点必须发送一个标识符与所需数据帧的标识符相互匹配的远程帧。随后相应的数据源节点会发送一个数据帧以响应远程帧的请求。
远程帧与数据帧非常类似,但是远程帧中不包含数据段。并且远程帧的RTR位为隐性状态。当带有相同标识符的数据帧和远程帧同时发出的时候,数据帧将会赢得总线仲裁,这是因为紧随其后的标识符为RTR位显性。
3.出错帧
出错帧由检测到总线错误的任一节点产生。
出错帧包含错误标识段和错误界定段(错误界定段是八个隐性电平位),其中错误标识段又分为主动错误标识和被动错误标识。
尽管CAN总线做的已经非常周全,但是依然可能会发生如下的几个错误类型:
①CRC错误:发送节点计算的CRC值与接收节点计算的CRC值不相符。
②格式错误:传输的数据帧格式与任何一种合法的格式都不相符。
③应答错误:发送节点在应答段并没有收到接收节点的应答信号。
④位错误:发送节点在发送数据时发现总线电平状态与自己发送的电平状态不一致
⑤位填充错误:通信线缆上违反位填充的规则从而发生错误。
出现错误的时候,发送节点或者是接收节点都会向总线发送出错帧。上文说到,错误标识的两种类型,主动错误标识由主动错误状态的节点发送,由六个连续显性电平组成;被动错误标识由被动错误状态的节点发送,由六个连续的隐性电平组成。
⑥为了防止某个节点设备本身出错向总线一直发送出错帧,CAN总线规定了节点的三种状态以及其行为。

4.过载帧
某个节点还没有做好接受下一组数据帧的准备时,就可以向总线发送过载帧,用来通知发送节点先不要进行数据的发送。过载帧由过载帧标志和过载帧界定符组成。其中过载帧标志由六个连续的显性电平位组成,过载帧界定符由八个隐性电平位组成。由于在某条CAN总线上的某个时刻可能会出现不止一个节点过载并且发送过载帧存在着时间差的问题,过载帧中的过载帧标志很有可能在叠加之后出现超过六位的现象。
5.帧间隔
帧间隔的作用是将数据帧、远程帧与他们之前的帧分隔开,但是过载帧和错误帧前面就不需要增加帧间隔。关于帧间隔需要说明两点:
①帧间隔后如果没有节点发送状态,那么总线就进入空闲状态。
②帧间隔过后,如果被动错误节点想要发送帧,需要先发送八个隐性电平的延迟之后再发送帧。

内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: