CAN的報文格式
在總線中傳送的報文,每幀由7部分組成。CAN協(xié)議支持兩種報文格式,其唯一的不同是標識符(ID)長度不同,標準格式為11位,擴展格式為29位。
在標準格式中,報文的起始位稱為幀起始(SOF),然后是由11位標識符和遠程發(fā)送請求位(RTR)組成的仲裁場。RTR位標明是數(shù)據(jù)幀還是請求幀,在請求幀中沒有數(shù)據(jù)字節(jié)。
控制場包括標識符擴展位(IDE),指出是標準格式還是擴展格式。它還包括一個保留位 (ro),為將來擴展使用。它的最后四個位用來指明數(shù)據(jù)場中數(shù)據(jù)的長度(DLC)。數(shù)據(jù)場范圍為0~8個字節(jié),其后有一個檢測數(shù)據(jù)錯誤的循環(huán)冗余檢查(CRC)。
應答場(ACK)包括應答位和應答分隔符。發(fā)送站發(fā)送的這兩位均為隱性電平(邏輯1),這時正確接收報文的接收站發(fā)送主控電平(邏輯0)覆蓋它。用這種方法,發(fā)送站可以保證網(wǎng)絡中至少有一個站能正確接收到報文。
報文的尾部由幀結(jié)束標出。在相鄰的兩條報文間有一很短的間隔位,如果這時沒有站進行總線存取,總線將處于空閑狀態(tài)。
如圖1-1所示,具體某一位或某幾位下面會詳細介紹。
圖1-1 CAN總線報文結(jié)構(gòu)
數(shù)據(jù)幀
數(shù)據(jù)幀是使用最多的幀,結(jié)構(gòu)上由7段組成,其中根據(jù)仲裁段ID碼長度的不同,分為標準幀(CAN2.0A)和擴展幀(CAN2.0B)。
數(shù)據(jù)幀是由:幀起始,仲裁斷,控制端,數(shù)據(jù)段,CRC段,ACK段和幀結(jié)束構(gòu)成。
如圖2-1所示(具體的幀結(jié)構(gòu)下面會詳細介紹)。
圖2–1數(shù)據(jù)幀類型及結(jié)構(gòu)
幀起始和幀結(jié)束
幀起始:由單個顯性位組成,總線空閑時,發(fā)送節(jié)點發(fā)送幀起始,其他接收節(jié)點同步于該幀起始位。
幀結(jié)束:由7個連續(xù)的隱形位組成。
(注:顯性電平和隱性電平是相對于CAN_H和CAN_L而言的差分信號電平,并非TTL電平上的高低電平,需要注意)如圖2-2所示。
圖2–2幀起始和幀結(jié)束
仲裁段
CAN-bus是如何解決多個節(jié)點同時發(fā)送數(shù)據(jù),即總線競爭的問題?該問題由仲裁段給出答案。
CAN-bus并沒有規(guī)定節(jié)點的優(yōu)先級,但通過仲裁段幀ID規(guī)定了數(shù)據(jù)幀的優(yōu)先級。根據(jù)CAN2.0標準版本不同,幀ID分為11位和29位兩種。如圖2-3所示
圖2–3數(shù)據(jù)幀結(jié)構(gòu)
如圖2-4所示CAN控制器在發(fā)送數(shù)據(jù)的同時監(jiān)測數(shù)據(jù)線的電平是否與發(fā)送數(shù)據(jù)對應電平相同,如果不同,則停止發(fā)送并做其他處理。
圖2–4仲裁處理
假設節(jié)點A、B和C都發(fā)送相同格式相同類型的幀,如標準格式數(shù)據(jù)幀,它們競爭總線的過程是(如圖2-5所示):
圖2–5仲裁機制
從該分析過程得出結(jié)論是:幀ID值越小,優(yōu)先級越高;
對于同為擴展格式數(shù)據(jù)幀、標準格式遠程幀和擴展格式遠程幀的情況同理
控制段
控制段共6位,標準幀的控制段由擴展幀標志位IDE、保留位r0和數(shù)據(jù)長度代碼DLC組成;擴展幀控制段則由IDE、r1、r0和DLC組成如圖2-6所示。
圖2–6數(shù)據(jù)幀結(jié)構(gòu)
數(shù)據(jù)段
一個數(shù)據(jù)幀傳輸?shù)臄?shù)據(jù)量為0~8個字節(jié),這種短幀結(jié)構(gòu)使得CAN-bus實時性很高,非常適合汽車和工控應用場合如圖2-7所示。
圖2–7數(shù)據(jù)段
數(shù)據(jù)量小,發(fā)送和接收時間短,實時性高,被干擾的概率小,抗干擾能力強。
CRC段
CAN-bus使用CRC校驗進行數(shù)據(jù)檢錯,CRC校驗值存放于CRC段。CRC校驗段由15位CRC值和1位CRC界定符構(gòu)成如圖2-8所示。
圖2–8CRC段
ACK段
當一個接收節(jié)點接收的幀起始到CRC段之間的內(nèi)容沒發(fā)生錯誤時,它將在ACK段發(fā)送一個顯性電平如圖2-9所示。
圖2–9 ACK段
遠程幀
與數(shù)據(jù)幀相比,遠程幀結(jié)構(gòu)上無數(shù)據(jù)段,由6個段組成,同理分為標準格式和擴展格式,且RTR位為1(隱性電平)如圖3-1所示。
圖3–1遠程幀結(jié)構(gòu)
如下圖所示由于數(shù)據(jù)幀的RTR位為顯性電平,遠程幀的RTR位為隱性電平。
所以幀格式和幀ID都相同情況下,數(shù)據(jù)幀的優(yōu)先級比遠程幀優(yōu)先級高如圖3-2所示:
圖3–2數(shù)據(jù)幀于遠程幀仲裁機制
圖3–3數(shù)據(jù)幀遠程幀比較
數(shù)據(jù)幀與遠程幀的區(qū)別如圖3-3所示。
錯誤幀
盡管CAN-bus是可靠性很高的總線,但依然可能出現(xiàn)錯誤;CAN-bus的錯誤類型共有5種(如圖41所示)。
圖4–1錯誤幀類型
當出現(xiàn)5種錯誤類型之一時,發(fā)送或接收節(jié)點將發(fā)送錯誤幀。錯誤幀的結(jié)構(gòu)如下,其中錯誤標識分為主動錯誤標識和被動錯誤標識如圖4-2所示。
圖4–2錯誤幀電平結(jié)構(gòu)
為防止自身由于某些原因?qū)е聼o法正常接收的節(jié)點一直發(fā)送錯誤幀,干擾其他節(jié)點通信,CAN-bus規(guī)定了節(jié)點的3種狀態(tài)及其行為如圖4-3所示。
圖4–3錯誤處理機制
(注:這些錯誤處理的機制是由硬件自主完成的這樣做的目的就是只要CAN在收到數(shù)據(jù)肯定是正確的數(shù)據(jù))。
過載幀與幀間隔
過載幀
當某個接收節(jié)點沒有做好接收下一幀數(shù)據(jù)的準備時,將發(fā)送過載幀以通知發(fā)送節(jié)點;過載幀由過載標志和過載幀界定符組成如所示圖5-1。
圖5–1過載幀結(jié)構(gòu)
由于存在多個節(jié)點同時過載且過載幀發(fā)送有時間差問題,可能出現(xiàn)過載標志疊加后超過6個位的現(xiàn)象如所示圖5-2。
圖5–2過載幀具體結(jié)構(gòu)
幀間隔
幀間隔用于將數(shù)據(jù)幀或遠程幀和他們之前的幀分離開,但過載幀和錯誤幀前面不會插入幀間隔。
幀間隔過后,如果無節(jié)點發(fā)送幀,則總線進入空閑。
幀間隔過后,如果被動錯誤節(jié)點要發(fā)送幀,則先發(fā)送8個隱性電平的傳輸延遲,再發(fā)送幀。
CAN總線發(fā)送總流程
CAN-bus整個鏈路層處理數(shù)據(jù)的流程是如圖6-1所示:
圖6–1 CAN總線發(fā)送總流程
審核編輯:黃飛
?
評論