CAN通訊標準幀之ID(識別符號)詳細解讀

昨天,一位關係比較好的前公司同事打來電話尋求幫助,他在解讀整車廠(東風汽車)發來的CAN協議時遇到了困擾:完全看不懂——因為他以前接觸的是CAN擴充套件幀協議。鑑於經常有朋友也遇到相似的問題,現在就這個問題我有針對性的解釋一下。

一、CAN通訊的基礎知識

(1)為什麼要採用CAN通訊:CAN通訊因為其通訊速率快,抗干擾性好,目前廣泛應用於車載電子裝置上,比如電動汽車及燃油汽車等。CAN物理介面相容規範2。0A和2。0B(主動),位速率高達1兆位/秒。它可以接收和傳送11位識別符號的標準幀,也可以接收和傳送29位識別符號的擴充套件幀。

(2)標準幀和擴充套件幀的區別:其一,擴充套件幀的仲裁域有29位,可以出現2^29種報文,幀ID的範圍是0000 0000-1FFF FFFF;標準幀的仲裁域是連續的11位,可以出現2^11種報文,幀ID的範圍是000-7FF;其二,控制幀中的DLC(資料長度)完全相同,但保留位不同,標準幀IDE、R0,擴充套件幀R1、R0,必須以顯性電平傳送(由資料鏈路層操作)。因此,CAN標準幀和擴充套件幀除了在幀ID的長度上不一樣,其它的基本上一模一樣。

(3)Intel格式與Motorola格式的區別:CAN報文中位元組和資料位的編碼及擺放是有順序的,分為Intel與Motorola兩種格式。當一個訊號的資料長度不超過 1 個位元組(8 位)時,Intel 與 Motorola 兩種格式的編碼結果沒有什麼不同,完全一樣;而當訊號的資料長度超過 1 個位元組(8 位)時,兩者的編碼結果出現了明顯的不同,簡單來說就是:Intel格式高位元組在後,低位元組在前;而Motorola格式則相反,高位元組在前,低位元組在後,如圖1所示。

CAN通訊標準幀之ID(識別符號)詳細解讀

圖1 採用Intel格式編碼十六進位制數值“0x36A5”示例

CAN通訊標準幀之ID(識別符號)詳細解讀

圖2 採用Motorola格式編碼十六進位制數值“0x36A5”示例

(4)關於報文解析中涉及到的解析度(或稱精度)和偏移量,如何轉換為物理值(或實際值):換算關係為——物理值(實際值)=匯流排值*解析度+偏移量。示例如下:

CAN通訊標準幀之ID(識別符號)詳細解讀

圖3 報文解析中解析度和偏移量的換算關係

(5)CAN報文ID識別符號的分配表及說明

(下表可以向左或向右拖拉,以顯示全部資訊)

IDENTIFIER 11BITS(標準幀只有此11位)

SRR

IDE

IDENTIFIER EXTENSION 18BITS(擴充套件幀另外包含此18位)

R

DP

PDU

FORMAT(PF)

SRR

IDE

PF

PDU

SPECIFIC(PS)

SOURCE

ADDRESS(SA)

3

2

1

1

1

8

7

6

5

4

3

2

1

8

7

6

5

4

3

2

1

8

7

6

5

4

3

2

1

此3位代表優先順序,可以有8 個優先順序

一般固定為0

固定為0

PF為報文的程式碼

(標準幀只有6位)

PF為報文的程式碼

(擴充套件幀還要包含這2位,共有8位)

PS為傳送此報文去的目標地址

SA為傳送此報文的源地址

顯而易見,標準幀只有11位,而擴充套件幀擴充套件了18位,共有29位識別符號。

二、解疑答惑

學習瞭解了上面(1)到(5)的基礎知識,我們再來看一下東風汽車公司某一款車型的整車CAN標準幀協議,擷取一段如下圖4所示(為了顯示清晰,分為2段擷取):

CAN通訊標準幀之ID(識別符號)詳細解讀

圖4 擷取報文段1

CAN通訊標準幀之ID(識別符號)詳細解讀

圖4 擷取報文段2

整車上通訊互聯的控制器有很多,比如VCU、MCU、TBOX、BMS等等,我上面展開的是BMS對OBC的報文幀(BMS_OBC),解析如下:

1、首先,可以看出該幀報文(BMS_OBC)是由BMS發給OBC的,“S”代表英文send,“r”代表英文“receive”,幀ID為0x330,傳送週期為100ms,包含8個位元組的有效資料,資料編碼格式採用Motorola格式;

CAN通訊標準幀之ID(識別符號)詳細解讀

圖5 CAN報文收發關係

2、該幀報文包含有4個有效物理量,分別是:BMS_最高允許充電端電壓、BMS_最高允許充電電流、BMS_充電機使能控制、BMS_充電樁型別;

3、我先解析“BMS_最高允許充電端電壓”這個物理量,這個物理量訊號長度(Bit Length)為16Bit,佔用兩個位元組,起始位元組(Start Byte)是1,即從第1位元組到0位元組;該位元組為無符號數(Unsigned),解析度(Resolution)為0。1,偏移量(Offset)為0,它的實際取值範圍是從0—750,單位為“V”,總線上傳送的十六進位制數值範圍為0x0—0x1D47,如果接收到數值為0xFFFF就代表數值無效;

4、ID識別符號0x330採用11位二進位制可表示為:011 0011 0000,根據上節標準幀ID分配表套用可知其代表含義:優先順序為3,報文程式碼(報文名)PF為0x30;

5、假如接收到的報文為:

CAN通訊標準幀之ID(識別符號)詳細解讀

圖6 模擬CAN報文

那麼,它代表的物理量“BMS_最高允許充電端電壓”, 其數值=0x1A90 * 0。1 + 0,轉換為十進位制等於680V,即BMS最高允許充電端電壓為680V,其餘物理量以此類推可知,BMS_最高允許充電電流為56。2A,充電機關閉輸出,BMS處於非充電狀態。

現在,我們可以將該幀報文換成另一種格式進行表述:

CAN通訊標準幀之ID(識別符號)詳細解讀

圖7 報文幀ID-0x330另一種通俗表述方式

如上圖這樣表述,相信我那位朋友就一定能夠看懂了,大家看懂了嗎?