前言:
上篇文章对CAN通讯做了简单介绍,从这篇文章开始,将从CAN总线基础逐步深入。本文将先延续上篇文章的内容,介绍CAN总线特点;再介绍CAN总线基础之一:帧结构。
1 CAN总线特点**
1.1 多主工作方式
多主工作方式是指CAN总线上的所有节点没有主从之分,表现在数据传输上是:
- 在总线空闲状态下,任意节点都可以向总线上发送信息。即图1所示的所有节点(CAN Node A,B,C,D)都可以向总线发送信息。
- 最先向总线发送信息的节点获得总线的发送权。即图1所示节点B的ID 0x34获得发送的优先权。
- 当多个节点同时向总线发送消息时,所发送消息的优先权高的那个节点获得总线的发送权。即图1所示节点A的ID 0x12和节点C的ID 0x67同时向总线发送时,节点A的ID 0x12获得发送权。
图1 多主工作方式示意图,引自[2]
所谓节点的优先权是根据标识符(Identifier 以下称为 ID)决定。这里 ID 不是表示发送的目的地址,而是表示访问总线的消息的优先级,ID值越小优先级越高。当两个以上的单元同时开始发送消息时,对各消息ID 的每个位进行逐个仲裁比较,仲裁获胜(被判定为优先级最高)的单元可继续发送消息,仲裁失利的单元则立刻停止发送而进行接收工作。这里关于仲裁的机制,接着看下一特点。
1.2 非破坏性仲裁机制
CAN总线的访问采用非破坏性仲裁机制。非破坏性意味着仲裁的胜出者(即优先级高的信息)不被打扰,不需要重新启动,仲裁的失败者也不会被破坏,而是等着这条信息发送完后,再进行下一次仲裁,直到胜出而获得发送权。这个机制要求相关的物理驱动器必须按线与机制执行,即CAN总线上有显性和隐性两种逻辑电平,当一个节点发送一个显性电平,它会覆盖其他节点发送的隐性电平。从上篇文章的CAN总线信号介绍,我们知道:显性电平为逻辑0,隐性电平为逻辑1。故可见下图2。
图2 线与机制图解,引自[3]
简而言之,线与机制相当于位与计算;显性覆盖隐性,就相当于电路通路时,有一个端点接地(GND),那么整个电路电压就为零了。
了解了线与机制后,来看一个仲裁示例,如下图3:有三个节点同时向总线发送信息,分别为节点1的ID 0x15A,节点2的ID 0x3D2,节点3的ID 0x1F6。仲裁从帧起始位(start of frame)开始,三个ID的第1位均为显性电平(逻辑0),仲裁没有胜负;接着仲裁第2位,节点3 ID 0x1F6为隐性电平(逻辑1),其他两个ID仍为显性电平,故节点3 ID 0x1F6仲裁失败而退出;再接着仲裁第3位,两个ID电平仍然相同,仲裁没有胜负;继续仲裁第4位,这时节点1 ID 0x15A依然为显性电平,而另一个ID为隐性电平,故节点1 ID 0x15A仲裁胜出,向总线继续发送信息。
图3 仲裁过程示意,引自[4]
针对仲裁失败的节点 ,怎么知道仲裁失败了呢?如下图4红圈处,节点B发送(Tx) 的隐性电平,回读/接收(Rx)的却是显性电平,故节点B就知道仲裁失败了,从而转为接收状态。也就是说节点发送信息时,会实时判断接收的信息是不是自己发送的。
图4 节点仲裁失败的处理,引自[5]
通过上述过程可以清晰地看出仲裁并没有破坏总线信号的发送,整个过程精准地按照协议规定执行。在 CAN 协议中,所有的消息都以固定的格式发送,上述提及的帧起始位是这个固定格式的一部分,具体细节将会在后续CAN帧结构展开。
1.3 系统的柔软性
与总线相连的节点没有类似于“地址”的信息。因此在总线上增加节点时,连接在总线上的其它节点的软硬件及应用层都不需要改变。CAN 总线可连接的节点总数理论上是没有限制的。但实际上可连接的节点数受总线上的时间延迟及电气负载的限制。降低通信速度,可连接的节点数增加;提高通信速度,则可连接的节点数减少。
图5 节点增加示意
1.4 通信速度
根据整个网络的规模,可设定适合的通信速度。在同一网络中,所有单元必须设定成统一的通信速度。即使有一个单元的通信速度与其它的不一样,此单元也会输出错误信号,妨碍整个网络的通信。不同网络间则可以有不同的通信速度。简而言之,双方必须要在同一频道交流,不然沟通就有障碍。
图6 通信速度要求,引自[3]
1.5 远程数据请求
通过发送遥控帧(或远程帧),需要数据的节点可以请求另一节点发送相应的数据帧,如下图5。数据帧和相应的远程帧是由相同的识别符( ID)命名的。
图7 遥控帧通讯示意,引自[3]
1.6 错误的检测功能,通知功能,恢复功能
- 所有的节点都可以检测错误(错误检测功能)。
- 检测出错误的节点会立即同时通知其他所有节点(错误通知功能)。
- 正在发送消息的节点一旦检测出错误,会强制结束当前的发送。强制结束发送的节点会不断反复地重新发送此消息直到成功发送为止(错误恢复功能)。
以上这些功能错误将会后续的错误帧部分分析。
2 CAN协议帧结构-part1
上述仲裁内容提到了CAN帧结构,接下来这部分将展开详细介绍。CAN协议帧主要有4种类型,如下图8。基于帧类型间的关系,将帧结构分成两部分介绍,一部分为数据帧和遥控帧(数据帧与遥控帧的最大差别在于遥控帧没有数据段,故将两者放在一起),另一部分为错误帧和过载帧。下面将介绍第1部分数据帧和遥控帧。
图8 帧类型,引自[1]
2.1 数据帧和遥控帧概览
根据 CAN 2.0A 和 CAN 2.0B 标准可知,数据帧(Data Frame)和遥控帧(Remote Frame)有标准格式(Standard)和扩展格式(Extended),这2种格式都具有相同的帧结构,如下图9。
图9 帧格式,引自[3]
数据帧由7个段(Field)构成,分别为帧起始,仲裁段,控制段,数据段,CRC段,ACK段和帧结束。遥控帧由6个段构成,即数据帧的7个段去除数据段。先看数据帧:
图10 数据帧结构及其两种格式,引自[1]
这里根据采集CAN总线的实际电压信号来形象地了解下标准格式的数据帧。
图11 标准数据帧的电压表现形式,引自[2]
再看遥控帧(也叫远程帧):
图12 遥控帧结构及其两种格式,引自[1]
对比上述的图10和12的数据帧和遥控帧结构有:
2.2 数据帧与遥控帧的段
通过上文的介绍对数据帧和遥控帧有了基本认识,下面具体了解每个段。
1) 帧起始(SOF, Start of frame)
表示帧开始的段,1个位的显性位。(总线空闲时为隐性位,故帧起始以显性位非常好识别),对于数据帧和遥控帧的标准/扩展格式均如此。
图13 帧起始结构,引自[1]
2) 仲裁段(Arbitration field)
表示数据的标识符(Identifier, ID)的段,标准格式和扩展格式在此的构成不同。如前面所述:该段确定信息发送的优先级。标准帧的仲裁段由11位基本ID和1个RTR位组成,而扩展帧的仲裁段由11位基本ID,18位扩展ID,1个SRR位,1个IDE位和1个RTR位组成,下图14。
图14 仲裁段结构,引自[1]
为了便于仲裁标准帧与扩展帧,做如下定义:
引自[1]
仲裁段既然用于仲裁,那么具体是怎么执行仲裁呢?
首先,说明下数据帧和遥控帧各自的两个格式下某些位的数值差别,如下所示:
然后,进行仲裁,情况1:在ID的前11位就能结束仲裁,如下图15,在ID25仲裁就结束。
图15 仲裁情况1
当在ID的前11位未结束仲裁,即说明前11位ID相同。这时需要进一步分为4种情况来讨论:
情况2:标准格式的数据帧与遥控帧仲裁,因为ID18后是RTR位,数据帧的RTR位恒为显性,遥控帧的RTR位恒为隐性。此时数据帧将仲裁胜出,即前11位ID号相同时,标准数据帧的优先级高于标准遥控帧。
图16 仲裁情况2
情况3:扩展格式的数据帧与遥控帧仲裁,
当前11位ID和后18位ID全相同时,由于这种情况下的SRR位和IDE位均为隐性,故也是看RTR位。扩展数据帧的RTR位恒为显性,扩展遥控帧的RTR位恒为隐性,此时数据帧将仲裁胜出。即前11位ID号相同时,扩展数据帧的优先级高于扩展遥控帧。
在前11位ID相同,后18位ID不相同时,仲裁过程与情况1一样。
图17 仲裁情况3
情况4:数据帧的标准格式与扩展格式仲裁,因为ID18后,标准格式的是RTR位,扩展格式的是SRR位,仲裁这两位,而标准格式的RTR位恒为显性,扩展格式的SRR位恒为隐性,故此时标准格式的数据帧仲裁胜出。即前11位ID号相同时,标准数据帧优先级高于扩展数据帧。
图18 仲裁情况4
情况5:遥控帧的标准格式与扩展格式仲裁,因为ID18后两者均是IDE位,扩展格式的IDE位恒为隐性,标准格式的IDE位在控制段,恒为显性,故标准格式的遥控帧仲裁胜出。即前11位ID号相同时,标准遥控帧优先级高于扩展遥控帧。
图19 仲裁情况5
通过上述分析,我们就知道了仲裁段的各种仲裁情况,尤其是在前11位ID号相同时,根据协议设定的RTR, SRR, IDE,就可以保证:
- RTR:保证数据帧优先级高于遥控帧;
- SRR :保证标准数据帧的优先级高于扩展数据帧;
- IDE :保证标准遥控帧的优先级高于扩展遥控帧。
2.3 控制段(Control field)
表述数据段的字节数,由6个位组成,标准格式和扩展格式的组成有所不同,如下图20所示。
图20 控制段结构,引自[1]
其中保留位必须全部以显性电平发送,但接收方可以接收显性、隐性及其任意组合的电平。数据长度码与数据的字节数的对应关系如下图21所示。数据的字节数必须为0-8字节,但接收方对DLC=9-15的情况并不视为错误,一般最终以DLC=8来处理。
图21 控制段与数据段的关系,引自[2]
2.4 数据段(Data Field)
数据段由数据帧中的发送数据组成,可包含0-8个字节的数据,每个字节包含了8个位,从MSB(最高位)开始发送。遥控帧没有此段。
图22 数据段结构,引自[1]
2.5 CRC段(Cyclic Redundancy Check Field)
CRC段由15个位的CRC序列序和1个位的CRC界定符(用于分隔位)组成,其中CRC界定符恒为隐性。
图23 CRC段结构,引自[1]
这里CRC序列是根据多项式生成的CRC值,其计算范围包括帧起始,仲裁段,控制段和数据段。
图24 CRC序列计算说明,引自[5]
附:en.wikipedia.org/wiki/C , 如何通俗的理解CRC校验并用C语言实现, zhuanlan.zhihu.com/p/77
2.6 应答段(Acknowledge Field, ACK)
应答段由应答槽(ACK Slot)和应答界定符(ACK Delimiter)2个位组成,其作用是用来确认是否正常接收。
图25 应答段结构及说明,引自[1]
图26 发送与接收时的ACK槽状态,引自[6]
2.7 帧结束(End of Frame)
表示该帧的结束的段。由7个位的隐性位构成。
图27 帧结束结构,引自[1]
到此CAN协议帧结构的第1部分基础知识就介绍完了,下篇文章将结合OSI七层模型,标准协议ISO11898-1以及应用报文来进一步理解CAN协议帧结构。
作者: 糊涂振
来源:智能汽车开发者平台
微信公众号:
推荐阅读:
更多汽车电子干货请关注汽车电子与软件专栏。欢迎添加极术小姐姐微信(id:aijishu20)加入技术交流群,请备注研究方向。