《抽絲撥繭說鏈路層(資料幀)》
CAN 匯流排協議規定了5種幀,分別是資料幀、遙控幀、錯誤幀、過載幀以及幀間隔,實踐中資料幀的應用最為頻繁。本文專注講述資料幀的幀結構。
一、幀的分段結構
資料幀,
劃分為多個段位,同樣一詞多種譯法,有的地方稱為多個場
。這種幀分段的行為,是通訊協議領域很常見的現象,沒什麼稀奇。學習協議就是要弄清楚
“段”與“位”
,以方便協議的打包與解析。資料幀構成如下:
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”,接收方認可接收到任意值。也就是說,
保留位即使是受干擾變化,也是不影響報文接收與解析的
。
強制約定:
標準資料幀,該位強制為“0”;擴充套件幀,該位強制為“1”。
小知識3:
這個強制約定,是來源於
協議的一個既定目的
:標準幀與擴充套件幀同時仲裁時,以標準幀為優先。
疑問:
為什麼這樣安排?核心原因:是為了
確保匯流排的通訊實時性
。擴充套件幀報文長,佔用的匯流排消耗大,如果以長報文為優先,整個通訊協議的實時性會嚴重受損。短報文優先,很快就傳輸完了,對長報文的實時影響不大。
疑問:
遠端標準幀與非遠端擴充套件幀怎麼辦的?
6
、IDE位
同樣基於通訊實時性的需要,遠端擴充套件幀,IDE用隱性“1”標記,永遠是最低優先順序。
資料幀 > 遠端幀 > 擴充套件幀。
7
、應答段
分為應答間隙(ACK Slot)和應答界定符(ACK Delimiter)兩位。傳送方發出兩位隱性“1”。正確接收的接收方在應答間隙時間節拍內發出顯性“0”。
8
、幀尾
這個標誌序列由7個“隱性”位組成。
二、資料報文過濾
前面見過,CAN模組,是一直在偵聽匯流排狀態的,所有CAN模組都知道,匯流排誰在發資料,匯流排資料格式對不對,發的都是什麼資料……。對這種匯流排而言,存在“報文過濾”的概念:要設定好自己的暫存器,標識哪些ID源的資料是自己要接收的,才好向自己的MCU產生中斷;其餘資料都過濾掉。