CAN的報文格式
在匯流排中傳送的報文,每幀由7部分組成。CAN協議支援兩種報文格式,其唯一的不同是識別符號(ID)長度不同,標準格式為11位,擴充套件格式為29位。
在標準格式中,報文的起始位稱為幀起始(SOF),然後是由11位識別符號和遠端傳送請求位(RTR)組成的仲裁場。RTR位標明是資料幀還是請求幀,在請求幀中沒有資料位元組。
控制場包括識別符號擴充套件位(IDE),指出是標準格式還是擴充套件格式。它還包括一個保留位 (ro),為將來擴充套件使用。它的最後四個位用來指明資料場中資料的長度(DLC)。資料場範圍為0~8個位元組,其後有一個檢測資料錯誤的迴圈冗餘檢查(CRC)。
應答場(ACK)包括應答位和應答分隔符。傳送站傳送的這兩位均為隱性電平(邏輯1),這時正確接收報文的接收站傳送主控電平(邏輯0)覆蓋它。用這種方法,傳送站可以保證網路中至少有一個站能正確接收到報文。
報文的尾部由幀結束標出。在相鄰的兩條報文間有一很短的間隔位,如果這時沒有站進行匯流排存取,匯流排將處於空閒狀態。
如圖11所示,具體某一位或某幾位下面會詳細介紹。
圖11 CAN匯流排報文結構
資料幀資料幀是使用最多的幀,結構上由7段組成,其中根據仲裁段ID碼長度的不同,分為標準幀(CAN2.0A)和擴充套件幀(CAN2.0B)。
資料幀是由:幀起始,仲裁斷,控制端,資料段,CRC段,ACK段和幀結束構成。
如圖21所示(具體的幀結構下面會詳細介紹)。
圖2–1資料幀型別及結構
幀起始和幀結束幀起始:由單個顯性位組成,匯流排空閒時,傳送節點發送幀起始,其他接收節點同步於該幀起始位。
幀結束:由7個連續的隱形位組成。
(注:顯性電平和隱性電平是相對於CAN_H和CAN_L而言的差分訊號電平,並非TTL電平上的高低電平,需要注意)如圖2-2所示。
圖2–2幀起始和幀結束
仲裁段CAN-bus是如何解決多個節點同時傳送資料,即匯流排競爭的問題?該問題由仲裁段給出答案。
CAN-bus並沒有規定節點的優先順序,但透過仲裁段幀ID規定了資料幀的優先順序。根據CAN2.0標準版本不同,幀ID分為11位和29位兩種。如圖23所示
圖2–3資料幀結構
如圖24所示CAN控制器在傳送資料的同時監測資料線的電平是否與傳送資料對應電平相同,如果不同,則停止傳送並做其他處理。
圖2–4仲裁處理
假設節點A、B和C都發送相同格式相同型別的幀,如標準格式資料幀,它們競爭匯流排的過程是(如圖16所示):
圖2–5仲裁機制
從該分析過程得出結論是:幀ID值越小,優先順序越高;
對於同為擴充套件格式資料幀、標準格式遠端幀和擴充套件格式遠端幀的情況同理
控制段控制段共6位,標準幀的控制段由擴充套件幀標誌位IDE、保留位r0和資料長度程式碼DLC組成;擴充套件幀控制段則由IDE、r1、r0和DLC組成如圖17所示。
圖2–6資料幀結構
資料段一個數據幀傳輸的資料量為0~8個位元組,這種短幀結構使得CAN-bus實時性很高,非常適合汽車和工控應用場合如圖27所示。
圖2–7資料段
資料量小,傳送和接收時間短,實時性高,被幹擾的機率小,抗干擾能力強。
CRC段CAN-bus使用CRC校驗進行資料檢錯,CRC校驗值存放於CRC段。 CRC校驗段由15位CRC值和1位CRC界定符構成如圖28所示。
圖2–8CRC段
ACK段當一個接收節點接收的幀起始到CRC段之間的內容沒發生錯誤時,它將在ACK段傳送一個顯性電平如圖29所示。
圖2–9 ACK段
遠端幀與資料幀相比,遠端幀結構上無資料段,由6個段組成,同理分為標準格式和擴充套件格式,且RTR位為1(隱性電平)如圖31所示。
圖3–1遠端幀結構
如下圖所示由於資料幀的RTR位為顯性電平,遠端幀的RTR位為隱性電平。
所以幀格式和幀ID都相同情況下,資料幀的優先順序比遠端幀優先順序高如圖32所示:
圖3–2資料幀於遠端幀仲裁機制
圖3–3資料幀遠端幀比較
資料幀與遠端幀的區別如圖33所示。
錯誤幀儘管CAN-bus是可靠性很高的匯流排,但依然可能出現錯誤;CAN-bus的錯誤型別共有5種(如圖41所示)。
圖4–1錯誤幀型別
當出現5種錯誤型別之一時,傳送或接收節點將傳送錯誤幀。錯誤幀的結構如下,其中錯誤標識分為主動錯誤標識和被動錯誤標識如圖42所示。
圖4–2錯誤幀電平結構
為防止自身由於某些原因導致無法正常接收的節點一直髮送錯誤幀,干擾其他節點通訊,CAN-bus規定了節點的3種狀態及其行為如圖43所示。
圖4–3錯誤處理機制
(注:這些錯誤處理的機制是由硬體自主完成的這樣做的目的就是隻要CAN在收到資料肯定是正確的資料)。
過載幀與幀間隔過載幀當某個接收節點沒有做好接收下一幀資料的準備時,將傳送過載幀以通知傳送節點;過載幀由過載標誌和過載幀界定符組成如所示圖51。
圖5–1過載幀結構
由於存在多個節點同時過載且過載幀傳送有時間差問題,可能出現過載標誌疊加後超過6個位的現象如所示圖52。
圖5–2過載幀具體結構
幀間隔幀間隔用於將資料幀或遠端幀和他們之前的幀分離開,但過載幀和錯誤幀前面不會插入幀間隔。
幀間隔過後,如果無節點發送幀,則匯流排進入空閒。
幀間隔過後,如果被動錯誤節點要傳送幀,則先發送8個隱性電平的傳輸延遲,再發送幀。
CAN匯流排傳送總流程CAN-bus整個鏈路層處理資料的流程是如圖61所示:
圖6–1CAN匯流排傳送總流程
參考資料《專案驅動--CAN-BUS現場匯流排基礎教程----周立功,黃曉清》。
《現場匯流排技術及其應用第二版–清華大學出版社》。