CAN报文的数据库中能够看到byte order字段,可以选择Intel或者Motorola两种格式。林林总总的也大概了解到一下LSB、MSB等概念以及两者的传输过程。通过数字顺序、符合阅读顺序或者正读反读之类的去解释大端和小端,当时看可能了解了,但到了实际数据库中又理不清到底怎么正读反读,特别是跨字节信号。因此,本文通过实际的DBC分析和项目应用相结合,系统性的梳理清楚CAN信号排布方式Intel(小端)和Motorola(大端)格式的区别。

一、基本概念

LSB:Least Significant Bit最低有效位,MSB:Most Significant Bit最高有效位,两者并不代表传输顺序,只是二进制数的两个bit位。从标准UART 数据传输格式的字节域中可以明显看到LSB和MSB仅代表两个bit,至于具体的信号传输方式,就是接下来要讲的Intel和Motorola格式,又称小端和大端格式。
在这里插入图片描述

二、Intel小端传输

要点LSB在低字节的低位,MSB在高字节的高位。

1.信号不跨字节

如下图框选区域信号为例,Intel小端按照LSB在低字节的低位:Byte1的Bit0; MSB在高字节的高位:Byte1的Bit7。读取信号二进制值为01000110(十六进制:0x46)。
在这里插入图片描述

2.信号跨字节

如下图,Intel小端按照LSB在低字节的低位:Byte4的Bit0; MSB在高字节的高位:Byte5的Bit7。读取信号二进制值为01000110 10010111(十六进制:0x4697)。
在这里插入图片描述

三、Motorola大端传输

要点LSB在高字节的低位,MSB在低字节的高位。

1.信号不跨字节

如下图框选区域,Motorola大端按照LSB在高字节的低位:Byte1的Bit0; MSB在低字节的高位:Byte1的Bit7。读取信号二进制值为01000110(十六进制:0x46)。
在这里插入图片描述

2.信号跨字节

如下图框选区域,Motorola大端按照LSB在高字节的低位:Byte5的Bit0; MSB在低字节的高位:Byte4的Bit7。读取信号二进制值为01000110 10010111(十六进制:0x4697)。
在这里插入图片描述
有什么区别呢?大端小端读出来不都是01000110 10010111(十六进制:0x4697)吗?但是请注意字节在内存中的排列方式完全不同。

  • 大端:低位10010111(0x97)在内存的高地址区(byte5);高位01000110(0x46)在内存的低地址区(byte4)。
  • 小端:低位10010111(0x97)在内存的低地址区(byte4);高位01000110(0x46)在内存的高地址区(byte5)。

错误举例:
在这里插入图片描述
如上图,假如把小端排布的bit位错读成大端,那么读取到的值为10010111 01000110(十六进制:0x9746),信号值的含义完全不同。

从上面的介绍可以得出几点结论:
1、不管是Intel模式,还是Motorola模式,起始位都是该信号的LSB。
2、信号不跨字节的情况下,Intel和Motorola格式编码结果没有区别。注意是不跨字节,而不是小于8个bit。即使信号只有2个bit,也可能存在跨字节的情况。如下图
在这里插入图片描述

延伸
1.一个DBC数据库中信号排布方式只能选择一种。要么全是Intel,要么全是Motorola,一般不会出现两者并存在一个数据库中。
2.LIN的数据库LDF中信号排布方式默认为Intel,不可修改。

四、项目场景

在实际项目上,如果需要进行仿真数据加解密的过程(比如仿真数字钥匙解闭锁车辆),那么掌握大端和小端传输将有助于仿真实现。根据输入数据的大端or小端格式进行对应格式的解密才能读取到正确的信息。而如果数据传输格式不匹配,将无法实现。包括在HIL仿真建模的过程中若涉及数据传输也应该在了解信号排布方式的前提下进行建模。


总结

结合大端小端的定义,在DBC数据库中新建信号来梳理Intel和Motorola传输格式的区别不失为一种好的了解方式。理清了LSB、MSB、Intel和Motorola,能够举一反三的理解其他的字节序和位序的数据传输的具体实现。

Logo

AtomGit 是由开放原子开源基金会联合 CSDN 等生态伙伴共同推出的新一代开源与人工智能协作平台。平台坚持“开放、中立、公益”的理念,把代码托管、模型共享、数据集托管、智能体开发体验和算力服务整合在一起,为开发者提供从开发、训练到部署的一站式体验。

更多推荐