車載網絡CAN(二):CAN通信的數據傳輸機制
摘要
該專題連載共分為“五”篇,這是第二篇。本文的主題是CAN(控制器局域網)中的數據傳輸機制。讓我們先來看看通信的基本單元——“幀”,這對于理解CAN通信至關重要。
CAN定義了四種類型的幀,分別代表不同類型的信息: “數據幀”、“遠程幀”、“錯誤幀”和“過載幀”。
本文將解釋 RFC 的結構和用途,以及與之相關的通信仲裁。
點擊閱讀:車載網絡CAN(一):CAN協議基礎知識
數據框
在CAN通信中,用于發送數據的傳輸格式稱為數據幀。數據幀格式有兩種類型:“標準格式”和“擴展格式”,它們在一些細節上有所不同。
首先,我們從基本標準格式開始。
標準格式
圖 1 顯示了標準格式的數據框結構。

圖1、數據框(標準格式)
圖 1 中上方的線代表“隱性”,下方的線代表“顯性”。當只有顯性基因有線時,它被固定為顯性;當只有隱性基因有線時,它被固定為隱性。另外,當兩側都有線時,顯性或隱性會根據所發送的數據而變化。
每個部分中的數字表示所用位的長度(位長度)。此外,當 CAN 總線沒有通信時,總線處于空閑狀態,稱為“總線空閑”。
當節點發送數據幀時,發送的第一部分處于顯性狀態,以指示幀的開始。這部分稱為“幀起始信號 (SOF) ”。接收節點可以通過 SOF 從隱性變為顯性來同步,此時總線空閑。
在 SOF 之后,會發送一個“ ID(標識符) ”。該 ID 用于識別數據內容和發送節點,但它還有另一個用途:確定通信仲裁的優先級。在標準格式中,ID 為 11 位,但在稍后將介紹的擴展格式中,ID 由一個 18 位的 ID 和一個擴展 ID 組成。11 位長度的 ID 范圍為 0x0 到 0x7FF,因此可以識別 2048 種不同的類型。
ID 之后是“ RTR ”。RTR 代表“遠程傳輸請求”(Remote Transmission Request),用于區分數據幀和遠程幀。對于數據幀,RTR 占主導地位。RTR 與 ID 一樣,也用于通信仲裁。
RTR 之后是“控制字段”,它由保留位 r1 和 r0(均為 1 位)以及 4 位“ DLC(數據長度代碼) ”組成。在標準格式中,保留位 r1 和 r0 都被固定為顯性位。
數據長度控制 (DLC) 指示控制字段之后的“數據字段”中將發送多少字節的數據。DLC 的設置范圍為 0 到 8,數據字段可以以 1 字節為單位發送 0 到 8 字節(0 到 64 位)的數據。數據字段是要發送的數據部分,如上所述,數據長度由 DLC 設置。此外,在數據字段中,所有字節都從最高有效位 (MSB) 開始發送。可以為每個字節設置數據字段的長度,但設計人員可以決定如何分配數據。例如,分配 1 字節數據時,可以將其直接用作 1 個字節,也可以從 4 位中各取 1 位,還可以將剩余的 4 位一起使用,或者從 8 位中各取 1 位。
數據字段之后,會發送一個“ CRC(循環冗余校驗)序列”。該CRC序列長度為15位,發送節點使用發送的SOF、ID、控制字段和數據字段的值計算CRC序列,并將計算結果作為CRC序列發送。接收節點則使用接收到的SOF、ID、控制字段和數據字段的值,以與發送節點相同的方式計算CRC序列,并將結果進行比較,以確定接收是否成功。
在 CRC 序列之后,會發送一個“ CRC 分隔符”。該分隔符指示 CRC 序列的結束,其長度固定為 1 位。CRC 序列和 CRC 分隔符統稱為“ CRC 字段”。
接下來,會發送一個“確認(ACK)時隙”。這個ACK時隙長度為 1 位,發送節點在此時隙發送一個隱性信號。然而,如果接收節點已成功接收到數據直至 CRC 校驗位,則應在 ACK 時隙的時序發送一個顯性信號作為確認。在 CAN 總線中,如果同時發送顯性信號和隱性信號,則顯性信號優先。因此,在通信正常進行的 CAN 網絡中,ACK 時隙是顯性信號。但是,由于 ACK 時隙只有 1 位,因此無法用于確定 CAN 網絡上的所有接收節點是否都已正確接收到數據。它只能表明存在一些節點已成功接收到發送節點發送的數據幀(直至 CRC 校驗位)。
在 ACK 時隙之后,會發送一個“ ACK 分隔符”。該分隔符指示 ACK 時隙的結束,固定為 1 位隱式值。與 CRC 字段一樣,ACK 時隙和 ACK 分隔符統稱為“ ACK 字段”。
數據幀結束時,會發送一個“幀結束符 (EOF) ”。EOF 固定為一個 7 位隱性位。前一篇文章“理解 CAN 協議的基礎知識”中解釋的“位填充規則”適用于從幀結束符 (SOF) 到 CRC 序列結束符之間的所有數據,因此在總線空閑或到達 EOF 時不適用。
數據幀的范圍從幀首 (SOF) 到幀尾 (EOF),但在圖 1 中, EOF 末尾有一個“ ITM(中斷) ”的標記。此 ITM 不包含在數據幀中。ITM 固定為一個 3 位隱性位,總線在 ITM 結束后進入空閑狀態。在 CAN 總線使用的“載波偵聽多路訪問/沖突避免 (CSMA/CA) ”機制中,每個節點只有在總線處于空閑狀態時才能發送數據,但在下一篇文章將要解釋的“過載幀”中,這是唯一可以在 ITM 期間發送的幀。
擴展格式
接下來,我們將解釋“擴展格式”的結構, 這是數據框的另一種格式。
擴展格式的數據框結構如圖 2 所示。與標準格式相比,您應該能夠發現 ID 和 RTR 之間的差異。接下來,我們將重點介紹這些差異。

