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在低字节的低位:Byte3的Bit0; MSB在高字节的高位:Byte3的Bit7。读取信号二进制值为00001111。
2.信号跨字节
信号跨字节的情况,往往认为信号长度大于8个bit,这个不一定。为了讲解清楚这一点,下图制作的数据库信号长度为4bit且跨字节。如下图框选区域,Intel小端按照LSB在低字节的低位:Byte3的Bit6; MSB在高字节的高位:Byte4的Bit1。读取信号二进制值为0011。
三、Motorola大端传输
要点:LSB在高字节的低位,MSB在低字节的高位。
1.信号不跨字节
如下图框选区域,Motorola大端按照LSB在高字节的低位:Byte3的Bit0; MSB在低字节的高位:Byte3的Bit7。读取信号二进制值为00001111。
2.信号跨字节
如下图框选区域,Motorola大端按照LSB在高字节的低位:Byte4的Bit6; MSB在低字节的高位:Byte3的Bit1。读取信号二进制值为1100。
从上面的介绍可以得出几点结论:
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,能够举一反三的理解其他的字节序和位序的数据传输的具体实现。