CAN總線之CAN的報文格式

(來自博客:http://blog.csdn.net/maifansnet/article/details/51417148)

一、幀

CAN協議的報文傳輸主要由下面的4種幀來實現:
數據幀:從發送端攜帶數據到接收端。
遠程幀:總線單元發出遠程幀,請求發送具有同一識別符的數據幀。
錯誤幀:任何單元檢測到一總線錯誤就發出錯誤幀。
過載幀:過載幀用以在先行的和後續的數據幀(或遠程幀)之間提供一附加的延時。

同時幀間空間用來間隔數據幀/遠程幀與其他幀。

1.數據幀


一個完整的數據幀有7部分組成,依次爲幀起始(SOF)、仲裁場(Arbitration Field)、控制場(Control Field)、數據場(Data Field)、CRC場、應答場(ACK Field)、幀結尾(EOF)。

幀起始是數據幀和遠程幀開始的標誌,它是一個顯性位。一個CAN節點只有在總線處於空閒狀態時纔可以發送幀起始。


仲裁場在幀起始之後,控制場之前,共12位(注:協議的講解以CAN2.0A爲基礎[3],CAN2.0B版本的仲裁場爲32位[4])分爲兩部分11位的標識符和1位的遠程發送請求位(RTR)。在數據幀中RTR爲顯性,在遠程幀中RTR爲隱性。所以如果相同標識符的數據幀與遠程幀發生衝突,數據幀優先。


仲裁場之後便是控制場。控制場的頭兩位爲保留位,爲隱性。後面是數據長度代碼(DataLengthCode)。數據長度代碼指示了數據場中字節的個數。數據長度的大小在DLC的表示。
DLC最大爲8。
對於超出8的情況,各廠家有不同的實現。有的實現忽略“越界”DLC,傳輸8 bytes的數據和“錯誤”的DLC。有的傳輸8 bytes的數據並改DLC爲8。有的直接不傳輸任何東西。
數據場在控制場之後,傳輸數據的長度由DLC決定。如果DLC爲0,則沒有數據場。數據場中高位先傳輸。

CRC場在控制場和數據場之後,由CRC序列和界定符組成。CRC序列是幀起始,仲裁場,控制場和數據場組成的位流的CRC校驗值。其中CRC校驗的生成多項式爲X15+ X 14+ X10+ X8+ X7+ X4+ X3+ 1。CRC序列之後是一個“隱性”CRC結束符。


CRC場之後便是應答場。應答場由2個位組成,應答位和應答結束符。發射單元會發送“隱性”的應答位和應答結束符至總線上。而接收單元如果接收到的數據都是有效的,會在發射單元發送應答位的同時發送一個“顯性”位至總線上,所以一個有效的數據幀,應答位在總線上應該表現爲“顯性”。

數據幀的最後爲幀結尾,由7個連續的“隱性”位組成。

2.遠程幀

遠程幀的主要作用是向其他的CAN節點發送數據請求,發送相同標識符的數據幀。與數據幀相比,遠程幀的RTR位是隱性的,而且沒有數據場。DLC中的值是數據幀的數據長度。

3.錯誤幀


錯誤幀由錯誤標誌的疊加和結束符組成。
錯誤標誌有主動錯誤標誌與被動錯誤標誌。主動錯誤標誌爲6個顯性位,被動錯誤標誌爲6個隱性位。
錯誤主動節點與錯誤被動節點(參考“CAN節點的錯誤狀態”)對錯誤的反應是不一樣的。

當錯誤主動節點檢測到錯誤時,會發送主動錯誤標誌。而主動錯誤標誌又會影響總線上原有傳輸內容的結構,從而讓其他未檢測到錯誤的節點發現錯誤。一種情況是錯誤幀破壞了應答場和幀結尾的固有形式;另一種情況是錯誤幀破壞了位填充規則。當其他節點發現錯誤後,也會發送錯誤幀。這樣就會造成一個錯誤標誌的疊加會有6-12bits大小。


上圖演示了第二種情況時的各個節點發送錯誤幀的情況。節點1首先檢測到錯誤,發送錯誤幀,在連續發送了6個顯性位之後,節點2和3檢測到位填充錯誤,也發送錯誤幀。這樣總線上錯誤幀的疊加就達到了12位。

所有節點發送完錯誤標誌之後就會發送一個隱性位,並監控總線,直到總線上出現一個隱性位。然後在發送7個隱性位。這樣一個錯誤幀就發送完畢了。

4.過載幀


過載幀與主動錯誤幀非常類似,特別是位的組成和全局化的過程。主要的差別在於錯誤幀發生着數據幀,遠程幀期間。而過載幀發生於間歇字段期間。
過載幀是由過載標誌的疊加和過載結束符組成。有兩種情況可以觸發過載幀:
CAN節點的內部需求,例如需要時間準備數據幀的數據。這種情況下過載幀只允許起始於幀間隔的第一個位。
在幀間隔內偵測到顯性位。這種情況下,過載幀起始於檢測到顯性位的後一位。
過載標誌由6個顯性位組成,過載幀破壞了間歇字段的結構從而導致了過載幀的全局化。發完過載標誌後,CAN節點會往總線發送隱性位,並監控總線直至出現隱性位。然後再發送7個隱性位。

e.幀間空間
數據幀與遠程幀的前面必然有幀間空間。對於主動錯誤節點和被動錯誤節點,幀間空間的結構稍有不同。對於主動錯誤節點,幀間空間由3個顯性位的間歇字段和總線空閒組成。在間歇字段不允許發送數據幀與遠程幀。總線空閒的長度任意,當有顯性位時就被認爲是幀起始。
被動錯誤標誌除了上邊兩部分外,在間歇字段之後還有8個顯性位的掛起傳輸。在掛起傳輸階段被動錯誤節點不可以發送數據幀與遠程幀。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章