CAN 代表控制器區域網路 (Controller Area Network)。這種通訊方式存在於多種類型的系統中,最常見的是汽車系統。這些系統通常由相互通訊的有線控制器(微處理器/微控制器)組成。目前存在允許無線通訊的協定和方法,但有線通訊更為常見。與 SPI、I2C、USB 和其他類似格式不同,CAN Bus 使用截然不同的格式進行資料通訊。 CAN Bus 基於差分電壓電平:
有兩根用於通訊的電線可同時傳輸資料。它們分別稱為 CAN Hi(High)和 CAN Lo(Low),並具有不同的電壓電平,由各個控制器(稱為 CAN Node 節點)進行解釋。 CAN Hi 的測量範圍通常為 2.5V 至 3.75V,而 CAN Lo 的測量範圍為 2.5V 至 1.25V。當兩條電線的讀數均為 2.5V 時,此訊號稱為“Recessive 隱性”,相當於二進位值 1。當 CAN Hi 變成 3.75V 而 CAN Lo 變成 1.25V 時,訊號稱為“Dominant 顯性”,相當於二進位值 0。從概念上講,在談論 0 為 Low、1 為 High 的數位邏輯時,這可能沒有意義,但協議正在尋找 0 值而不是 1 值。因此,驅動邏輯與典型的數位邏輯解釋相反。
基本接線圖
該協議的佈線有一些獨特的地方。 CAN Bus 相對於單線協定的一個優點是,節點斷開後其他節點不會發生故障。如果某個節點的 CAN Hi 或 CAN Lo 線路被切斷,系統的其餘部分不會受到影響,仍然會向其他節點發送資料。有些系統可能能夠在主線路發生故障時透過一條線路傳輸數據,但這取決於公司(並非所有系統都能在 CAN Hi 或 CAN Lo 線路發生故障時運作)。然而,能夠處理線路切斷的系統性能會受到影響,因為 120Ω 電阻有兩個用途。首先,它們提供 Hi 和 Lo 之間的差分,並為具有更高頻率的系統匹配阻抗。該協議在差分電壓下工作效果最佳。交叉線(雙絞線)也有兩個用途。首先,它們有助於阻止來自外部來源的 EMI 輻射。其次,當協定以更快的頻率傳輸時,它們也有助於解決 EMI 問題。
請注意,沒有其他線路,這表示 packets 資料包(訊息)會同時傳送到所有節點。 CAN 訊息資料幀中沒有“位址”,但資料幀中有一些方法可以確定每個節點接受或拒絕哪些訊息,以及使用者定義的某些訊息的優先順序。資料必須設定位元以避免與其他訊息衝突,因此優先順序是 CAN Bus 避免該問題的關鍵。
CAN Bus 數據格式
與所有協議一樣,數據以既定標準定義的特定方式組織。 CAN Bus 協定始於 CAN 2.0,更新至 ISO 11898,並且仍在不斷發展(該協定有擴展版本,用於傳輸更長的報文)。整個 CAN 幀通常長度為 14 bytes。以下是 CAN Message 的拆解:
-
SOF (Start of Frame):這標誌著一條新的 CAN 訊息的開始,使 Bus 線上的其他節點能夠同步。
-
Arbitration Field (仲裁字段) 是一個標識符,包含一個 11-bit ID 和一個 bit 用於 RTR (Remote Transit Request 遠端傳輸請求)。如果向另一個節點請求訊息,則 RTR 設定為顯性位。其他節點關注的是 ID,因為它們決定了每個節點是否關注該訊息。可以將 ID 視為一個偽地址,其行為類似於「主題」。如果其他節點不關注該“主題”,它們將忽略該訊息。不僅如此,ID 還決定了優先級,以避免碰撞。如果同時進行通信,節點首先等待線路空閒(隱性)。如果一個節點輸出隱性電平,而另一個節點輸出顯性電平,則顯性電平始終具有更高的優先權。示例如下。
範例:
節點1 訊息:0011 0110 0000…
節點2 訊息:0010 1000 1100…
從右到左,節點2 訊息的第四位將首先發送,因為第四位上出現了顯性「0」。節點1 感知到這種情況後,停止發送訊息,並等待線路空閒。
- R0 用於未來開發。
- 資料長度代碼為半 byte 長度,指示資料欄位中實際發送資料的長度。
- 資料欄位包含您想要傳送給其他節點進行程式設計所需的資料。
- CRC (Cyclic Redundancy Check 循環冗餘校驗)用於錯誤檢測。如果沒有錯誤,則該 bit 將被顯性電平覆蓋。
- ACK (Acknowledge 確認)是一個隱性位,用於確認沒有錯誤(如果有錯誤,則為顯性電平)。
- EOF (End of Frame)是一個 7-bit 字段,用於指示 CAN 訊息幀的結束並禁用位元填充(同步資料)。
- iFS (interframe space 幀間間隔)是另一個 7-bit 字段,用作延遲,以便接收節點可以將資訊移動到單獨的緩衝區。
CAN 訊息訊框中有 5 種糾錯機制。其中 2 種是位級糾錯機制,3 種是訊息級糾錯機制。位元監控和位元填充是位元級糾錯機制。位元監控由每個節點執行,並監控是否有錯誤(在仲裁欄位中完成),錯誤以特定方式標記。另一種位級糾錯機制是位元填充。如果在訊息中發送了 5 個相同等級的位,則會新增第六個相反等級的位元(R 或 D),這允許與傳送器同步。接收器可以輕鬆刪除該位,因為每個節點都期望收到這個額外的位元。
兩種訊息級機制是訊框校驗和 CRC/ACK 欄位。幀校驗會驗證所有 CAN 部件是否存在,以及 ACK 和 CRC 之後是否存在隱性位元。出現錯誤時,有兩個閾值。當第一個錯誤發生時,一個位元被設定為顯性位,該位元會作為標誌位遞增節點的計數器。如果計數器僅為 1,則會發送隱性錯誤標誌,總線上的通訊將照常進行。但是,如果計數器達到 2,則表示存在嚴重錯誤,節點將關閉。如果訊息發送成功且無錯誤,計數器會減少。
如果您想自行嘗試 CAN 總線,可以使用以下幾款評估板: