CAN报文DBC详解及CAN字节序:Intel(小端)和Motorola(大端)

CAN DBC文件与字节序详解

一、基础概念

LSB: Least Significant Bit,最低有效位,二进制数中权重最小的位;

MSB:Most Significant Bit,最高有效位,二进制数中权重最大的位;

DBC:Database Can,描述CAN网络节点间数据通讯的一种文件,可以定义和解析CAN消息的帧结构和信号;

二、创建DBC

1、使用dbc编辑软件

        我这里使用的是vector的工具CANoe,配合CANoe一起使用的CANdb++ editor,是一款专门用来编辑DBC文件的软件。Vector系列的工具和软件功能十分强大,但是就是很Expensive,不过软件是免费的,只是用来查看文件的话没问题,只有需要仿真,搭建工程的时候才必须需要配套的硬件工具。

点击CANdb++ Editor

2、新建DBC文件

点击"File"——>"Create DataBase",或出现模板选择,我们这里选择CAN_FD Template.dbc。

新建的文件(test.dbc)打开如下,此时没有定义任何数据和信号:

3、创建网络节点

一个CAN网络中,会有很多的节点,每一个节点都会发送或者接收数据,DBC需要可以解析自己发出和其他节点发来的数据,此时需要在DBC中建立不同的节点,用以区分来源,

建立了两个节点Node1和Node2。

4、新建消息(message)

节点都建立好了,需要建立帧消息,这里需要定义清楚ID,DLC

数据于节点关联。我这里将这个数据月Node1关联,找到Network nodes,双击Node1,选择TxMessages,选择刚才创建的message,点击OK

关联成功

5、创建信号

此时message创建好了,但是数据没有信号,那么这个消息就没有意义,

在overall View界面,点击Signals——>New新建信号

例如,这里我们位上面建的数据366建一个信号,长度2bit,单位可以不填,字节序我们选择Motorola)(Intel和Motorola格式后面详细解释),然后就是精度,偏移量,最大最小值得定义没,最后点击确定即可创建成功;这些在制作DBC之前,一般会输入一个通信矩阵表格,具体配置按照表格进行选择就行;可以看到value table那一栏是none空的,下一段讲解这个

将上面创建的Message于这个信号关联。找到我们创建的Msg_Tx1(0x366),点击Signals——>Add,选择工程建的信号,点击确定

看Msg的Layout这一页,已经将这个2bit的信号添加到这个8byte消息的矩阵中去了,占据是的是字节0的6、7bit位

这时候可以调整信号在矩阵中的位置,如下图点击

修改StartBit,我这里改为8,看看效果;

看Msg的Layout这一页,已经将这个2bit的信号的位置变成了字节1的0、1bit位了,这两位在整个8byte(64个bit)数据矩阵中是8、9位

6、创建数值表

什么是数值表,就是用来解释信号值含义的表。例如一个信号有0,1,2,这四个数字,这是就需要数值表来解释这个四个数字各自代表什么含义。

点击菜单栏"View"——>"Value Tables"可打开

右键,选择New新建,为刚才创建的信号建数值表

点击Add,由于这个信号只有2bit,所以取值范围是0、1、2,对三个取值分别添加描述

将信号于数值表关联。在Signals栏点击信号Tx1_366_1,选择刚才创建的数值表,点击确定

关联成功

7、信号解析

这是将DBC导入CANoe的仿真测试工程后,就可以依托我们创建的DBC来解析对应的数据了,由于我们在DBC中只为ID366这一帧定义了一个信号Tx1_366_1(占据两个bit),所以我们的DBC只能解析这两位的数据,实际运用中肯定不止一个信号。

小结

到这里,DBC文件的创建,网络节点的创建,Message的创建,Message与网络节点的关联,Message中信号的创建与关联,信号与数值表的关联都讲完了。按照上面的思路,可以创建更多的节点,可以为每个节点创建大量的Message、Signals及描述。

三、字节序详解(Intel、Motorola)

我再创建一个消息Msg_Tx2(367),用这个消息来讲解这两种格式

然后给这个消息创建信号

第一个信号Tx2_367_1:长度8bit、Intel格式

第二个信号Tx2_367_2:长度8bit、Motorola格式

第三个信号Tx2_367_3:长度16bit、Intel格式

第四个信号Tx2_367_4:长度16bit、Motorola格式

第五个信号Tx2_367_5:长度10bit、Intel格式

第六个信号Tx2_367_5:长度10bit、Motorola格式

详细的创建过程这里不再详述了,和上面的流程一样。

注意:一个数据库中的信号格式一般只能选择一种,要么Intel,要么Motorola;一般不可以并存,这里是我为了方便讲解,才混用的,实际开发中一定要避免混用

如下图:已经将所有的信号条件到这个消息的矩阵布局表中了

1、信号不跨字节

如下图,信号1是Intel格式,信号2是Motorola格式。当信号不跨字节时,这种情况最简单,两种格式没区别,就是LSB在低bit位,MSB在高bit位

2、信号跨字节

如下图,以信号3、4、5、6为例,这四个信号都跨字节,信号3、4占据的两个完整字节,信号5、6则是两个字节各自占据一部分,同颜色表示同一个信号;

信号3是Intel格式:       信号的LSB在低字节(byte2)的低位,MSB在高字节(byte3)的高位;

信号4是Motorola格式:信号的LSB在高字节(byte5)的低位,MSB在低字节(byte4)的高位;

信号5是Intel格式:       信号的LSB在低字节(byte6)的低位,MSB在高字节(byte7)的高位;

信号6是Motorola格式:信号的LSB在高字节(byte9)的低位,MSB在低字节(byte9)的高位;

3、总结

不管是Intel模式,还是Motorola模式,起始位都是该信号的LSB

信号不跨字节:两种格式一样

跨字节:

Intel格式(小端):       LSB在低字节的低位,MSB在高字节的高位

Motorola格式(大端):LSB在高字节的低位,MSB在低字节的高位

评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值