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

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

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

圖3、遠(yuǎn)程框架
數(shù)據(jù)幀和遠(yuǎn)程幀
CAN 總線的基本通信方法是:需要數(shù)據(jù)的節(jié)點(diǎn)發(fā)送遠(yuǎn)程幀,相應(yīng)的節(jié)點(diǎn)以數(shù)據(jù)幀進(jìn)行響應(yīng)。遠(yuǎn)程幀請求數(shù)據(jù),數(shù)據(jù)幀則返回響應(yīng)請求的數(shù)據(jù)(圖 4)。

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

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

圖6、溝通調(diào)解
現(xiàn)在讓我們來看看溝通調(diào)解是如何實際進(jìn)行的。
圖 7 顯示了一個數(shù)據(jù)幀同時從 ID 為 0x653 和 0x65B 的兩個節(jié)點(diǎn)發(fā)送的情況。

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

(添加微信號NewCarRen咨詢)
