Intel 格式与 Motorola 格式的区别
-CAN 总线信号的编码方式之我见
在进行 CAN 总线通信设计或者测试过程中,经常看到 CAN 总线信号的编码格式有两种定义:Intel 格
式与 Motorola 格式。究竟两种编码格式有什么样的区别呢?设计者、dbc 文件编辑者或者测试人员又该
如何判断两种格式,并进行有效正确的配置和解析呢?下面作者给出自己在设计和测试过程中的一点体
会和见解,希望能够总结出来加深一下印象和理解。
在编码优缺点上,Motorola 格式与Intel 格式并没有孰优孰劣之分,只不过根据设计者的习惯,由用
户自主选择罢了。当时,对于使用者来讲,在进行解析之前,就必须要知道编码的格式是哪一种,否则,
就不能保证正确地解析信号的含义。以下就以 8 位字节编码方式的 CAN 总线信号为例,详细分析一下
两者之间的区别。
首先,介绍一下 CAN 总线的数据传输规则,首先传输一个字节的高位(msb),最后传输该字节的
低位(lsb)。如下图所示。
bytex
bit(8*x+7)
msb
注:x=0,1,2,3……7
bit(8*x)
lsb
一般情况下,主机厂在定义 CAN 总线信号定义时,都会明确定义字节的发送顺序,即:以首先发
送 byte0(LSB),然后 byte1,byte2,……(MSB)的发送顺序;还是以首先发送 byte7(MSB),然后
byte6,byte5,……(LSB)的发送顺序。据作者了解到的多个主机厂定义的 CAN 总线字节发送顺序均
为前者(即:首先发送 LSB,最后发送 MSB)。这一点可以从目前主流的 CAN 总线信号数据库编辑器
德国 verctor 公司的 CANoe 软件工具的定义上看出,CANoe 中的 CANdb++编辑器中默认定义的 CAN 数
据场的字节结构及每一位的排布入下图所示。
在这种情况下,如果主机厂采用的是首先发送 LSB,最后发送 MSB 的发送顺序,则在上表中可直接按
照从左至右,从上至下的顺序依次对信号进行排布即可;但是,如果主机厂采用的是首先发送 MSB,最
后发送 LSB 的发送顺序,则在上表中需要从下至上,从右至左的顺序依次对信号进行排布,这样就比较
难以对应,而且信号与数据场各字节之间的映射关系也不太直观。所以,一般来讲,主机厂会采用首先
发送 LSB,最后发送 MSB 的发送顺序。
下面就以 CAN 总线报文的发送顺序为首先发送 LSB,最后发送 MSB 的方式为前提,介绍 Intel 格
式与 Motorola 格式这两种编码方式的不同之处。
一、 采用 Intel 格式编码
当一个信号的数据长度不超过 1 个字节(8 位)并且信号在一个字节内实现(即,该信号没有跨字
节实现)时,该信号的高位(S_msb)1 将被放在该字节的高位,信号的低位(S_lsb)2 将被放在该字节
的低位。这样,信号的起始位 3 就是该字节的低位。下图分别以 4 位和 8 位数据长度的两种信号为例进
行了说明,并给出了某一车型的通信矩阵 CANoe 中的 CAN 数据库实现的图片说明。
bit15
bit131
S_msb
Signal
4位数据长度的信号
举例
bit15
bit8
S_lsb
8位数据长度的信号
bit24
S_lsb
举例
bit31
1
byte1
S_msb
byte3
Signal
byte1
0
1
0
bit8
1
Signal的数据值为0x05
byte3
0
1
0
0
1
0
Signal的数据值为0xA5
bit24
1
当一个信号的数据长度超过 1 个字节(8 位)或者数据长度不超过一个字节但是采用跨字节方式实
现时,该信号的高位(S_msb)将被放在高字节(MSB)的高位,信号的低位(S_lsb)将被放在低字节
(LSB)的低位。这样,信号的起始位就是低字节的低位。对于一个信号的数据长度不超过一个字节,
但是采用跨字节方式实现的这种情况,因其对信号解析和编码以及信号完整性都存在不利因素,所以主
机厂在定义某一车型(系)的整车通信矩阵时,不太可能设计出这种编码结构。本文就不再考虑和分析
这种较为特殊的情况,但其原理与本文讨论的其他情况是相同的。下图分别以 12 位和 16 位数据长度的
两种信号为例进行了说明,并给出了 CANoe 中的某一车型的通信矩阵的 CAN 数据库的图片说明。
12位数据长度的信号
bit0
S_lsb
bit15
举例
Signal的数据值为0x6A5
byte0
lsb half of Signal
byte0
0
1
0
0
1
0
bit0
1
bit15
lsb half of Signal
byte1
bit11
S_msb
byte1
bit11
0
bit8
msb half of Signal
1
1
bit8
0
msb half of Signal
bit7
bit7
1
bit23
bit39
bit39
1
lsb half of Signal
bit23
0
1
0
lsb half of Signal
byte2
bit20
S_lsb
byte2
bit20
1
byte4
12位数据长度的信号
bit16
bit31
S_msb
举例
Signal的数据值为0x6A5
bit16
bit31
0
byte3
msb half of Signal
byte3
1
1
0
1
0
1
msb half of Signal
byte5
16位数据长度的信号
bit32
S_lsb
bit47
S_msb
bit24
bit24
0
bit40
bit40
0
lsb half of Signal
msb half of Signal
byte4
举例
Signal的数据值为0x36A5
byte5
0
1
0
0
1
0
bit32
1
bit47
0
0
1
1
0
1
1
lsb half of Signal
msb half of Signal
二、 采用 Motorola 格式编码
当一个信号的数据长度不超过 1 个字节(8 位)并且信号在一个字节内实现(即,该信号没有跨字
节实现)时,信号的高位(S_msb)将被放在该字节的高位,信号的低位(S_lsb)将被放在该字节的低
位。这样,信号的起始位就是该字节的低位。下图分别以 4 位和 8 位数据长度的两种信号为例进行了说
明,并给出了某一车型的通信矩阵在 CANoe 中 CAN 数据库实现的图片说明。
bit15
bit131
S_msb
Signal
4位数据长度的信号
举例
bit15
bit8
S_lsb
8位数据长度的信号
bit24
S_lsb
举例
bit31
1
byte1
S_msb
byte3
Signal
byte1
0
1
0
bit8
1
Signal的数据值为0x05
byte3
0
1
0
0
1
0
Signal的数据值为0xA5
bit24
1
当一个信号的数据长度超过 1 个字节(8 位)或者数据长度不超过一个字节但是采用跨字节方式实
现时,该信号的高位(S_msb)将被放在低字节(MSB)的高位,信号的低位(S_lsb)将被放在高字节
(LSB)的低位。这样,信号的起始位就是高字节的低位。对于一个信号的数据长度不超过一个字节,
但是采用跨字节方式实现的这种情况,因其对信号解析和编码以及信号完整性都存在不利因素,所以主
机厂在定义某一车型(系)的整车通信矩阵时,不太可能设计出这种编码结构。本文就不再考虑和分析
这种较为特殊的情况,但其原理与本文讨论的其他情况是相同的。下图分别以 12 位和 16 位数据长度的
两种信号为例进行了说明,并给出了 CANoe 中的某一车型的通信矩阵的 CAN 数据库的图片说明。
byte0
12位数据长度的信号
bit0
bit15
msb half of Signal
lsb half of Signal
举例
Signal的数据值为0x6A5
byte0
1
1
0
1
0
1
bit0
0
bit15
0
1
0
msb half of Signal
lsb half of Signal
12位数据长度的信号
bit16
bit31
byte2
bit19
S_msb
byte1
bit12
S_lsb
byte1
bit12
1
byte3
msb half of Signal
lsb half of Signal
举例
Signal的数据值为0x6A5
byte3
bit19
0
1
1
bit16
0
bit31
1
0
1
0
0
1
0
msb half of Signal
lsb half of Signal
16位数据长度的信号
bit32
bit47
byte5
byte2
byte4
bit7
S_msb
bit7
0
bit23
bit23
bit39
S_msb
msb half of Signal
lsb half of Signal
byte4
举例
Signal的数据值为0x36A5
byte5
bit39
0
0
1
1
0
1
1
bit32
0
bit47
1
0
1
0
0
1
0
bit8
bit8
bit24
S_lsb
bit24
1
bit40
S_lsb
bit40
1
msb half of Signal
lsb half of Signal
由上,可以看出,当一个信号的数据长度不超过 1 个字节(8 位)时,Intel 与 Motorola 两种格式的
编码结果没有什么不同,完全一样。当信号的数据长度超过 1 个字节(8 位)时,两者的编码结果出现
了明显的不同。