一、原理
1.1.CAN总线数据传输的规则
对于CAN协议,一般有两种编码格式:Intel 格式和Motorola格式。使用CAN之前,首先知道协议采用的是哪种格式,否则传输的数据有可能不是想要的效果。
一般情况下,对于一个字节的传输,CAN通常是先传输该字节的低位(Lsb),然后传输其高位(Msb)。如果一个信号只有8位(一个字节),那么不管是采用Intel 格式还是Motorola格式,它的传输方式都是一样的;如果要传输的信号超过一个字节,那么就要看采用哪种编码方式了。
如下图所示,CAN协议定义CAN报文BYTE与BIT顺序。
正常情况下,每帧CAN数据最大有8个字节(如上图中从上到下依次是BYTE0,BYTE1……BYTE7),在解析信号时,只有在这个信号跨字节时,才能看到Intel 格式和Motorola格式的差别。
1.2.Intel 格式和Motorola格式
1.2.1.区别
1.Intel 格式:同小端,低字节在前
Intel格式跟小端格式一样,低地址代表低字节,高地址代表高字节。比如一个信号Intel,它的起始位为3,长度为10,在dbc中它的排列顺序如下所示:
信号Intel = (byte0 >> 3) + (byte1 << 5),lsb表示低字节,msb表示高字节
其中(byte0 >> 3)为低字节的值,(byte1 << 5)为高字节的值
2.Motorola格式:同大端,高字节在前
Motorola格式跟大端格式一样,低地址代表高字节,高地址代表低字节。
与Intel不一样,Motorola格式有2种表达方式,一种是Motorola_LSB,另一种是Motorola_MSB,但实际上它们代表的数据结构是一样的,只是表达方式不一样而已.
其中Motorola_LSB的起始位是从低字节开始的,而Motorola_MSB的起始位是从高字节开始的。
在dbc中,只有Motorola_LSB的表达格式,没有Motorola_MSB的表达格式,比如一个Motorola_LSB的信号MotorolaSignal,其起始位为10,长度为10,在dbc中,其排列顺序如下所示:
例如:已知某报文start bit:10、signal size :2、value:0x3
1.数格子,找位置
找到start bit:10在表格中的位置
2.看占位
从start bit开始从右往左数signal size个格子
3.将value:0x3转换成二进制,BIN(3)=11
4. 四位为一个整体,将11放入刚刚数的格子里,即(0000 1100)
5.转换成16进制,BIN(1100)=HEX(0C)
6.byte数对应为1,即位置在D1上,即(00 0C 00 00)