1 幀格式
幀格式可理解為定義了傳輸的數據(叫報文)應該“長什么樣”來傳輸,也為后續設定一些規則如錯誤檢查機制提供了思路。
?
首先,幀格式可分為以下5種類型:
PS:CAN總線任意一個設備可當收也可當發,CAN總線有兩種數據傳輸方式:廣播式和請求式。
廣播式:CAN其中一個設備其不斷地發送報文到總線上,連接到總線上的其他設備“想收就收”。
請求式:CAN中哪個設備有收數據的需求,向發數據方發送一個請求,發數據方收到請求后,才發送報文到總線上。
1.1 數據幀
數據幀有兩種格式:標準格式和擴展格式。
圖上的數字:代表每一段對應的所占的位數,不是點電平邏輯!(黑色粗線才是邏輯電平)
顏色解釋:看圖的最底下,無論是標準格式還是擴展格式,灰色代表邏輯0,白色代表邏輯1,紫色代表可0可1,ACK位槽特殊情況白色灰色各占一半,規定發送方必須白色即發送邏輯1,接收方必須發送邏輯0。
1.1.1 標準格式:
(1)SOF段之前段(幀起始前):總線空閑,上一章提到,高速CAN空閑為1(黑色粗線為邏輯電平1)。
(2)SOF(幀起始):必須為0,表示開始發送了,要與幀之前空閑時1區別,故必須為0;
(3)ID:報文ID共11位,紫色,則視具體情況而定
(4)RTR:遠程請求標志位,用于區分數據幀(為0)還是遙控幀(為1),現在是數據幀,如必須為0;
(5)IDE:用于區分標準格式(為0)還是擴展格式(為1),這里為標準格式,故必須為0
(6)r0:保留位,還未用到,為了以后可能升級用,目前先固定設為0。
(7)DLC:表示數字段的長度,數據段要多少字節
(8)DATA:就是傳輸的數據
(9)CRC:校驗算法,會對SOF到DATA的數進行自動檢驗,得到一個檢驗碼存在這個位置。
(10)CRC界定符:設定為邏輯1
(11)ACK段:ACK槽——ACK界定符:ACK槽為發送方必須白色即發送邏輯1,接收方必須發送邏輯0(同時),ACK界定符設定為邏輯1。(理解:這段可認為是發送方和接收方操作總線權力短暫交接的過程,ACK段前后都是發送方在操作總線,ACK段則是接收方在操作總線,目的是為了讓發送方方知道有設備接收了,ACK槽前后要留有權力交接的時間,故設定了CRC界定符和ACK界定符,CRC界定符為邏輯1,發送方釋放總線,若有設備接收了,那么ACK槽就會接收方拉下總線,故會出現邏輯0,這樣發送方就知道有設備接收到了,接收方發出應答后,又要交出總線的控制權,故接收方在ACK界定符上要發邏輯1,釋放總線。)
PS:
- 數據的應答是一位一位進行的,而不是等所有數據傳輸完,接收方才來應答。
- ACK段可多個設備同時拉下總線。
(13)EOF(幀結束):設定為7個邏輯1,表示幀結束了。
1.1.2 擴展格式:
擴展格式是因為ID段不夠用用了,所以要加ID段的位數。
擴展格式為了要與標準格式的兼容,再碰到IDE位前,系統也不知道是標準格式還是擴展格式,因此,IDE前的兩種格式的解析方式,位數等必須一致(除了幀起始,擴展格式沒有),遇到IDE后,則可分標準格式解析還是擴展格式解析,即兩種格式可以不一樣了。
所以,看到紅色框內,即遇到IDE前,先都是11位ID。
此后,標準格式為RTR位+IDE,為了與之一樣,擴展格式位SSR+IDE,其實SSR是無用的,強制設定為1,為的是與標準格式的RTR位對應。
遇到IDE位后,擴展格式加進了18位ID,后與標準格式RTR位開始完全一致。
1.2 遙控幀
看結構,遙控幀無數據段(DATA),RTR為隱性電平1(與數據幀區分),其他部分與數據幀相同。
這樣理解:遙控幀是請求式,說明接收方向發送方請求發送,那自然沒有數據,故沒有數據段。
而當是請求式時,需要數據幀和遙控幀配合,先遙控幀(配有一個ID)發出給發送方,發送方收到后,以相同ID報文且用數據幀來發送數據,根據后續仲裁規則,當具有相同ID數據幀和遙控幀同時發送時,數據幀優先,則接收方可以收到數據。
1.3 錯誤幀
總線上所有設備都會監督總線的數據,錯誤”或“格式錯誤”或“應答錯誤”,這些設備便會發出錯誤幀來破壞數據,同時終止當前的發送設備
設備默認處于主動錯誤狀態,當某設備處于主動狀態時發生的錯誤太多,就會進入被動錯誤狀態。但無論是哪種狀態,但是設備不會亂發錯誤幀,是當某設備檢測出有錯誤時,該設備才會發出錯誤幀,即圖示錯誤幀的波形。
設備處于主動狀態時發出的錯誤幀的波形為:6個顯性位(邏輯0)+6個顯性位(邏輯0)【用于延遲】+錯誤界定符(固定8個邏輯1)
理解:當總線上某一個設備處于主動狀態發現錯誤時,發出6個0,相當于拉下總線,當總線上的傳輸的數據有1時就會被破換掉,因為0強于1(之前提到),那么最終其他設備收到的數據就被破換掉了。
設備處于被動錯誤狀態時發出的錯誤幀波形為:6個隱性位(邏輯1)+6個隱性位(邏輯1)【用于延遲】+錯誤界定符(固定8個邏輯1)
理解:當總線上某一個設備處于被動狀態發現錯誤時,發出6個1,相當于放開總線,就相當于自己這個設備自己破壞自己發的數據,但不破壞總線上別人發的數據(因為總線上數據是1的話就沒影響,是0的話,0強于1也沒影響)。
- 兩種錯誤幀都有6位用于延遲:是因為當某一設備發出錯誤幀時,可能會引起其他設備也出現錯誤,那么其他設備也可能發錯誤幀,相當于給一個延遲時間,在來通過界定符來表示結束。
- 有的同學可能回想,主動發出的錯誤幀時,發出了六個0,如果剛好總線上的數據也是6個0,那不是沒有破換掉數據?或者說不知道是錯誤幀還是數據,這種情況其實是不可能發生的!!!,連續出現6個0或者6個的情況只能是錯誤幀,因為CAN還設定了位填充規則(文章末尾)。
1.4 過載幀
當接收方收到大量數據而無法處理時,其可以發出過載幀,延緩發送方的數據發送,以平衡總線負載,避免數據丟失。
可以這樣理解:因為發送方的發送頻率是其自己決定的,當接收方接收不過來的時候,接收方就可以發出一個過載幀來破壞掉這個數據(過載幀和錯誤幀類似,連續發送了6個0,我們說錯誤幀的時候提到過這樣會破壞數據),發送方的數據沒被收到,那么發送方就會重試,那么,破壞和重試這個過程所用的時間就相當于給接收方延遲,讓它有機會慢點收數據。(或者如果發送方有相應的處理機制,收到過載幀后就會調整發送頻率)。
過載幀形式:6個顯性(邏輯0)+延遲一部分(未確定具體多少位0)+過載界定符(8個1)。
1.5 幀間隔
幀間隔的作用是將數據幀和遠程幀與前面的幀分離開。
比如:當設備連續發送數據幀時,需要有幀間隔把這些數據幀分離開。
幀間隔也分主動狀態和被動狀態。
圖上方為主動狀態:3位隱性電平(邏輯1)+ 總線空閑(n位邏輯1)
圖下方為被動狀態:3位隱性電平(邏輯1)+ 延遲傳送(8位邏輯1)+?總線空閑(n位邏輯1)
2 位填充
數據幀和遙控幀發送到總線前其實是進行了位填充再發送到總線上的。
位填充規則:發送方每發送5個相同電平后,自動追加一個相反電平的填充位,接收方檢測到填充位時,會自動移除填充位,恢復原始數據。
以下通過下圖幾個例子來理解:
“即將發送”表示設備要發出去的數據,”移除填充后”是接收方實際接受到的數據,可以看到,以下三個例子這兩項都是對應一樣的。
第一組:
要發送的數據是100000110,根據位填充規則,連續發送了5個0后,要在他后面追加一個相反電平1,如“實際發送”/“實際接收”所示,接收方最終接收的數據又會把這個追加的1移除。
第二組:
要發的是10000011110,同樣,連續5個0后補1得到100000111110,發現補了一個1后又出現了連續5個1的情況,則在后續再追加一個0得到1000001111100,最后實際接收會把這兩個填充位都移除。即:位填充插入的數據位,要和原始數據后續的數據位合并,進行新的位填充判定。
第三組:
要發011111111110,連續5個1后補0得到0111110111110,根據第二組得到的規則,追加的0要和后續的位數一起進行為位填充規則判定,發現無連續0,但原始數據中,又出現5個1,0111110111110,故補0得到:01111101111100,同樣,最后實際接收會把這兩個填充位都移除。
位填充作用:
- 增加波形的定時信息,利于接收方執行“再同步”,防止波形長時間無變化,導致接收方不能確掌握數據采樣時機。
- 將正常數據流與“錯誤幀”和“過載幀”區分開,標志“錯誤幀”和“過載幀”的特異性。(就是我們前面講錯誤幀時提到的,不可能在總線上傳輸的數據出現連續6個相同電平,如果出現,必是錯誤幀或過載幀)
- 保持CAN總線在發送正常數據流時的活躍狀態,防止被誤認為總線空閑。(CAN總線規定,當出現11個1后表示CAN總線處于空閑狀態,由上面例子的第三組可以看到,傳輸的數據不可能是連續11個1的情況,出現了則必是表示CAN總線處于空閑狀態。)
注:以上均是通過學習參考文獻、嗶哩嗶哩網站上江協科技官方號以及網絡資源所得的個人經驗,如有侵權,請聯系我,歡迎指正。