CAN总线字节序

 

前言:文中说的低地址和高地址的区别是低地址为先发数据,高地址是后发数据

1.位序和字节序(这一段是网上找的)

汽车行业的工程师,尤其是从事软件、标定、测试等相关工作的,肯定对 CAN 报文的解析比较熟悉。解析前首先要确认 CAN 信息的顺序,否则遇到跨字节的信息,得到的结果就完全错了。

无论是标准帧还是扩展帧,其数据域(题图的 Data 部分,红色标识)最长为 8 字节,报文所包含的主要信息就包含其中,需要按照既定的协议解析,这也是汽车工程师最关心的内容。

首先说两个概念:位序(bit order)和字节序(byte order)。

顾名思义,位序就是“位”的顺序,字节就是“字节”的顺序。为了区分,位序用小写字母表示,字节序用大写字母表示。

这里的“序”有两种:大端模式和小端模式。比如我们平时用的十进制数字 123,“1”是高位,“3”是最低位。如果在内存中的地址是从左到右的话,即低地址存储的是高位,就是大端模式,反之就是小端模式。从 CAN bus 角度说,就是先发高位还是低位,道理是一样的。

所以,位序和字节序都有大端和小端,共有四种:

  • msb: most significant bit
  • lsb: least significant bit
  • MSB: Most Significant Byte
  • LSB: Least Significant Byte

CAN 总线协议中规定,位序都是大端模式,即 msb first,因此不需要区分。但对字节序没有规定,就出现了两种情况:Motorola 和 Intel 格式。

先上结论:

Motorola 格式是 MSB

Intel 格式是 LSB

如果某个信息在占据一个字节,不涉及字节的顺序,Motorola 和 Intel 是一样的。

而涉及到跨字节的信息,两者就完全不同了。

如果某个信息占据了 Byte0 和 Byte1 两个字节,Motorola 是 MSB,先发高位(即 Byte0 就是高位),所以其解析的顺序是 Byte0 Byte1,而 Intel 恰好是反过来:Byte1 Byte0

 

2.CAN 总线的传输字节序

CAN 总线上位序都是大端模式(msb),字节序可选,可以是Intel(LSB )或者是Moto(MSB)

DBC 上的标号其实是Intel,但是当有具体信号时,DBC会有msb和lsb的标注。

Can总线上数据的传输序从第0字节发送,到第7字节结束字节序是

第0字节 第1字节 第二字节 第三字节 …….第7字节

字节内部从高位发

第0字节:第7位 第6位 第5位…第0位

顺序和DBC中的Layout 一样

 

 

 

 

所以总线上的发送位顺序位:

7 6 5 4 3 2 1 0 15 14 13 12 11 10 9 8 23 22 21 20 19 18 17 16………57 56

CANoe上读取总线数据显示按字节显示.

如0 位 8位 16位 24位 32位 40位 48位和56位为1其他位为0,那么总线上的数据为:

0000000100000001000000010000000100000001000000010000000100000001

CANoe上显示为:

0x01 01 01 01 01 01 01 01

如第1位和第4位为1,那么总线数据为:

0001000100000000000000000000000000000000000000000000000000000000

CANoe上显示为:

0x11 00 00 00 00 00 00 00

 

3.收数据

 

1)总线数据占位相同,接收节点数据占位相同,字节序不同(该情况可能性较小)

Intel字节序是低字节存放低地址,高字节存放高地址

如下图所示

 

 

 

 

收到数据后认为数据是39 38 37 36 35 34 33 32 31 30 29 28 27 26 25 24(位序为大端)

如果28位、25位、38位和35位为1,其余位为0,CANoe上数据为,

0x00 00 00 12 48

节点接收到这个信号的数据为0x48 12

如果motorola字节序也占了相位置,

 

 

 

 

 

收到数据后认为数据是31 30 29 28 27 26 25 24 39 38 37 36 35 34 33 32(位序大端)

如果28位、25位、38位和35位为1,其余位为0,CANoe上数据为,

0x00 00 00 12 48

节点接收到这个信号的数据为0x12 48

2)总线数据占位相同,接收节点位置定义因为字节序导致错误

Startbit:46 length:16 motorola字节序占位如下

 

 

 

Startbit:46 length:16 Intel字节序占位如下

 

 

 

所以如果接收端把字节序设错,可能导致取得数据就是错的位置上的数据

3)如果信号占位在一个字节内且占位相同,那么读取的这个信号值没有区别09

4.发数据

发端数据错误同理

 

 

5Motorola的MSB和LSB模式

Motorola的MSB和LSB模式的区别只有一个,那就是Startbit是MSB还是LSB。

如果Startbit是MSB就是MSB模式,如果如果Startbit是LSB就是LSB模式

MSB:startbit:41

 

 

 

 

 

 

 

 

 

 

LSB:startbit:58

 

 

 

 

 

 

 

posted @ 2021-10-31 10:09  mghhz816  阅读(3419)  评论(5编辑  收藏  举报