寫在前面:
本文章旨在總結備份、方便以後查詢,由於是個人總結,如有不對,歡迎指正;另外,內容大部分來自網絡、書籍、和各類手冊,如若侵權請告知,馬上刪帖致歉。
再續前緣:CAN總線(Controller Area Network bus)協議(一)
本篇爲 CAN協議格式分析
CAN主要有 5 種幀類型:
- 數據幀:包含用於傳輸的節點數據的幀
- 遙控幀:請求傳輸特定標識符的幀
- 錯誤幀:由任何檢測到錯誤的節點發送的幀
- 過載幀:用於接收單元通知其尚未完成接收準備的幀
- 幀間隔:用於分隔數據幀和遙控幀的幀
目錄
一、數據幀
數據幀由 7 個段構成。
數據幀的構成如下圖所示:
(1) 幀起始
表示數據幀開始的段。1 個位的顯性位。
(2) 仲裁段
表示該幀優先級的段。
標準格式和擴展格式在此的構成有所不同。
1、在總線空閒態,最先開始發送消息的單元獲得發送權
多個單元同時開始發送時,各發送單元從仲裁段的第一位開始進行仲裁。連續輸出顯性電平最多的單元可繼續發送。
仲裁的過程如下圖所示:
2、標準格式和擴展格式的優先級比較
標準格式 ID 與具有相同 ID 的擴展格式的數據幀在總線上競爭時,標準格式的 RTR 位爲顯性位的具有優先權,可繼續發送。
(3) 控制段
表示數據的字節數及保留位的段。
控制段由 6 個位構成,表示數據段的字節數。標準格式和擴展格式的構成有所不同。
(4) 數據段
數據的內容,可發送 0~8 個字節的數據。
從 MSB(最高位)開始輸出。
(5) CRC 段
檢查幀的傳輸錯誤的段。
由 15 個位的 CRC 順序 *1 和 1 個位的 CRC 界定符(用於分隔的位)構成。
(6) ACK 段
表示確認正常接收的段。
由 ACK 槽 (ACK Slot) 和 ACK 界定符 2 個位構成。
(7) 幀結束
表示數據幀結束的段。
由 7 個位的隱性位構成。
二、遙控幀
接收單元向發送單元請求發送數據所用的幀。遙控幀由 6 個段組成。遙控幀沒有數據幀的數據段。
遙控幀的構成如下圖所示:
遙控幀相比於數據幀除了缺少數據段之外,遙控幀的 RTR 位恆爲隱性 1,數據幀的 RTR 位恆爲顯性 0。
(1) 幀起始
表示幀開始的段。
(2) 仲裁段
表示該幀優先級的段。可請求具有相同 ID 的數據幀。
(3) 控制段
表示數據的字節數及保留位的段。
(4) CRC 段
檢查幀的傳輸錯誤的段。
(5) ACK 段
表示確認正常接收的段。
(6) 幀結束
表示遙控幀結束的段。
遙控幀和數據幀分析
- 數據幀和遙控幀的不同
- 遙控幀的 RTR 位爲隱性位,沒有數據段。
- 沒有數據段的數據幀和遙控幀可通過 RTR 位區別開來。
- 遙控幀沒有數據段,數據長度碼該如何表示?
- 遙控幀的數據長度碼以所請求數據幀的數據長度碼錶示。
- 沒有數據段的數據幀有何用途?
- 例如,可用於各單元的定期連接確認/應答、或仲裁段本身帶有實質性信息的情況下。
- 數據幀和遙控幀的優先級
- 具有相同 ID 的數據幀和遙控幀在總線上競爭時,仲裁段的最後一位(RTR)爲顯性位的數據幀具有優先權,可繼續發送。
- 數據幀和遙控幀的仲裁過程如下圖所示:
在 ID 號前 11 位相同的情況下:
- RTR:保證在標準格式下,數據幀優先級高於遙控幀。
- SRR:保證標準數據幀的優先級高於擴展數據幀。
- IDE:保證標準遙控幀的優先級高於擴展遙控幀。
三、錯誤幀
用於在接收和發送消息時檢測出錯誤通知錯誤的幀。錯誤幀由錯誤標誌和錯誤界定符構成。
錯誤幀的構成如下圖所示:
(1) 錯誤標誌
錯誤標誌包括主動錯誤標誌和被動錯誤標誌兩種。
- 主動錯誤標誌:6 個位的顯性位。
- 被動錯誤標誌:6 個位的隱性位。
(2) 錯誤界定符
錯誤界定符由 8 個位的隱性位構成。
錯誤的三種狀態
CAN總線上的節點單元始終處於 3 種狀態之一。
當滿足一定的條件時,節點可以從一種狀態轉換爲另外一種狀態。
(1) 主動錯誤狀態
主動錯誤狀態是可以正常參加總線通信的狀態。
處於主動錯誤狀態的單元檢測出錯誤時,輸出主動錯誤標誌。
(2) 被動錯誤狀態
被動錯誤狀態是易引起錯誤的狀態。
處於被動錯誤狀態的單元雖能參加總線通信,但爲不妨礙其它單元通信,接收時不能積極地發送錯誤通知。
處於被動錯誤狀態的單元即使檢測出錯誤,而其它處於主動錯誤狀態的單元如果沒發現錯誤,整個總線也被認爲是沒有錯誤的。
處於被動錯誤狀態的單元檢測出錯誤時,輸出被動錯誤標誌。
另外,處於被動錯誤狀態的單元在發送結束後不能馬上再次開始發送。在開始下次發送前,在間隔幀期間內必須插入“延遲傳送”(8 個位的隱性位)。
(3) 總線關閉態
總線關閉態是不能參加總線上通信的狀態。
信息的接收和發送均被禁止。
這些狀態依靠發送錯誤計數和接收錯誤計數來管理,根據計數值決定進入何種狀態。
在 CAN 節點內,有兩個計數器:發送錯誤計數器(TEC)和接收錯誤計數器(REC)。
發送錯誤計數值和接收錯誤計數值根據一定的條件發生變化。錯誤計數值的變動條件如下圖所示:
一次數據的接收和發送可能同時滿足多個條件。
錯誤計數器在錯誤標誌的第一個位出現的時間點上開始計數。
錯誤狀態和計數值的關係:
錯誤處理
1、位填充
位填充是爲防止突發錯誤而設定的功能。當同樣的電平持續 5 位時則添加一個位的反型數據。
位填充的構成如下圖所示:
(1) 發送單元的工作
在發送數據幀和遙控幀時,SOF~CRC 段間的數據,相同電平如果持續 5 位,在下一個位(第 6 個位)則要插入 1 位與前 5 位反型的電平。
(2) 接收單元的工作
在接收數據幀和遙控幀時,SOF~CRC 段間的數據,相同電平如果持續 5 位,需要刪除下一個位(第 6 個位)再接收。如果這個第 6 個位的電平與前 5 位相同,將被視爲錯誤併發送錯誤幀。
2、錯誤的種類
錯誤共有 5 種。多種錯誤可能同時發生。
- 位錯誤
- 填充錯誤
- CRC 錯誤
- 格式錯誤
- ACK 錯誤
錯誤的種類、錯誤的內容、錯誤檢測幀和檢測單元如下表所示:
- 位錯誤(Bit Error)
比較輸出電平和總線電平(不含填充位),當兩電平不一樣時所檢測到的錯誤。
- 填充錯誤(Stuff Error)
在需要位填充的段內,連續檢測到 6 位相同的電平時所檢測到的錯誤。
- CRC錯誤(CRC Error)
在發送消息時,發送節點會根據特定的多項式計算出由數據幀 SOF 位到數據域最末位的 Checksum 值,並將該值放在數據幀的 CRC 域,隨着數據幀廣播到總線上。接收節點在收到數據後,應用同樣的多項式計算 Checksum 值,並與收到的 Checksum 值對比。如果兩者一致,正常接收;如果不一致,則捨棄該消息,併發送錯誤幀請求發送節點重傳消息。
- 格式錯誤(Form Error)
檢測出與固定格式的位段相反的格式時所檢測到的錯誤。
- 應答錯誤(ACK Error)
發送單元在 ACK 位中檢測到隱性電平時所檢測到的錯誤(ACK 沒被傳送過來時所檢測到的錯誤)。
3、錯誤幀的輸出
檢測出滿足錯誤條件的單元輸出錯誤標誌通報錯誤。
處於主動錯誤狀態的單元輸出的錯誤標誌爲主動錯誤標誌;處於被動錯誤狀態的單元輸出的錯誤標誌爲被動錯誤標誌。
發送單元發送完錯誤幀後,將再次發送數據幀或遙控幀。
錯誤標誌輸出時序如下表所示:
四、過載幀
過載幀是用於接收單元通知其尚未完成接收準備的幀。過載幀由過載標誌和過載界定符構成。
過載幀的構成如下圖所示:
(1) 過載標誌
6 個位的顯性位。
過載標誌的構成與主動錯誤標誌的構成相同。
(2) 過載界定符
8 個位的隱性位。
過載界定符的構成與錯誤界定符的構成相同。
五、幀間隔
幀間隔是用於分隔數據幀和遙控幀的幀。數據幀和遙控幀可通過插入幀間隔將本幀與前面的任何幀(數據幀、遙控幀、錯誤幀、過載幀)分開。
過載幀和錯誤幀前不能插入幀間隔。
幀間隔的構成如下圖所示:
(1) 間隔
3 個位的隱性位。
(2) 總線空閒
隱性電平,無長度限制(0 亦可)。
本狀態下,可視爲總線空閒,要發送的單元可開始訪問總線。
(3) 延遲傳送(發送暫時停止)
8 個位的隱性位。
只在處於被動錯誤狀態的單元剛發送一個消息後的幀間隔中包含的段。
六、其他
參考: