CAN 数据帧是如何发送的,从高位先发还是低位?高位、低位又是什么?
如何进行位填充的?
每一位(bit)的时间段是 2 微秒么?在那个协议中定义的?
CAN 同步是如何搞的?
image.png
帧起始用于同步,如上图,相当于大家一起对表,之后按约定的时间间隔记录总线显隐性状态就可以了。

CAN 报文

Intel 格式 / Motorola 格式

DBC

解析 CAN 总线报文

从产品功能和性能测试的角度看,更需要知道总线中传输的数据内容,而不是 CAN 总线的实现原理。在实际测试中,可使用 Vector CANoe,周立功或其他设备读取目标 CAN 总线中传输的报文,再对照通信协议进行解析,最终得到目标数据的实际值。
CAN 报文一般包含 8 个字节(byte),1 个字节包含 8 个位(bit),即 1 byte = 8 bit。CAN 报文用二进制表示可用下图直观表达。image.png
上图中,一行对应一个字节,一列对应一个位。设备采集到的报文通常用十六进制数表示,解析时,首先转化为二进制数填入此表,再对应通信协议提取目标信号的二进制表示。
例,报文 ID:0xE2 的协议如下图所示。
image.png
设备采集到的 CAN 总线报文如下图所示。

报文 ID 报文长度 字节1 字节2 字节3 字节4 字节5 字节6 字节7 字节8
0E2 8 FE 1A 00 48 F4 00 00 00

将此条报文转化为二进制表示,如下图所示。
image.png
对照协议,表示信号 C_MAMode 的二进制数位于 bit_3(1),解析当前值为:HEX = 0x1 / DEC = 1,所以当前 C_MAMode = Enable。
表示信号 C_Throttle 的二进制数位于 bit_8 ~ bit_15(0001 1010),解析当前值为:HEX = 0x1A / DEC = 26,实际信号值 C_Throttle = 26 * 100 / 255 = 10.19。
image.png
Intel 和 Motorola 模式只有在跨字节解析时存在不同。例,有信号 X 占用 byte_1 和 byte_2,如下图:

报文 ID 报文长度 字节1 字节2 字节3 字节4 字节5 字节6 字节7 字节8
0x01 8 00 38 84 00 00 00 00 00

Intel 模式低位字节在上,所以该信号的起始位是 bit_8,结束位是 bit_22,长度为 15。二进制表示为 0000 0100 0011 1000,解析为 HEX = 438 / DEC = 1080。
image.png
Motorola 模式低位字节在下,信号的起始位是 bit_16,结束位是 bit_14,长度为 15。二进制表示为 0011 1000 1000 0100,解析为 HEX = 3884 / DEC = 14468。
image.png