CAN总线中的信息是以固定格式的“帧”发送的,当总线为空闲时,任何已连接的节点都可以开始发送一个新的“帧”。
在一个CAN系统中,数据在节点之间的发送和接收主要通过四种不同类型的“帧”来执行和控制。这四种类型分别是数据帧、远程帧、错误帧和过载帧。
第一种数据帧的功能就是将一组数据从一个发送节点传送给所有需要的接收节点,这也是我们最常用的帧类型。
第二种是远程帧,也叫遥控帧,它是在某一个节点向其它节点请求传送特定的数据帧时使用,这个帧类型在汽车中很少使用。
第三种是错误帧,错误帧可以被任何节点发送,无论是发送节点还是接收节点,只要检测到总线错误都可以发送。
第四种是过载帧,过载帧是当某个接收节点内部过载,无法接收下一帧时,会发送过载帧以通知发送节点。
今天我们要详细介绍的是乘用车中最常用的帧类型
标准格式数据帧的帧结构
数据帧的帧结构是由7个不同的位场构成,它们分别是帧起始、仲裁场、控制场、数据场、CRC场、ACK场和帧结束。
1、帧起始SOF
SOF标志着数据帧的开始,它只由1位单独的“显性”位组成,即逻辑“0”。
为什么SOF必须是“显性”位?因为总线在空闲状态时是“隐性”位,一直是逻辑“1”,所以起始位必须与空闲时的逻辑相反,才能区分总线空闲和忙碌。
一个节点只有在总线空闲时才能发送SOF,发送节点发送SOF后,在总线上会引起“隐性”到“显性”的跳变,即逻辑“1”变为逻辑“0”,对应的实际电平是从差分电压的0V到2V(注意CAN的逻辑“0”和“1”与实际的物理电平高低是相反的)。
所有其它的节点都将按SOF引起的上升沿进行硬同步。硬同步就是让所有的接收和发送节点都以这个上升沿硬线信号作为采样、测量的时间基准,这样可以保证各个节点在之后的同一时刻采集到相同的信息。
2、仲裁场
仲裁场包括11位的标识符ID(identifier)和1位的RTR。
标准格式的ID是11位,总线上是以“显性”位为优先,而“显性”位对应逻辑0,因此对应到实际的ID时,就是ID值越小,优先级越高。比如ID为0x390与0x398同时发送,按由高到低位逐次比较,第11位~第5位相同,而第4位0x390为0,0x398为1,则0x390优先级更高,获得总线控制权。
RTR位是用于区分数据帧和远程帧,在数据帧中它是“显性”位,即逻辑0;在远程帧中它是“隐性”位,即逻辑1。
有的工程师不太明白的是,RTR位既然是区分数据帧和远程帧的标志位,为什么会把它也归类到仲裁场的范围呢?
这是因为远程帧和它对应的数据帧的标识符ID是一样的,当两者在总线中同时发送时,仅通过标识符ID是无法仲裁出优先级的,而数据帧的RTR是“显性”,远程帧的RTR是“隐性”,CAN总线的规则是“显性”位优先级高于“隐性”位,因此根据RTR位可以仲裁出同样ID的数据帧的优先级高于远程帧,因此把RTR位也归类到仲裁场中。
3、控制场
控制场包括3个字段,1位的IDE、1位的r和4位的DLC
IDE是扩展标志位,“显性”(0)表示标准格式,“隐性”(1)表示扩展格式。标准格式的ID是11位,主要用于小型乘用车;扩展格式的ID是29位,主要用于大型商用车,本文介绍的就是标准格式。
r是预留位,用于未来的扩展应用,发送时固定为“显性”(0)。
DLC表示数据场中发送数据的字节长度,4位可表示的范围是0~15,而实际的数据长度范围是0~8,所以4位可以满足长度显示要求。
4、数据场
数据场比较简单,就是包括了0~8个字节,即0~64位的数据,车辆中所有的信号都在这里进行传输,比如车速、转速、门开、温度等信息,数据场中的信号是我们在软件开发和测试中最常见到的内容。
5、CRC场
CRC场包括了15位的CRC序列和1位的CRC界定符。
CRC序列的的计算方法是基于多项式的除法运算。
被除数多项式的系数由填充位流给定,填充位流由SOF、仲裁场、控制场和数据场的数据共同组成。
除数多项式为固定的生成多项式X15+X14+X10+X8+X7+X4+X3+X
用被除数多项式除以除数多项式,所得的余数即为CRC序列值。
发送节点会根据以上方法先计算出一个CRC序列值,接收节点根据实际收到的数据再计算出一个CRC序列值,两者进行比较,如果相同,说明接收的数据帧正常,如果不同,说明收到的数据帧有问题,接收节点就会发出错误帧。
后面的CRC界定符DEL固定为“隐性”(1)。
6、ACK场
ACK场共2位,包括1位的应答间隙ACK(ACK slot)和1位的应答界定符DEL(ACK delimiter),发送节点会将这两个字段都发送“隐性”位(1)。
所有收到符合CRC序列的帧的节点将在ACK位发出一个“显性”位(0),用以覆盖原来的“隐性”位(1),而发送节点检测到了ACK位的“显性”状态(0),就可以判断出其它节点已经正常接收。
应答界定符DEL在发送和接收过程始终保持“隐性”状态(1)。
7、帧结束EOF
每一个数据帧都以EOF作为帧结束的界定符,EOF是由连续的7个“隐性”位(1)组成。
8、帧间空间
除了7个位场外,还有一个帧间空间Interframe space的概念。
这个概念要求每一个数据帧与它前一帧(数据帧、遥控帧、错误帧或过载帧)之间必须以帧间空间分隔开,不考虑错误帧的挂起传输时,帧间空间主要包括间歇ITM(intermission)和总线空闲Bus Idle两部分。
ITM由3个“隐性”位(1)组成,在ITM期间,数据帧不允许发送。
总线空闲Bus Idle可以是任意长度的隐性位(1),数据帧只能在Bus Idle期间发送。
至此,一个数据帧的完整收发周期就全部结束了,从总线空闲后面的SOF开始,则又进入了下一个收发过程!