CAN总线字节序

CAN总线格式

CAN-Frame_mit_Pegeln_mit_Stuffbits.svg.png

IDENTIFIER
The IDENTIFIER’s length is 11 bits. These bits are transmitted in the order from ID-10 to
ID-0. The least significant bit is ID-0.
DATA FIELD
The DATA FIELD consists of the data to be transferred within a DATA FRAME. It can
contain from 0 to 8 bytes, which each contain 8 bits which are transferred MSB first.

从CAN总线的规范可以看出,总线的位序(bit order)msb first,大端模式,也称为递减位序(Decreasing bit order)。

msb lsb

但是总线没有规定DATA FIELD的字节序,这是上层协议的范畴。

Motorola格式与Intel格式

在进行CAN总线通信设计时,对CAN总线信号有两种编码格式:Motorola与Intel格式。
两者并无优劣之分,只是设计者的习惯选择。
一般情况下,主机厂在定义CAN总线信号时,会明确定义字节的发送顺序,LSB(byte)先发,还是MSB先发。

Motolora格式(big endian)

MSB LSB

Intel格式(little endian)

LSB MSB

位计数的方法

锯齿(Sawtooth)法

7 6 5 4 3 2 1 0 15 14 13 12 11 10 9 8

发送一个8字节的数据到总线上,bit7(msb of Byte0)最先发送,接着是bit6,bit56(lsb of Byte7)最后发送。

顺序(Sequential)法

0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15

发送一个8字节的数据到总线上,bit0(msb of Byte0)最先发送,接着是bit2,bit63(lsb of Byte7)最后发送。

CANoe中一般用锯齿法。
而对于跨字节的数据,CANoe表示格式(这两种格式只针对字节序,位序总是msb first的):

  • Intel格式(LSB first)的lsb从低字节地址的低位地址开始,向左排布,msb在高字节地址的高位地址
  • Motorola格式(MSB first)的lsb从高字节地址的低位地址开始,向左排布,msb在低字节地址的高位地址。

实际总线传输按照msb first,从Byte0的bit7开始,bit6, …, 到Byte1的bit15,bit14, … , 到Byte7的bit63, … , bit62, …, bit56.

Intel_Motorola_format_in_CANoe.png

start bit总是指lsb的位置,然后向左排布,需要跨字节时:Intel格式从Byte0向Byte7的方向排布,Motorola格式从Byte7向Byte0的方向排布。

缩写:

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

Reference:

  1. CAN Bus wiki
  2. CANoe help