CAN匯流排系列 之四 抽絲撥繭說鏈路層(資料幀)

《抽絲撥繭說鏈路層(資料幀)》

CAN 匯流排協議規定了5種幀,分別是資料幀、遙控幀、錯誤幀、過載幀以及幀間隔,實踐中資料幀的應用最為頻繁。本文專注講述資料幀的幀結構。

CAN匯流排系列 之四 抽絲撥繭說鏈路層(資料幀)

一、幀的分段結構

資料幀,

劃分為多個段位,同樣一詞多種譯法,有的地方稱為多個場

。這種幀分段的行為,是通訊協議領域很常見的現象,沒什麼稀奇。學習協議就是要弄清楚

“段”與“位”

,以方便協議的打包與解析。資料幀構成如下:

CAN匯流排系列 之四 抽絲撥繭說鏈路層(資料幀)

1

、段位符號註解

SOF位:start of frame;幀起始;

IDE位:Identifier Extension;擴充套件ID的標記位;

RTR位:Remote Tranmission Request;遠端傳送請求標記位;

DLC段:data length code;資料長度標記段;

r0/1位:reserved ;保留位;

SRR位:Substitute Remote Request;替代遠端請求位;

CRC段:Cyclic Redundancy Check;迴圈冗餘校驗;

ACK段:Acknowledgment;應答段;

EOF段:end of frame;結束段。

說明1:

這張圖裡面,數字,標識段或位所佔的位數;位的上劃線、下劃線,標識位的邏輯值約定:同時有上下劃線的,標識該位可根據情況有兩個邏輯值可能;如果只有上劃線或者只有下劃線,標識只能是顯性或者只能是隱性,這是強制性約定。

說明2:

這張圖是資料幀的約定,別的圖有別的約定。

說明3:這類強制性約定,目標兩個:為了協議完備;凸顯哪一方的優先。

2

、幀起始

幀起始=“0”。由一個顯性位(低電平)組成,傳送節點發送幀起始,其他節點同步於幀起始;

小知識1:

競爭或者發起匯流排申請,總是以“0”開始的。

CAN匯流排是非同步通訊匯流排

,這個起始的“0”的下降沿,恰巧起到了同步各通訊模組的非同步時鐘的作用。

3

、11位正常ID段

ID分為11位ID與29位ID,分別對應為標準幀(2。0A)和擴充套件幀(2。0B)。

ID段,非遠端幀,表明的是資料來源的ID;遠端幀,表明的向哪個ID單元傳送通知或請求。

碰巧

同時

有多個節點發出了幀起始位的情況下,則這個ID號也就順便起到到仲裁段的用途。競爭時,以ID的位流為單位,

從ID高位到低位

,逐次按“bit位”進行競爭,以顯性優先為原則,當比對的某位以隱性PK上了顯性,則隱性的那一方退出匯流排申請。顯性的會得到匯流排使用的優先權。

說明:“顯性”PK“隱性”,從ID的高位比起

《抽絲撥繭說鏈路層(匯流排仲裁)》一文中,說反了,這裡進行勘誤

。這樣,低編號的ID,優先順序高(職務高的車牌靠前,警務編號靠前)。

小知識2:

總線上的通訊模組,都是一直在檢測匯流排的電平狀態的;CAN匯流排在電路上,設計為顯性優先電路;當某一發送方,檢測到的電路狀態與自己傳送的狀態不一致時,這一發送方自動退出傳送過程。這種競爭方式是“自動退出”方式。

4

、緊接著11位正常ID 之後的位

CAN匯流排資料是序列流,11位ID位之前,幀是什麼型別,除了傳送方知道,其餘偵聽方都不知道,只能邊偵聽邊破譯。

上述11位正常ID 之後的位,標準幀是RTR位,擴充套件幀是SRR位。

RTR位,是標識遠端幀還是非遠端幀。

小知識3:

CAN協議以非遠端幀為優先,遠端靠後,所以這個標識,遠端幀反而是標記為隱性“1”,非遠端幀反而是顯性“0”。

5

、r0/1保留位

保留位,不做明確定義,但約定,傳送方發顯性“0”,接收方認可接收到任意值。也就是說,

保留位即使是受干擾變化,也是不影響報文接收與解析的

CAN匯流排系列 之四 抽絲撥繭說鏈路層(資料幀)

強制約定:

標準資料幀,該位強制為“0”;擴充套件幀,該位強制為“1”。

小知識3:

這個強制約定,是來源於

協議的一個既定目的

:標準幀與擴充套件幀同時仲裁時,以標準幀為優先。

疑問:

為什麼這樣安排?核心原因:是為了

確保匯流排的通訊實時性

。擴充套件幀報文長,佔用的匯流排消耗大,如果以長報文為優先,整個通訊協議的實時性會嚴重受損。短報文優先,很快就傳輸完了,對長報文的實時影響不大。

疑問:

遠端標準幀與非遠端擴充套件幀怎麼辦的?

6

、IDE位

同樣基於通訊實時性的需要,遠端擴充套件幀,IDE用隱性“1”標記,永遠是最低優先順序。

資料幀 > 遠端幀 > 擴充套件幀。

7

、應答段

分為應答間隙(ACK Slot)和應答界定符(ACK Delimiter)兩位。傳送方發出兩位隱性“1”。正確接收的接收方在應答間隙時間節拍內發出顯性“0”。

8

、幀尾

這個標誌序列由7個“隱性”位組成。

二、資料報文過濾

前面見過,CAN模組,是一直在偵聽匯流排狀態的,所有CAN模組都知道,匯流排誰在發資料,匯流排資料格式對不對,發的都是什麼資料……。對這種匯流排而言,存在“報文過濾”的概念:要設定好自己的暫存器,標識哪些ID源的資料是自己要接收的,才好向自己的MCU產生中斷;其餘資料都過濾掉。