前言:
之前的工作中,其实对Motorala和inter格式并不是了解的十分透彻。最近由于工作需要,研究了一下这两种格式,发现里面的门道其实挺复杂的。
特此作了一些总结:和大家一起分享。
我查了不少文档,描述其实条理并不是特别清晰。容易让人产生一种混乱的感觉,本质上是没有抓住很多初学者的痛点。本文第一第二节先不讲两种格式,而是先理清最基本的问题。
1:了解CAN发送的bit时序和Byte时序
1.1 Byte发送时序
目前所有的CAN协议,所有的CAN收发器,都是按一个顺序发送:即先发送低字节Byte0-》Byte2->Byte3.....Byte7(CANFD,还能拓展到Byte64)。记住所有的都这样。
1.2 bit发送时序
一个Byte包含7个bit,那么先发送bit7,还是先发送bit0?,目前两种方法均可以(不过需要注意的是,无论是先发送bit7还是bit0,仲裁段都是先发送bit高位)。
从图中可以看出:
第一种情况,先发bit7-》bit0-》bit15-》bit8.。。。
第二种情况,先发bit0-》bit7—》bit8——》bit15
切记这两种,对后续理解6种起始位的计算非常重要
结合CANdb++或CANdb—admin工具,默认是采用先发送bit7。如果需要先发送bit0。则需要如下设置。如图
或者在seting界面勾选
则就能匹配bit0先发的机制。
2:了解signal中的MSB和LSB
需要注意的是,我们通常的思维是,将signal带入到Message中,暂时不要这么干,容易引起思维上的混乱。先只看signal。
MSB就代表信号的高bit位,LSB表示低bit
3:Motorala和inter格式对跨字节信号的处理
我们知道上面提到的Vehicle_Speed信号一个Byte肯定放不下,需要跨字节存放。
很多资料都用一句话总结:"Inter低放低,高放高,Motorola是高放低,低放高"。红色的字表示Signal中的MSB和LSB。黄色字表示的是Message(即帧)中的Byte
如下图,
Inter格式
Motorola格式
这个好理解,不会的多查点资料!!不再赘述。。。。
接下来就是重点
4:6种方法对Startbit的判定
4.1 motorala的四种格式
起始位9bit
这个非常特殊,需要吧信号按照镜像折叠,即像下图
把LSB向上移动,msb向下移动,然后按移动后的LSB算起始位
上面的Vehicle_Speed所处Message是8个Byte,就按图示方法变换位置,最后按变换后的LSB位置计算Startbit。
查看结果:
这表示,猜想正确。
4.2 Inter的两种格式
起始位12bit
起始位11bit
4:6种起始位的计算方式和bit发送顺序的关系
sequence,一定要匹配bit0先发
其他4中都是bit7位先发