CAN总线字节序

您所在的位置:网站首页 CAN报文中高低字节顺序 CAN总线字节序

CAN总线字节序

2024-07-16 06:23| 来源: 网络整理| 查看: 265

 

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

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 一样

 CAN总线字节序_大端模式

 

 

 

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

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字节序是低字节存放低地址,高字节存放高地址

如下图所示

 CAN总线字节序_汽车行业_02

 

 

 

收到数据后认为数据是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字节序也占了相位置,

CAN总线字节序_字节序_03

 

 

 

 

 

收到数据后认为数据是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字节序占位如下

 CAN总线字节序_数据_04

 

 

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

 CAN总线字节序_字节序_05

 

 

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

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

4.发数据

发端数据错误同理

 

 

5Motorola的MSB和LSB模式

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

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

MSB:startbit:41

 CAN总线字节序_大端模式_06

 

 CAN总线字节序_字节序_07

 

 CAN总线字节序_数据_08

 

 

 

 

 

LSB:startbit:58

 

 CAN总线字节序_汽车行业_09

 

 CAN总线字节序_汽车行业_10

 

 CAN总线字节序_汽车行业_11

 



【本文地址】


今日新闻


推荐新闻


CopyRight 2018-2019 办公设备维修网 版权所有 豫ICP备15022753号-3