推荐阅读(单击下方文字即可跳转至对应博文):
1、【DBC专题】-1-如何使用CANdb++ Editor创建并制作一个DBC
2、【DBC专题】-2-CAN Signal信号的Multiplexor多路复用在DBC中实现
3、【DBC专题】-3-利用CANdb++ Editor在DBC文件添加帧CAN_ID和信号CAN_Signal
4、【DBC专题】-5-DBC文件格式解析
5、【DBC专题】-6-Signal信号字节顺序Motorola_LSB/MSB/Sequential/Backward,Intel_Standard/Sequential等6类格式详解
关键字
:
Intel
: Little endian小端
Motorola
: Big endian大端
Start Bit
:CAN信号的起始位
Byte order
:字节顺序
Message/CAN_ID中的Signal信号的“Byte order字节顺序”有两种模式:
Intel
和
Motorola
。在排列方式上,
Intel
模式和
Motorola
模式没有孰优孰劣之分
,只不过是设计者的习惯。
一般情况下,发送CAN信号时,首先发送Byte0,然后Byte1,Byte2,....Byte7顺序发送,其位的编号可以参照CANdb++ Editor的Layout子选项卡中CAN数据域分布,见如图0-1。
右下角的
Inverted
一般默认不勾选,符合正常的二进制阅读习惯
。若勾选右下角的Inverted,其显示的位排列是相反的。
在这种情况下,
首先发送
Byte0
,最后发送
Byte7
的发送顺序
,则在上图中可直接按照
从左至右,从上至下
的顺序依次对信号进行排布即可
。
下面介绍Intel 格式和Motorola 格式这两种“字节顺序”排列的不同之处。
1
小端(Intel)编码格式
1.1 Signal信号不跨字节
信号在一个字节内实现(信号没有跨字节)时
,该
信号的高位(
MSB
)放在该字节的
高位
,该
信号的低位(
LSB
)放在该字节的
低位
(见图1-1)。
起始位
在该信号的低位(
LSB
)
(见图1-2)。
1.2 Signal信号跨字节
信号在多个字节内实现(信号跨字节)时
,该
信号的高位(
MSB
)放在
高字节
的高位,
该
信号的低位(
LSB
)放在
低字节
的低位
(见图1-3)。
起始位
在该信号的低位(
LSB
)
(见图1-4)。
2.1 Signal信号不跨字节
信号在一个字节内实现(信号没有跨字节)时
,该
信号的高位(
MSB
)放在该字节的
高位
,
该
信号的低位(
LSB
)放在该字节的
低位
(见图2-1)。
起始位
在该信号的低位(
LSB
)
(见图2-2)。
2.2 Signal信号跨字节
信号在多个字节内实现(信号跨字节)时
,该
信号的高位(
MSB
)放在
低字节
的高位,
该
信号的低位(
LSB
)放在
高字节
的低位
(见图2-3)。
起始位
在该信号的低位(
LSB
)
(见图2-4)。
当
信号在一个字节内实现(信号不跨字节)
时,Intel模式和Motorola模式的信号字节顺序,完全一样:
信号的高位(
MSB
)放在该字节的
高位
,
信号的低位(
LSB
)放在该字节的
低位。
当
信号在多个字节内实现(信号跨字节)
时,Intel模式和Motorola模式的信号字节顺序,明显不同:
-
Intel模式
:
信号的高位(
MSB
)放在
高字节
的高位,信号的低位(
LSB
)放在
低字节
的低位;
-
Motorola模式
:
信号的高位(
MSB
)放在
低字节
的高位,
信号的低位(
LSB
)放在
高字节
的低位
。
俗称:小端模式“高在后,低在前”;大端模式“高在前,低在后”。
另:不管是
Intel
模式,还是
Motorola
模式,
起始位
都该信号的低位(
LSB
)。
目录0 引言1 小端(Intel)编码格式1.1 Signal信号不跨字节1.2 Signal信号跨字节2 大端(Motorola)编码格式2.1 Signal信号不跨字节2.2 Signal信号跨字节3 小结推荐阅读:1、【DBC专题】-1-如何使用CANdb++ Editor创建并制作一个DBC2、【DBC专题】-2-CAN Signal信号的Multiplexor多路复用在DBC中实现3、【DBC专题】-3-利用CANdb++ Editor在DBC文..
我之前写过好几篇文章
介绍
大端小端的存储、显示和读取。在
介绍
DBC
的文章
中
,也有
信号
在CAN消息数据
中
如何定义的
顺序
,它和大端小端采用的原理相同,但是不能带入数据大端小端存储的方法。这里千万要注意!
DBC
数据库
中
定义
信号
时采用的
字节
顺序
,如果想讲明白,很简单。但是如何讲明白的同时,还能通俗易懂,让人容易记住,这是我一直思考的问题!之前看过几篇别人写的
介绍
信号
字节
顺序
的文章,怎么说呢?不那么通俗易懂,尤其对于初学者来说,太八股文了,今天尝试以我的角度解读
信号
的
字节
顺序
。这篇文章,我打算通过:画图、举例与分
在这份教程的第一部分,我们提到没有CAN数据库,CANoe还不能工作。在第二部分,我们来看看CAN数据库是怎样的。通过CANoe的Tools菜单,或者从开始菜单打开Vec
tor
的CAN数据库编辑器——CANdb++ Edi
tor
。
CAN总线上有4种报文:
本篇只描述
Mo
tor
ola
格式
的
字节
排序方式,
Intel
格式
的不作
介绍
。
首先以下面的表格来表示
字节
顺序
和位
顺序
,用红色背景表示高位MSB,蓝色背景表示地位LSB,绿色为LSB到MSB的过渡。
下面以起始位位34,长度位12的
信号
来做演示来区分
Mo
tor
ola
Forward MSB和
Mo
tor
ola
Forward LSB的区别
Mo
tor
ola
Forward MSB(大端在前):
矩阵文档
中
起始位置则为MSB的起始位为34,往高
字节
借位。
填入填入0xB79,即101101111001,如下图:
在
DBC
文件
中
,CRC-16/CCITT-FALSE通常用于校验消息或
信号
的数据完整性。下面是在
DBC
文件
中
计算CRC-16/CCITT-FALSE的步骤:
1. 初始化一个16位寄存器,初始值为0xFFFF。
2. 将消息或
信号
的数据按
字节
进行处理。
3. 对每个
字节
,将其与寄存器的低8位进行异或运算。
4. 将寄存器向右移一位。
5. 如果异或运算的结果为1,则将寄存器与特定的生成多项式(0x1021)进行异或运算。
6. 重复第3至第5步,直到所有
字节
都被处理完毕。
7. 最后,寄存器
中
的值就是计算得到的CRC-16/CCITT-FALSE校验码。
需要注意的是,在计算CRC时,
字节
的
顺序
可能会影响最终的校验码结果。有些
DBC
文件
可能要求
字节
顺序
进行翻转,所以在实际应用
中
,您需要参考具体的
DBC
文件
规范以及相关文档来正确计算CRC-16/CCITT-FALSE校验码。
希望这个回答能够帮助您理解在
DBC
文件
中
计算CRC-16/CCITT-FALSE的方法。如果您有任何进一步的问题,请随时提问。