在總線中傳送的報文,每幀由7部分組成。CAN協議支持兩種報文格式,其惟一的不一樣是標識符(ID)長度不一樣,標準格式爲11位,擴展格式爲29位。網絡
在標準格式中,報文的起始位稱爲幀起始(SOF),而後是由11位標識符和遠程發送請求位(RTR)組成的仲裁場。RTR位標明是數據幀仍是請求幀,在請求幀中沒有數據字節。spa
控制場包括標識符擴展位(IDE),指出是標準格式仍是擴展格式。它還包括一個保留位 (ro),爲未來擴展使用。它的最後四個位用來指明數據場中數據的長度(DLC)。數據場範圍爲0~8個字節,其後有一個檢測數據錯誤的循環冗餘檢查(CRC)。htm
應答場(ACK)包括應答位和應答分隔符。發送站發送的這兩位均爲隱性電平(邏輯1),這時正確接收報文的接收站發送主控電平(邏輯0)覆蓋它。用這種方法,發送站能夠保證網絡中至少有一個站能正確接收到報文。教程
報文的尾部由幀結束標出。在相鄰的兩條報文間有一很短的間隔位,若是這時沒有站進行總線存取,總線將處於空閒狀態。get
如圖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、r一、r0和DLC組成如圖17所示。
圖2–6數據幀結構
一個數據幀傳輸的數據量爲0~8個字節,這種短幀結構使得CAN-bus實時性很高,很是適合汽車和工控應用場合如圖27所示。
圖2–7數據段
數據量小,發送和接收時間短,實時性高,被幹擾的機率小,抗干擾能力強。
CAN-bus使用CRC校驗進行數據檢錯,CRC校驗值存放於CRC段。 CRC校驗段由15位CRC值和1位CRC界定符構成如圖28所示。
圖2–8CRC段
當一個接收節點接收的幀起始到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-bus整個鏈路層處理數據的流程是如圖61所示:
圖6–1CAN總線發送總流程
《項目驅動--CAN-BUS現場總線基礎教程----周立功,黃曉清》。
《現場總線技術及其應用第二版–清華大學出版社》。