圖2、數據框(擴展格式)
標準格式中的 ID在擴展格式中稱為“基本 ID ”,長度為 11 位,這部分與標準格式中的相同。
基本 ID 之后是“ SRR(替代遠程請求位) ”,它固定為 1 位隱性位。
在 SRR 之后,會發送一個“ IDE(標識符擴展位) ”,該擴展位也被固定為 1 位隱性位。
擴展 ID 為 18 位,在 IDE 之后發送。基本 ID 和擴展 ID 共同構成 29 位長度的 ID。29 位擴展格式 ID 的范圍為 0x0 到 0x1FFFFFFF,因此可以使用 536870912 種類型(約 5.4 億種類型)。它主要用于 SAE J1939 標準。
遠程幀
接下來,我們將介紹遠程幀。
遠程幀用于請求數據幀,其基本結構與數據幀相同,只是缺少數據字段(或 DLC 設置為 0 且數據字段為 0 字節的數據幀)(圖 3)。
遠程幀的ID設置所請求數據幀的ID,遠程幀的DLC設置所請求數據幀的DLC。遠程幀與數據幀的區別在于,遠程幀的RTR是固定的,且為隱性。這一區別使得我們可以利用RTR來區分數據幀和遠程幀。

圖3、遠程框架
數據幀和遠程幀
CAN 總線的基本通信方法是:需要數據的節點發送遠程幀,相應的節點以數據幀進行響應。遠程幀請求數據,數據幀則返回響應請求的數據(圖 4)。

圖4、數據框和遠程框
使用這種方法時,節點內的微型計算機資源不會被發送和接收占用,資源僅在必要時使用,從而降低總線占用率。但是,當頻繁交換數據時,需要的遠程幀數與所需數據幀數相同,這實際上可能會增加總線占用率。
因此,隨著節點間信息交換量的因控制的日益復雜而急劇增加,一種不同于傳統通信方式的新通信方式應運而生。
下面,我們將探討這種“與傳統方法不同的方法”。
例如,如果使用一個系統,其中每個節點都可以自由發送數據幀,而需要數據幀的節點可以自由接收數據幀,則節點之間的信息交換可以僅使用數據幀來實現,而無需使用遠程幀。

圖5、僅傳輸數據幀
遠程幀和數據幀的交換
“點餐后才上菜的餐廳”
然后,每個節點發送和接收數據幀的方式如下:
“傳送帶壽司”
換句話說,每個節點在需要時都會接收傳送帶上傳輸的數據幀。
溝通調解
CSMA/CA(用于 CAN)的設計目的是防止總線使用期間其他節點發送數據幀或遠程幀。
然而,實際上不可能阻止多個節點同時進行傳輸,因此需要通信仲裁。
在 CAN 中,圖 6 所示的 ID 和 RTR 用于通信仲裁(這里我們將以標準格式為例進行解釋)。

圖6、溝通調解
現在讓我們來看看溝通調解是如何實際進行的。
圖 7 顯示了一個數據幀同時從 ID 為 0x653 和 0x65B 的兩個節點發送的情況。

圖7、溝通調解示例
當數據幀同時發送時,來自多個節點的起始位置相同。SOF 數據幀首先發送,但它被固定為 1 位顯性狀態,總線狀態成為顯性狀態。
每個節點都會監控并比較自己發送的內容與總線狀態,但在 SOF 中,它會判斷自己發送的內容保持不變,并繼續傳輸。
接下來,ID 會一次傳輸一位,但如果多個節點的傳輸位相同,例如,如果多個節點傳輸隱性位,則總線變為隱性,傳輸的內容保持不變。
當不同節點同時發送顯性和隱性信號時,顯性信號優先,總線狀態變為顯性狀態。在這種情況下,發送隱性信號的節點會檢測到自身信號與總線狀態存在差異,導致通信仲裁失敗,并停止發送信號。
因此,如果多個節點同時進行傳輸,則在其他節點進行弱傳輸時,傳輸主導信號的節點將贏得通信仲裁,因此優先級最高的 ID 為 0x0,ID 值越小,優先級越高。
設計者可以像在數據框中分配數據字段一樣自由地分配 ID。但是,必須考慮整個網絡,例如,在通信仲裁期間,為優先級更高的項目分配較小的 ID 值。
基本上,通信仲裁僅使用ID即可完成,那么為什么還要使用RTR進行通信仲裁呢?這是因為如果同時發送了具有相同ID的數據幀和遠程幀,僅使用ID無法進行仲裁。此時,通信仲裁不僅使用ID,還使用RTR,但由于RTR在數據幀中是顯性幀,在遠程幀中是隱性幀,因此數據幀優先。
下一篇文章,我將講解剩下的兩個幀:“過載幀”和“錯誤幀”,以及錯誤處理。更多內容,關注牛喀網,學習更多汽車科技。有興趣的朋友,可以添加牛小喀微信:NewCarRen,加入專家社群參與討論。

(添加微信號NewCarRen咨詢)
