参考博客:Intel格式与Motorola格式的区别。
主要是对上面提到的博客做下笔记,结合其他文章,转化为自己的理解写下来。(注:直接阅读链接博客时,请结合评论内容理解,博客内使用的图片有误。)
1.多数厂商定义的CAN总线字节发送顺序均为先发送LSB,最后发送MSB。即:首先发送byte0(LSB),然后byte1,byte2,……(MSB)的发送顺序。
(链接博客有人指出:主机厂发送CAN报文数据从byte0~byte7,并不是针对信号的,而是针对CAN2.0规范,CAN2.0报文格式和时序就是从byte0到byte7。byte0可以理解成低字节地址,byte7理解成高字节地址。)
CAN数据段中每个字节传输顺序是:首先传输一个字节的高位msb,最后传输该字节的低位lsb。(7…0,…,63…56)
2.当一个信号的数据长度不超过 1 个字节(8 位)时,Intel 与 Motorola 两种格式的编码结果没有什么不同,完全一样。
3.Intel 格式
信号的高位(S_msb)将被放在高字节(MSB)的高位,信号的低位(S_lsb)将被放在低字节(LSB)的低位。这样,信号的起始位就是低字节的低位。
对博客中使用的图片示例进行标注。
先看一个16位数据长度的信号。信号数据为0x36A5,在CAN的低字节填入0xA5,在CAN的高字节填入0x35。
信号数据为0x6A5,起始位为0,长度为12。填入过程:
起始位0即byte0的bit0,信号长度为12,也就可以得出,信号会使用byte0的8个bit+byte1的4个bit。byte0字节填入信号的低字节,即0xA5,byte1字节填入信号的高字节,即0x6。
4.Motorola 格式
信号的高位(S_msb)将被放在低字节(MSB)的高位,信号的低位(S_lsb)将被放在高字节(LSB)的低位。这样,信号的起始位就是高字节的低位。
同样先看一个16位数据长度的信号。信号数据为0x36A5,在CAN的低字节填入0x35,在CAN的高字节填入0xA5。
发送数据为0x6A5,起始位为12,长度为12。填入过程:
起始位12即byte1的bit4,信号长度为12,也就可以得出,信号会使用byte1的4个bit+byte0的8个bit。byte0字节填入信号的高字节,即0x6A。byte1字节填入0x5。
总的来说:
一、Intel(小端)低字节LSB在前,高字节MSB在后。
二、Motorola(大端)高字节MSB在前,低字节LSB在后。