赞
踩
目录
5. CRC段(Cyclic Redundancy Check Field)
通讯是两个或两个以上参与者之间交换信息的有意识活动,目的是通过符号和语义规范的共享系统来发送或接收信息。通讯的基本步骤包括通讯意图的形成,信息的组成,信息的编码,信号的发送,信号的接收,信息的解码以及最终的信息解释,这一系列步骤也称之为协议。
CAN通讯的数据传输方式类似于电话会议或视频会议。一个人(控制单元)发送其数据,将其输入网络,而其他人“共同收听”该数据。其中一部分人对此数据很有趣,因此他们使用它。另一部分人可能对该特定数据不感兴趣并将其丢弃。
CAN通讯在汽车车身控制和动力系统控制中被广泛运用,国际上针对CAN通讯形成了两个国际标准:
ISO-11898 定义了通信速率为125kbps ~ 1Mbps的高速CAN通信标准,属于闭环总线,传输速率可达1Mbps,总线长度<= 40米;
ISO-11519 定义了通信速率为10 ~ 125kbps的低速CAN通信标准,属于开环总线,传输速率为40kbps时,总线长度可达1000米;
CAN总线上每个节点都有CAN收发器(transceiver)和CAN控制器(controller),CAN收发器和CAN控制器可能集成在芯片(on-chip),也可能是独立于芯片(off-chip)。
CAN总线电平信号如下图所示:
电压差满足定义的一定范围,就可以认为是显性电平或者隐性电平,比如电压差在1.5-2.5v范围,都认为是显性电平(针对ISO-11898)。
CAN总线信号的传输过程:
发送方通过CAN收发器使总线电平发生变化,将其信息传递到CAN总线上。接收方通过监听总线电平,将总线上的消息读入自己的CAN收发器。
所谓节点的优先权是根据标识符(ID)决定。这里的ID不是表示发送的目的地址,而是表示访问总线的消息的优先级,ID越小优先级越高。
非破坏性意味着仲裁的胜出者(即优先级高的信息)不被打扰,不需要重新启动,仲裁的失败者也不会被破坏,而是等着这条信息发送完后,再进行下一次仲裁,直到胜出而获得发送权。
这个机制要求相关的物理驱动器必须按线与机制执行,即CAN总线上有显性和隐性两种逻辑电平,当一个节点发送一个显性电平,它会覆盖其他节点发送的隐性电平。
CAN总线上的闲时电平为隐性电平,即逻辑1。
对于仲裁失败的节点,怎么知道自己仲裁失败了呢?
保证CAN通信安全最大的特点是它的发送错误自检测要求:发送器将要发送的位电平与总线上检测到的位电平进行比较。所以在节点B发送(Tx) 的隐性电平,回读/接收(Rx)的却是显性电平时,节点B就知道仲裁失败了,从而转为接收状态。也就是说节点发送信息时,会实时判断接收的信息是不是自己发送的。
与总线相连的节点没有类似于“地址”的信息。因此在总线上增加节点时,连接在总线上的其它节点的软硬件及应用层都不需要改变。CAN 总线可连接的节点总数理论上是没有限制的。但实际上可连接的节点数受总线上的时间延迟及电气负载的限制。降低通信速度,可连接的节点数增加;提高通信速度,则可连接的节点数减少。
根据整个网络的规模,可设定适合的通信速度。在同一网络中,所有单元必须设定成统一的通信速度。即使有一个单元的通信速度与其它的不一样,此单元也会输出错误信号,妨碍整个网络的通信。不同网络间则可以有不同的通信速度。简而言之,双方必须要在同一频道交流,不然沟通就有障碍。
通过发送遥控帧(或远程帧),需要数据的节点可以请求另一节点发送相应的数据帧,如下图。数据帧和相应的远程帧是由相同的识别符( ID)命名的。
CAN协议帧主要有4种类型,如下图。基于帧类型间的关系,将帧结构分成两部分介绍,一部分为数据帧和远程帧(数据帧与远程帧的最大差别在于远程帧没有数据段,故将两者放在一起),另一部分为错误帧和过载帧。先将介绍第1部分数据帧和遥控帧。
根据 CAN 2.0A 和 CAN 2.0B 标准可知,数据帧(Data Frame)和远程帧(Remote Frame)有标准格式(Standard)和扩展格式(Extended),这2种格式都具有相同的帧结构,如下图:
都包括七个部分:帧起始,仲裁段,控制段,数据段,CRC段,ACK段,帧结束
数据帧的标准格式和扩展格式:
远程帧的标准格式和扩展格式:
数据帧和远程帧的结构区别:
远程帧没有数据段,数据长度码该如何表示
没有数据段的数据帧有何用途?
表示帧开始的段,1个位的显性位。(总线空闲时为隐性位,故帧起始以显性位非常好识别),对于数据帧和遥控帧的标准/扩展格式均如此。
表示数据的标识符(Identifier, ID)的段,标准格式和扩展格式在此的构成不同。如前面所述:该段确定信息发送的优先级。标准帧的仲裁段由11位基本ID和1个RTR位组成,而扩展帧的仲裁段由11位基本ID,18位扩展ID,1个SRR位,1个IDE位和1个RTR位组成。
为了便于仲裁标准帧与扩展帧,做如下定义:
数据帧和远程帧的标准/扩展格式在仲裁时可能会产生5种情况,这里就不一一列举:
总体的优先级顺序是(在前11位ID号相同时):
数据帧大于远程帧(同是标准或扩展);
标准帧大于扩展帧(同时数据或远程)。
RTR决定了数据帧和远程帧的优先级;
SRR决定了标准数据帧和扩展数据帧的优先级;
IDE决定了标准远程帧和扩展远程帧的优先级;
表述数据段的字节数,由6个位组成。
其中保留位必须全部以显性电平发送,但接收方若接收显性、隐性及其任意组合的电平不当成错误。
数据的字节数必须为0-8字节,但接收方对DLC=9-15的情况并不视为错误,一般最终以DLC=8来处理。
数据段由数据帧中的发送数据组成,可包含0-8个字节的数据,每个字节包含了8个位,从MSB(最高位)开始发送。遥控帧没有此段。
CRC段由15个位的CRC序列序和1个位的CRC界定符(用于分隔位)组成,其中CRC界定符恒为隐性。
这里CRC序列是根据多项式生成的CRC值,其计算范围包括帧起始,仲裁段,控制段和数据段。
应答段由应答槽(ACK Slot)和应答界定符(ACK Delimiter)2个位组成,其作用是用来确认是否正常接收。
表示该帧的结束的段。由7个位的隐性位构成。
CAN通讯框架是基于OSI参考模型来设计的。那么什么是OSI参考模型?它有什么作用?接下来开始了解OSI参考模型。
OSI参考模型是一个逻辑上的定义,一个规范,它把网络从逻辑上分为七层,每一层都对应着不同的作用,这七层分别为应用层、表示层、会话层、传输层、网络层、数据链路层、物理层。对OSI七层网络模型的定义,对后续的各种网络技术的评判和分析提供了依据,也是学习网络技术的基础。
考虑到作为汽车底层网络,其信息传输量相对较少,信息传输的实时性要求较高,网络连接方式相对较简单,因此,CAN总线网络底层只采用了OSI 7层参考模型的最低两层,即物理层和数据链路层,而在高层只有应用层。物理层和数据链路层的功能可由CAN接口器件来实现,应用层的功能是由微处理器实现的。这里先了解下物理层和数据链路层:
物理层是OSI参考模型中最底层,主要定义了系统的电气、机械、过程和功能标准。如:电压、物理数据速率、最大传输距离、物理联接器和其他的类似特性。物理层的主要功能是利用传输介质为数据链路层提供物理连接,负责数据流的物理传输工作。物理层传输的基本单位是比特流,即0和1,也就是最基本的电信号或光信号,是最基本的物理传输特征。
物理层与CAN通讯相关的内容
数据链路层是在通信实体间建立数据链路联接,传输的基本单位为“帧”,并为网络层提供差错控制和流量控制服务。数据链路层由MAC(介质访问控制子层)和LLC(逻辑链路控制子层)组成,其中MAC的主要任务是规定如何在物理线路上传输帧,LLC对在同一条网络链路上的设备之间的通信进行管理。数据链路控制子层主要负责逻辑上识别不同协议类型,并对其进行封装,也就是说数据链路控制子层会接受网络协议数据、分组的数据包并且添加更多的控制信息,从而把这个分组传送到它的目标设备。
数据链路层与CAN通讯相关的内容
服务原语
LLC子层
根据上述服务原语的描述,我们知道发送数据时,LLC用户传输数据给LLC子层,并请求LLC子层发送,当LLC子层发送数据后,向LLC用户确认发送状态。当接收数据时,LLC子层通知LLC用户有数据到达。下图表述了每条服务原语对数据的规定:
到此我们就知道了LLC子层的发送与接收过程。另外,LLC子层可以与对等的LLC实体交换数据单元的,也就是交换LLC数据帧。
一个LLC数据帧由3个位段(bit field)组成,即id,长度和数据3段,基本对应于CAN协议帧的三段,其中id段稍有不同,它包含3个部分:基本id,扩展flag和扩展id,但在MAC子层会将id段处理成CAN协议帧的id段格式。
MAC子层
MAC子层是OSI DLL的最底层部分,介于LLC子层和PLS子层间,因此提供了访问这两层的接口,另外也提供了打包接收数据/解包发送数据,接收/发送介质访问管理等功能。
MAC子层分为两条完全独立的操作部分,即发送和接收。MAC发送或接收的数据帧就是前面所述的CAN协议帧:
对于发送部分,MAC子层要实现:数据打包和发送介质访问管理。
数据打包,包括:LLC数据帧的接收;CRC序列计算;MAC数据帧的构建(即增加SOF,SRR位,IDE位,RTR位,保留位,CRC,ACK和EOF到LLC数据帧)。
发送介质访问管理,包括:识别到总线空闲时发起发送;位填充;仲裁,仲裁失败转为接收模式;ACK检查等;向物理层发送一串位流(a serial bit stream)。
对于接收部分:MAC子层要实现:接收介质访问管理和数据解包。
接收介质访问管理,包括:从物理层接收一串位流;删除填充的位;发送ACK等。
数据解包,包括:移除数据帧的MAC特定信息;把LLC数据帧和接口控制信息给LLC子层。
位填充(bit stuffing)和去位填充(bit destuffing):
数据最终发送方是以显隐性电平形式逐位地发送到总线上,那么接收方是怎么正确地接收这一位一位的总线电平呢?这就涉及到后面的CAN通讯之位定时与同步。
每一帧数据(即一个完整的数据帧)由很多位组成,当发送方发送一帧数据到总线时,接收方怎么准确接收到这帧数据呢?首先需要了解下位时间的基本概念,再在此基础上,针对传输延迟等问题,采用同步方法处理。
位时间就是指一个(二进制)位在总线传输所需要的时间,即:位时间就是位速率的倒数。如下图所示:一个位分为4段,这些段又由称为Time Quantum(以下称为 Tq)的最小时间单位构成,这称为位时序。
关于各段的作用和可配置Tq范围如下图:
所谓采样点是读取总线电平,并将读到的电平作为位值的点,位置在PBS1结束处:
CAN协议的通信方法为NRZ(Non-Return to Zero)方式,各个位的开头或者结尾都没有附加同步信号。发送单元以与位时序同步的方式开始发送数据。另外,接收单元根据总线上电平的变化进行同步并进行接收工作。但是,发送单元和接收单元存在的时钟频率误差及传输路径上的(电缆/驱动器等)相位延迟会引起同步偏差,因此接收单元通过硬件同步或者再同步的方法调整时序进行接收。
硬同步
硬同步是指在总线空闲状态,接收节点检测出帧起始位(SOF)时,会调整当前位的同步(SS)与发送节点的帧起始位SS段一样,调整宽度不限。
1)发送节点Node_A在发送SOF位时,SOF位的下降沿在SS段;
2)这时接收节点Node_B发现自己当前位的SS段和发送节点SOF位的SS段不同步。也就是说当Node_A产生SOF位SS段时,Node_B的当前位的SS段已经在5个Tq之前产生了;
3)这样接收节点Node_B硬将自己当前位的SS段拉到与SOF位的SS段同步。
再同步
再同步是指接收节点检测出除SOF位以外的其他位时进行的同步调整。再同步会通过加长PBS1段,或缩短PBS2段来调整同步,以保证采样点的准确。这里加长或缩短(即跳转)操作涉及到一个概念-同步跳转宽度(SJW),是指PBS1和PBS2再同步时允许跳转的最大宽度,其必须满足以下2个条件:
下面看下再同步的两种情况:
情况1:PBS1段加长(发的晚,收的早)
1)发送节点Node_A比接收节点Node_B的时间慢了,也就是说Node_A当前位的ss段产生的时候,Node_B 当前位的SS段已经在2个Tq之前产生了;
2)这时接收节点Node_B就将PBS1延长2个Tq的时间;
3)这样Node_A当前位的采样点就和Node_B的采样点同步了。
情况2:PBS2段缩短(发的早,收的晚)
1)发送节点Node_A当前位的SS段诞生2Tq时长之后,接收节点Node_B的当前位才产生SS段;
2)这时接收节点Node_B当前位的PBS2段缩短;
3)这样就导致接收节点Node_B的下一位能够提前2个Tq,从而Node_B的下一位采样点和Node_A下一位的采样点能够同步。
硬件同步和再同步遵从如下规则。
• 发送方在帧起始到仲裁段有多个单元同时发送的情况下,对延迟边沿不进行再同步。
传输延迟时间tPTS
CAN报文在CAN总线上的传输时,物理延迟包含两个部分:
1.在CAN-BUS上传输造成的延迟 2.在节点上传输造成延迟
按照CAN通信协议的规定,补偿给传播延迟的时间长度要至少等于实际实际传播延迟时长的2倍,即:tPTS≥2×tdel=2×(tel+tBus)注意:在CAN总线通信系统中是以时间量子Tq来度量时间的,所以如果延迟补偿时间tPTS = 3.1Tq,那么这个时候要取:tPTS = 4Tq。
错误帧是用于在接收和发送消息时检测出错误通知错误的帧,它由错误标志和错误界定符构成。
上图的错误标志包括主动错误标志(6个位的显性位)和被动错误标志(6个位的隐性位)两种。主动错误标志为处于主动错误状态的单元检测出错误时输出的错误标志。被动错误标志为处于被动错误状态的单元检测出错误时输出的错误标志。错误界定符由8个位的隐性位构成。注意上图0~6位的错误标志重叠,这段怎么确定呢?需先介绍2个概念:位填充和错误类型。
位填充
位填充是为防止突发错误而设定的功能。当同样的电平持续5位则添加一个位的反型数据位:
注意:位填充作用范围为SOF-CRC段间的数据
错误类型
错误类型有5种,如下图所述:
位错误的说明:
所谓“发出的电平与从总线上回读的电平不一致”,指的就是节点向总线发出隐性位,却从总线上回读到显性位或者节点向总线发出显性位,却从总线上回读到隐性位这两种情况。有三种例外情况不属于位错误:
在仲裁区,节点向总线发送隐性位却回读到显性位,不认为是位错误,这种情况表示该节点仲裁失败;
在ACK槽,节点向总线发送隐性位却回读到显性位,不认为是位错误,这种情况表示,该节点当前发送的这一帧报文至少被一个其它节点正确接收;
一个节点发送被动错误标志,该节点向总线发送连续六个隐性位(被动错误标志)却回读到显性位,不认为是位错误。因为被动错误标志是六个连续的隐性位,所以在总线上按照线与机制,有可能这六个连续隐性位被其它节点发送的显性电平覆盖。
错误帧的发送
检查到错误后,什么时候发送错误帧呢?按照CAN协议的规定:
• 位错误、填充错误、格式错误、ACK错误。在错误产生的那一位的下一位开始发送错误帧。
• CRC错误。紧随ACK界定符后的位发送错误帧。
1)发送节点Node_A发送一个显性位,但是却从总线上听到一个隐形位,于是Node_A节点就会检测到一个位错误;
2)Node_A检测到位错误之后,立即在下一位开始发送主动错误帧:6个连续显性位的主动错误标志+8个连续隐性位的错误界定符;
3)对应Node_A发出的主动错误标志,总线上电平为6个连续显性位;
4)接收节点Node_B和Node_C从总线上听到连续6个显性位,那么就会检测到一个填充错误,于是这两个节点都会发送主动错误帧;
5)对应Node_B和Node_C发出的主动错误标志,总线电平又有6个连续显性电平,对应Node_B和Node_C发出的错误界定符,总线电平有8个连续的隐性电平。
6)在间歇场之后,Node_A节点重新发送刚刚出错的报文。
错误标志重叠部分的形成
在这个例子,可以知道位错误的错误标志与填充错误的错误标志重叠2位,剩下部分还有4位。
过载帧是接收单元用于通知其尚未完成接收准备的帧。过载帧由过载标志(6个位的显性位)和过载界定符(8个位的隐性位)构成。过载界定符的构成与错误界定符的构成相同。过载帧的构成如下图所示:
对于过载帧的帧结构我们可以这样理解:接收节点达到接收极限时,就会发出过载帧到总线上,显然,过载标志的6个连续显性位会屏蔽掉总线上其它节点的发送,也就是说这个时候的接收节点通过发送过载帧的方式来破坏其它节点的发送,这样在接收节点发送过载帧期间,其它节点就不能成功发送报文,于是就相当于把其它节点的发送推迟了,也就是说接收节点在其发送过载帧的这段时间得以“休息”。有3种情况会引起过载帧:
1.接收节点自身原因。接收节点由于某种原因需要延迟接收下一个数据帧或者遥控帧。
2.在帧间隔的间歇段的第一位和第二位检测到一个显性位(正常的间歇段都是隐性位)。帧间隔的间隔段本应是三个连续的隐性位,如果接收节点在间隔段检测到显性位,那么就意味着此时有报文发向接收节点,但这个时候是不应该有报文发来的,于是接收节点发送过载帧。
3.CAN节点在错误界定符或过载界定符的第八位(最后一位)听到一个显性位0,节点会发送一个过载帧,且错误计数器不会增加。接收节点在错误界定符和过载界定符的最后一位听到显性位,也意味着有报文发向接收节点,但这个时候是不应该有报文发来的,于是接收节点发送过载帧。
单元(节点)检测到错误帧时,随着错误的积累,单元会处于3种错误状态的一种,即主动错误状态,被动错误状态或总线关闭态。
1.主动错误状态:可以正常参加总线通信的状态,处于主动错误状态的单元检测出错误时,输出主动错误标志。
2.被动错误状态:是易引起错误的状态。处于被动错误状态的单元虽能参加总线通信,但为不妨碍其他单元通信,接收时不能积极地发送错误通知;处于被动错误状态的单元即使检测出错误,而其它处于主动错误状态的单元如果没发现错误,整个总线也被认为是没有错误的。处于被动错误状态的单元检测出错误时,输出被动错误标志。另外,处于被动错误状态的单元不能马上再次开始发送。在开始下次发送前,在间隔帧期间内必须插入“延迟传送”(8个位的隐性位)。
3.总线关闭态是不能参加总线上通信的状态。信息的接收和发送均被禁止。
单元到底会处于以上3种错误状态的哪一种,具体依靠发送错误计数和接收错误计数来管理,根据计数值决定进入何种状态。错误状态和计数值的关系如下表和下图所示。
发送错误计数值和接收错误计数值根据一定的条件发生变化。错误计数值的变动条件如下表,一次数据的接收和发送可能同时满足多个条件。错误计数器在错误标志的第一个位出现的时间点上开始计数。
当出现总线关闭态时,将设置CAN控制器状态为STOPPED,从而禁止读或写总线的数据。
CANFD(CAN Flexible Data-Rate)
CANFD可以理解为CAN协议的升级版,只升级了协议,但物理层未改变。
CANFD诞生原因
原因主要是因为汽车功能越来越多,越来越复杂,传统的CAN总线(CAN2.0)的负载率越来越高,甚至负载率高达95%;
因为传统CAN总线的局限性:传输率最大为1Mbit/s(典型的<= 500kbit/s);
传统CAN数据帧超过50%的额外开销(overhead > 50%),对比其他协议,额外开销比例要小得多,如UDP (1500 bytes/datagram, 64 bytes overhead),FlexRay(254 bytes/frame, 8 bytes overhead)。
因为历史原因,汽车不可能直接放弃目前的传统CAN总线技术,一切推到重来。那么为了解决CAN总线负载率问题,而又能兼容CAN总线,并且研发成本不能太高的问题。
CANFD FlexRay Ethnet?
CAN FD的开发成本远低于FlexRay;
FlexRay 对ECU升级刷写不友好;
CAN FD的开发成本远低于Ethnet;
Ethnet优势在于大数据的传输但不能完全适用于当前汽车架构;
CANFD与传统CAN比较:
传输速率不同:每个报文中有两种速率,仲裁段与传统CAN速率相同,数据段最高5Mbps;
数据长度不同:拥有更大的数据载荷,一条报文最大可以传输64字节的数据;
取消远程帧;
帧的格式不同:详见下图:
RRS位代替了传统CAN的RTR;
FDF位表示这个是传统CAN还是CAN FD,置1表示CAN FD;
增加了BRS位,表示速率切换位,置1(逻辑1,隐形电平),表明时钟频率切换;
增加了ESI位来表明错误状态;显性和隐性;
CAN-FD在仲裁场增加BRS位,只要一个Bit的时间1-2us,就可以无缝切换波特率。仅仅更换传统控制器CAN节点的收发器,使收到BRS位有效时立即关闭接收,避免波特率不一致使低速节点发出错误帧。使用最低的成本就是可以实现一个CAN网络中个别节点的速率提升。
CAN FD因为最大可以传输64字节的数据,所以DLC和传统报文的有些区别;
CAN总线由于位填充规则对CRC的干扰,造成错帧漏检率未达到设计意图。CAN FD对CRC算法做了改变,即CRC以含填充位的位流进行计算。在校验和部分为避免再有连续位超过6个,就确定在第一位以及以后每4位添加一个填充位加以分割,这个填充位的值是上一位的反码。作为格式检查,如果填充位不是上一位的反码,就作出错处理。CAN FD的CRC场扩展到了21位。
Stuff count: 填充位计数(计算从SOF开始到Data Field最后一位的填充位的个数)
Stuff Count由以下两个元素组成:
格雷码计算(前3位):CRC区域之前的填充位数除以8,得到的余数(Stuff bit count modulo 8)进行格雷码计算得到的值(Bit0-2)
奇偶校验(最后1位):通过格雷码计算后的值的奇偶校验(偶校验)
CAN中:CRC 15位
CANFD中当传输数据为16字节或更少时:CRC 17位
CANFD中当传输数据超过16字节时:CRC 21位
CAN FD的CRC界定符和ACK与传统CAN一样,但是因为考虑到收发器速率切换的问题,总线分别可以容忍数据的1位延长,即CRC Delimiter从原来的1位【1】变为了CAN FD的最大2位【1】,ACK从原来的1位【0】变为了CAN FD的最大2位【0】。
1. 汽车电子与软件公众号#CAN通讯系列
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。