前言:文中說的低地址和高地址的區別是低地址為先發數據,高地址是后發數據
1.位序和字節序(這一段是網上找的)
汽車行業的工程師,尤其是從事軟件、標定、測試等相關工作的,肯定對 CAN 報文的解析比較熟悉。解析前首先要確認 CAN 信息的順序,否則遇到跨字節的信息,得到的結果就完全錯了。
無論是標准幀還是擴展幀,其數據域(題圖的 Data 部分,紅色標識)最長為 8 字節,報文所包含的主要信息就包含其中,需要按照既定的協議解析,這也是汽車工程師最關心的內容。
首先說兩個概念:位序(bit order)和字節序(byte order)。
顧名思義,位序就是“位”的順序,字節就是“字節”的順序。為了區分,位序用小寫字母表示,字節序用大寫字母表示。
這里的“序”有兩種:大端模式和小端模式。比如我們平時用的十進制數字 123,“1”是高位,“3”是最低位。如果在內存中的地址是從左到右的話,即低地址存儲的是高位,就是大端模式,反之就是小端模式。從 CAN bus 角度說,就是先發高位還是低位,道理是一樣的。
所以,位序和字節序都有大端和小端,共有四種:
- msb: most significant bit
- lsb: least significant bit
- MSB: Most Significant Byte
- LSB: Least Significant Byte
CAN 總線協議中規定,位序都是大端模式,即 msb first,因此不需要區分。但對字節序沒有規定,就出現了兩種情況:Motorola 和 Intel 格式。
先上結論:
Motorola 格式是 MSB
Intel 格式是 LSB
如果某個信息在占據一個字節,不涉及字節的順序,Motorola 和 Intel 是一樣的。
而涉及到跨字節的信息,兩者就完全不同了。
如果某個信息占據了 Byte0 和 Byte1 兩個字節,Motorola 是 MSB,先發高位(即 Byte0 就是高位),所以其解析的順序是 Byte0 Byte1,而 Intel 恰好是反過來:Byte1 Byte0
2.CAN 總線的傳輸字節序
CAN 總線上位序都是大端模式(msb),字節序可選,可以是Intel(LSB )或者是Moto(MSB)
DBC 上的標號其實是Intel,但是當有具體信號時,DBC會有msb和lsb的標注。
Can總線上數據的傳輸序從第0字節發送,到第7字節結束字節序是
第0字節 第1字節 第二字節 第三字節 …….第7字節
字節內部從高位發
第0字節:第7位 第6位 第5位…第0位
順序和DBC中的Layout 一樣
所以總線上的發送位順序位:
7 6 5 4 3 2 1 0 15 14 13 12 11 10 9 8 23 22 21 20 19 18 17 16………57 56
CANoe上讀取總線數據顯示按字節顯示.
如0 位 8位 16位 24位 32位 40位 48位和56位為1其他位為0,那么總線上的數據為:
0000000100000001000000010000000100000001000000010000000100000001
CANoe上顯示為:
0x01 01 01 01 01 01 01 01
如第1位和第4位為1,那么總線數據為:
0001000100000000000000000000000000000000000000000000000000000000
CANoe上顯示為:
0x11 00 00 00 00 00 00 00
3.收數據
1)總線數據占位相同,接收節點數據占位相同,字節序不同(該情況可能性較小)
Intel字節序是低字節存放低地址,高字節存放高地址
如下圖所示
收到數據后認為數據是39 38 37 36 35 34 33 32 31 30 29 28 27 26 25 24(位序為大端)
如果28位、25位、38位和35位為1,其余位為0,CANoe上數據為,
0x00 00 00 12 48
節點接收到這個信號的數據為0x48 12
如果motorola字節序也占了相位置,
收到數據后認為數據是31 30 29 28 27 26 25 24 39 38 37 36 35 34 33 32(位序大端)
如果28位、25位、38位和35位為1,其余位為0,CANoe上數據為,
0x00 00 00 12 48
節點接收到這個信號的數據為0x12 48
2)總線數據占位相同,接收節點位置定義因為字節序導致錯誤
Startbit:46 length:16 motorola字節序占位如下
Startbit:46 length:16 Intel字節序占位如下
所以如果接收端把字節序設錯,可能導致取得數據就是錯的位置上的數據
3)如果信號占位在一個字節內且占位相同,那么讀取的這個信號值沒有區別09
4.發數據
發端數據錯誤同理
5Motorola的MSB和LSB模式
Motorola的MSB和LSB模式的區別只有一個,那就是Startbit是MSB還是LSB。
如果Startbit是MSB就是MSB模式,如果如果Startbit是LSB就是LSB模式
MSB:startbit:41
LSB:startbit:58