这里我们再次讲解一下CAN的收发过程:
1 CPU接收过程
CAN收发器将CAN_H和CAN_L线上的差分信号(CAN_H电压CAN_L 电压)转换为逻辑电平(高低电平) /逻辑值(0或1)发送给集成在CPU上的CAN控制器,CAN控制器再将逻辑电平/逻辑值转换为数字信号值(可以理解为我们实际在总线上看到的某个ID的8/16字节数据)发送给CPU;
2 CPU发送过程
CPU将所表达的数字信号值发送给CAN控制器,CAN 控制器将数字信号值转换为逻辑电平/逻辑值发送给CAN收发器,CAN收发器再将逻辑电平/逻辑值转换为差分信号发送至CAN总线;
3 差分信号实际上和逻辑电平/逻辑值是一样的,只不过要通过不同的CAN芯片去转换为CPU所能理解的数字信号值;
4 在CAN控制器中,会将得到的逻辑电平/逻辑值,比如说得到了一串逻辑值为:111010110.它内部会通过数据链路层协议将其转换为数字信号值,也就是最后CPU得 到的实际信号值,比如: 0x111,00 11 22 33 44 55 66 77,我们也称其为数字信号值。
5 数据链路层
5.1 帧(报文)类型
数据帧、远程帧、错误帧等。我们使用最多是数据帧,它由七部分组成:帧起始、仲裁段、控制段、数据场、CRC场、ACK场、帧结束;根据仲裁段的长度又分为标准帧(11位)和扩展帧(29位)。
5.2 标准帧
5.2.1 帧起始
由一个显性位(低电平)组成。
5.2.2 仲裁段
存在帧1D (11位)和RTR <1位)两段,车企会根据车上模块的优先级为每个模块分配1D,并定义一个范围,但是RTR这1位必须为显性(RTR=0)。
[RTR:远程传送请求位]
5.2.3 控制段
长度为6位,分别由IDE (标识符扩展位,使用显性电平填充,即IDE=0)、R0(保留位,使用隐性电平填充,即R0=1)、DLC (数据长度,即DLC=4)组成。
5.2.4 数据场
也就是我们平常所看到的8个16字节的CAN数据,1个字节有8位,总共有64位。
5.2.5 CRC场
总线上使用CRC校验进行数据检错,意思是发送方依据发送的数据计算的CRC 值与接收方根据接收的数据计算出的CRC值相符合,即本次通信成功:。CRC 校验段由15位CRC值和1位CRC界定符构成。
5.2.6 ACK场
接收端通知发送端数据已正确接收。由1个ACK间隙(应答位)和1个DEL(应答分隔符,默认为隐性电平)构成,当接收节点正确收到数据(即从帧起始到CRC校验段都未发生错误)时,会在ACK间隙期间发送1个显性位以示应答,告诉发送节点此段 数据接收成功, 如果未被接收节点正确接收(即填充为显性电平),则代表此段数据未被正确接收,此时发送节点会发出错误帧。
5.2.7 帧结束
由7个隐性电平组成,表示本段数据发送完成。节点在检测到连续11个隐性电平时即认为总线当前处于空闲状态。
在CAN总线上,会根据报文ID划分优先级,一 般类似于发动机等重要模块的优先级 都很高,所以报文ID就会靠前,比如0x012,如果总线上同时存在两个及两个以上的报文, 比如: 0x111、0x210、0x211等,根据报文仲哉机制,优先级高的优先发送,即先发送0x111。
下一章节我们将会讲解数据场中数据的解析。