一:概述
CAN協議,全稱為Controller Area Network,是一種重要的車用網路通訊協議。它由德國公司博世(Bosch)設計,首次在1986年公佈,並在1991年正式釋出為標準。CAN協議被設計用於允許車輛上的微控制器和裝置之間無主機的通訊。
CAN協議的主要用途包括:
-
車輛內部通訊:CAN協議最初就是為了汽車內部的電子裝置之間的通訊而開發的。它使得汽車內部的各種感測器、執行器、控制單元等能夠交換資訊,而無需複雜的線束或者中央控制器。
-
工業自動化:隨著時間的發展,CAN協議也被廣泛應用於工業自動化領域。許多工業裝置和系統利用CAN進行資料交換,以實現自動化控制和監測。
-
醫療裝置:一些醫療裝置也採用CAN協議來確保可靠的資料通訊。
-
其他嵌入式系統:除了汽車和工業自動化,CAN協議也被用於各種嵌入式系統的通訊,例如航空電子裝置、海上導航系統等。
CAN協議因其高可靠性、實時性和低成本而在這些領域得到了廣泛的應用。它支援多主通訊和錯誤檢測機制,能夠在高噪聲環境下有效地進行通訊,這對於汽車和工業環境來說是至關重要的。
二:CAN的工作原理
CAN在 OSI 參考模型中的對映如下:
-
物理層(Physical Layer):CAN 使用差分訊號在匯流排上傳輸資料,定義了物理層的電氣特性,如電壓電平、電纜長度等。
-
資料鏈路層(Data Link Layer):CAN 協議主要在資料鏈路層進行定義,包括:
- 幀格式:定義了 CAN 幀的不同型別,如資料幀、遠端幀、錯誤幀等。
- 訪問控制:採用 CSMA/CR(Carrier Sense Multiple Access with Collision Resolution)機制,支援多個節點爭用匯流排並透過仲裁解決衝突。
- 差錯檢測:包括位錯誤、幀錯誤、確認錯誤等,並定義了錯誤處理機制。
-
網路層(Network Layer)和更高層:CAN 協議主要集中在物理層和資料鏈路層,並沒有定義網路層和更高層的內容。這些功能需要由上層協議(如 CANopen、DeviceNet 等)來實現。
-
應用層(Application Layer):CAN 協議本身不定義應用層的內容,而是由上層協議(如 CANopen、DeviceNet)來定義應用層的功能,如報文格式、網路管理等。
總的來說,CAN 協議主要在 OSI 模型的物理層和資料鏈路層進行定義,為上層協議提供可靠的序列匯流排通訊服務。上層協議則負責實現網路層及以上的功能。這種分層設計使 CAN 協議靈活適用於不同的應用場景。
物理結構
CAN (Controller Area Network) 匯流排一般由以下幾根線組成:
CAN_H(CAN High)線
這是 CAN 匯流排的正訊號線。
CAN_L(CAN Low)線
這是 CAN 匯流排的負訊號線。
接地線(GND)
提供 CAN 匯流排及其連線裝置的公共參考地。
終端電阻
為了防止訊號反射而導致的訊號失真,CAN 匯流排的兩端需要連線 120Ω 的終端電阻。
電源線(Vcc)
用於為 CAN 節點提供電源。有時也會與 CAN 介面共用電源。
因此,一個標準的 CAN 匯流排由以下 4 根線組成:
- CAN_H
- CAN_L
- GND
- 終端電阻
+--+ +--+ +--+
| | | | | |
CAN_H CAN_L GND
| | | | | |
+--+ +--+ +--+
| | |
120Ω 120Ω Vcc
這樣的匯流排結構可以實現可靠的差分訊號傳輸,並提供公共地參考,確保 CAN 通訊的穩定性和抗干擾性。
CAN匯流排協議有 ISO-11898 和 ISO-11519兩個系列。其定義有:
ISO-11898 定義了通訊速率為 125 kbps ~1Mbps 的高速 CAN 通訊標準,屬於閉環匯流排,傳輸速率可達1Mbps,匯流排長度 ≤ 40米。
ISO11519 定義了通訊速率為 10~125 kbps 的低速 CAN 通訊標準,屬於開環匯流排,傳輸速率為40kbps時,匯流排長度可達1000米。
如下圖所示
多主工作方式
CAN 匯流排支援多主工作方式,也就是說多個節點可以同時作為主裝置來傳送資料幀。這種多主工作方式的實現原理如下:
-
仲裁機制:
- CAN 使用 CSMA/CR (Carrier Sense Multiple Access with Collision Resolution) 的匯流排訪問機制。
- 當多個節點同時開始傳送時,透過比較傳送的位來解決衝突,優先順序高的節點繼續傳送,優先順序低的節點退出。
-
優先順序機制:
- CAN 幀頭部包含一個 11 位或 29 位的 ID 欄位,用於標識幀的優先順序。
- ID 值越小,優先順序越高。當多個節點同時傳送不同優先順序的幀時,優先順序高的幀會獲得匯流排使用權。
-
仲裁過程:
- 當多個節點同時開始傳送時,會比較自己傳送的 ID 位與匯流排上觀察到的位電平。
- 如果匯流排上的位電平比自己傳送的位電平高(即"0"比"1"高),則該節點會立即停止傳送,退出仲裁過程。
- 最終獲勝的節點繼續傳送完整的資料幀。
透過這種基於 ID 優先順序的仲裁機制,CAN 匯流排可以支援多個節點同時作為主裝置傳送資料幀,不同優先順序的幀可以得到合理的排程。
這種多主工作方式具有以下特點:
- 靈活性強:任何節點都可以主動傳送資料幀,無需中央控制裝置。
- 可靠性高:透過仲裁機制解決了多個節點同時傳送的衝突。
- 實時性強:優先順序機制確保了重要資料幀得到及時傳輸。
因此,CAN 匯流排的多主工作方式非常適合於對實時性和可靠性要求較高的分散式控制系統。
工作狀態
CAN 匯流排節點主要有以下幾種工作狀態:
-
錯誤主動狀態(Active Error State)
- 節點在正常工作時的預設狀態。
- 可以正常傳送和接收資料幀。
-
錯誤被動狀態(Passive Error State)
- 當節點檢測到太多錯誤時,會進入該狀態。
- 此時節點仍然可以接收資料幀,但不能主動傳送資料幀。
-
匯流排關閉狀態(Bus Off State)
- 當節點檢測到更多的錯誤時,會進入此狀態。
- 此時節點完全與匯流排隔離,既不能傳送也不能接收資料。
-
重新初始化狀態(Initialization State)
- 節點上電或復位後進入此狀態。
- 初始化完成後進入錯誤主動狀態。
-
掛起狀態(Suspend State)
- 節點進入低功耗模式時進入此狀態。
- 此時節點保持靜默,不參與匯流排通訊。
總之,CAN 節點的工作狀態主要體現了其對錯誤的容忍程度和參與匯流排通訊的能力。透過這些狀態的切換,CAN 協議可以實現錯誤隔離,確保匯流排上其他節點的正常工作。
三:CAN的資料幀格式
CAN (Controller Area Network) 協議一共規定了 4 種標準幀格式:
-
標準資料幀(Standard Data Frame)
- 11 位 ID 欄位表示幀的優先順序。
-
擴充套件資料幀(Extended Data Frame)
- 29 位 ID 欄位表示幀的優先順序。
-
標準遠端幀(Standard Remote Frame)
- 11 位 ID 欄位表示幀的優先順序。
- 沒有資料區,用於請求其他節點傳送資料。
-
擴充套件遠端幀(Extended Remote Frame)
- 29 位 ID 欄位表示幀的優先順序。
- 沒有資料區,用於請求其他節點傳送資料。
除了這 4 種標準幀格式外,CAN 協議還定義了以下 2 種特殊幀格式:
-
錯誤幀(Error Frame)
- 用於通知其他節點發生通訊錯誤。
-
過載幀(Overload Frame)
- 用於在資料幀或遠端幀之間插入延遲。
總的來說,CAN 協議共定義了 6 種不同型別的幀格式,分別用於資料傳輸、錯誤處理以及通訊控制等目的。這些幀格式共同構成了 CAN 匯流排上的通訊機制。
資料幀
CAN (Controller Area Network) 協議定義了幾種不同型別的幀格式,其中最重要的是資料幀。CAN 資料幀的格式如下:
-
開始幀(SOF - Start of Frame)
- 1 個隱性位(1),表示幀的開始。
-
仲裁欄位(Arbitration Field)
- 11 位 ID(標準幀)或 29 位 ID(擴充套件幀),用於標識幀的優先順序。
- 1 位 RTR(遠端傳輸請求)位,標識是資料幀還是遠端幀。
- 1 位 IDE(擴充套件 ID 使能)位,標識是標準幀還是擴充套件幀。
-
控制欄位(Control Field)
- 4 位 DLC(資料長度程式碼),表示資料區的長度。
- 3 位保留位。
-
資料欄位(Data Field)
- 0~8 個位元組的資料。
-
CRC 欄位(CRC Field)
- 15 位 CRC 校驗碼。
- 1 位 CRC 分隔符。
-
確認欄位(ACK Field)
- 1 位 ACK 槽,由傳送節點傳送隱性位。
- 1 位 ACK 分隔符。
-
結束幀(EOF - End of Frame)
- 7 個隱性位,表示幀的結束。
-
間隙(Intermission)
- 3 個隱性位,表示兩幀之間的間隔。
上述各個欄位組成了完整的 CAN 資料幀。其中 ID 欄位用於確定幀的優先順序,DLC 欄位指示資料區的長度,資料區包含實際要傳輸的資料。CRC 和 ACK 欄位用於保證資料傳輸的可靠性。
擴充套件幀
在擴充套件幀中,仲裁欄位的資訊被擴充:
- 1 位 SRR(Substitute Remote Request),保留為隱性位。
- 18 位 Extended Identifier$ (EID[17:0])$(EID[17:0]),組成 29 位 ID。
- 1 位 IDE(ID Extension),設定為顯性位(0)表示是擴充套件幀。
- 1 位 RTR(Remote Transmission Request),標識是資料幀還是遠端幀。
與標準幀格式相比,擴充套件幀主要有以下區別:
- ID 欄位擴充套件為 29 位,可以表示更多的優先順序。
- 增加了 SRR 位用於保留。
- IDE 位被設定為顯性位(0)以標識為擴充套件幀。
遠端幀
CAN (Controller Area Network) 遠端幀的格式如下:
-
開始幀(SOF - Start of Frame)
- 1 個隱性位(1),表示幀的開始。
-
仲裁欄位(Arbitration Field)
- 11 位 ID(標準幀)或 29 位 ID(擴充套件幀),用於標識幀的優先順序。
- 1 位 RTR(遠端傳輸請求)位,這裡設定為 1 表示是遠端幀。
- 1 位 IDE(擴充套件 ID 使能)位,標識是標準幀還是擴充套件幀。
-
控制欄位(Control Field)
- 4 位 DLC(資料長度程式碼),這裡設定為要請求的資料長度。
- 3 位保留位。
-
CRC 欄位(CRC Field)
- 15 位 CRC 校驗碼。
- 1 位 CRC 分隔符。
-
確認欄位(ACK Field)
- 1 位 ACK 槽,由傳送節點傳送隱性位。
- 1 位 ACK 分隔符。
-
結束幀(EOF - End of Frame)
- 7 個隱性位,表示幀的結束。
-
間隙(Intermission)
- 3 個隱性位,表示兩幀之間的間隔。
需要注意的是,遠端幀沒有資料區,只包含 ID、RTR、DLC 等欄位。其主要作用是請求其他節點傳送指定長度的資料。
當接收到遠端幀時,被請求的節點會響應傳送對應的資料幀。這樣實現了主從式的資料交換,滿足了一對多節點之間的輪詢通訊需求。
錯誤幀
CAN (Controller Area Network) 協議定義了錯誤幀的格式,以及針對不同型別錯誤的處理機制。
CAN 錯誤幀的格式如下:
-
錯誤標誌(Error Flag)
- 由 6 個連續的相同位組成,可以是顯性位(0)或隱性位(1)。
-
錯誤分隔符
- 8 個隱性位,用於將錯誤標誌與下一個幀分隔開。
CAN 協議定義了以下幾種錯誤型別:
-
位錯誤(Bit Error)
- 當節點在傳送某位時,檢測到匯流排上的電平與自己傳送的電平不一致。
- 發生位錯誤時,節點會立即傳送錯誤標誌。
-
格式錯誤(Form Error)
- 當節點檢測到幀格式不正確時,如 SOF 位不是隱性、EOF 位不是隱性等。
- 發生格式錯誤時,節點會立即傳送錯誤標誌。
-
確認錯誤(Acknowledgement Error)
- 當節點在傳送幀時,沒有收到其他節點的確認。
- 發生確認錯誤時,節點會立即傳送錯誤標誌。
-
CRC 錯誤(CRC Error)
- 當接收到的 CRC 校驗碼與計算的不一致時。
- 發生 CRC 錯誤時,節點會立即傳送錯誤標誌。
當任何節點檢測到錯誤時,都會立即傳送錯誤標誌。其他節點收到錯誤標誌後,也會立即停止正在傳送的幀,並自己傳送錯誤標誌。
透過這種錯誤幀機制,CAN 協議能夠快速檢測和隔離錯誤,確保匯流排上其他節點的正常工作。出現錯誤的節點也會根據錯誤計數器進入錯誤被動狀態或匯流排關閉狀態,避免其持續干擾匯流排通訊。
過載幀
CAN (Controller Area Network) 的過載幀用於在資料幀或遠端幀之間插入延遲,其格式如下:
-
過載標誌(Overload Flag)
- 由 6 個連續的顯性位(0)組成。
-
過載分隔符(Overload Delimiter)
- 8 個隱性位(1)。
當 CAN 節點檢測到以下情況時,會傳送過載幀:
- 在接收到資料幀或遠端幀後,在預期的 3 個隱性位間隙時間內還沒有檢測到新幀的開始。
- 在傳送資料幀或遠端幀過程中,檢測到匯流排被佔用。
傳送過載幀的節點會延遲傳送下一個資料幀或遠端幀,以給其他節點更多的時間進行同步和準備。
接收過載幀的其他節點會:
- 停止正在傳送的幀。
- 重新開始計時,等待下一個幀的到來。
過載幀的使用有以下作用:
- 給忙碌節點一些喘息時間,避免佇列溢位。
- 確保節點之間的同步,防止錯誤發生。
- 提高匯流排利用率,避免因短暫的匯流排佔用而造成不必要的幀間隔。
CAN 的過載幀機制是為了確保匯流排通訊的連續性和可靠性,是 CAN 協議實現高效、實時通訊的重要保障。
四:CANOpen協議
CANopen 是基於 CAN 匯流排協議的上層應用協議,主要用於工業自動化和移動機械領域。它為 CAN 匯流排網路提供了更高層次的功能和服務。
1. 物件字典
物件字典是指含有描述的CANopen節點的行為的所有引數的標準化結構。
透過16位索引和8位子索引查詢OD條目。例如,符合CANopen的節點OD的索引1008(子索引0)包含節點裝置名。
具體來說,物件字典中的條目由屬性定義:
- 索引:物件的16位基址
- 物件名稱:製造商裝置名稱
- 目的碼:陣列,變數或記錄
- 資料型別:例如VISIBLE_STRING或UNSIGNED32或記錄名稱
- 訪問: rw(讀/寫),ro(只讀),wo(只寫)
- 類別:指示此引數是否為必需/可選(M / O)
重要的是,裝置(例如從裝置)的OD條目可以由其他裝置(例如主機)使用SDO透過CAN進行訪問。
例如,這可能使應用程式主機更改從屬節點是否透過特定的輸入感測器記錄資料,或者從屬傳送心跳的頻率。
連結到電子資料表和裝置配置檔案
要了解OD,檢視電子資料表EDS
和裝置配置檔案DCF
會很有幫助。
2. 通訊服務
CANopen 協議中定義了以下幾種主要的通訊服務:
-
過程資料物件(Process Data Object, PDO)
- 用於實時、週期性地傳輸過程資料。
- 分為傳送 PDO (TPDO) 和接收 PDO (RPDO)。
- 可以配置為同步或非同步傳輸模式。
- 傳輸速度快,但有限制資料長度(最多 8 位元組)。
-
服務資料物件(Service Data Object, SDO)
- 用於點對點的資料讀寫操作。
- 可以讀取或寫入物件字典中的任何物件。
- 傳輸速度較慢,但資料長度沒有限制。
- 包含請求/響應的事務機制。
-
同步物件(Synchronous Object, SYNC)
- 用於在 CANopen 網路中同步資料傳輸。
- 可以觸發 TPDO 的週期性傳輸。
- 也可以用於同步其他事件,如取樣、控制等。
-
緊急物件(Emergency Object, EMCY)
- 當節點出現錯誤時,用於傳送緊急通知。
- 傳輸速度較快,可以及時通知其他節點。
- 錯誤程式碼和錯誤暫存器包含在 EMCY 物件中。
-
時間戳物件(Time Stamp Object, TIME)
- 用於在 CANopen 網路中傳遞時間資訊。
- 可用於同步網路節點的時鐘。
-
心跳物件(Heartbeat Object)
- 用於監控節點的工作狀態。
- 每個節點週期性地傳送自身的狀態資訊。
- 其他節點可以檢測是否有節點失去響應。
這些通訊服務共同構成了 CANopen 協議的通訊模型,滿足了工業自動化場景下對實時性、可靠性、可配置性等方面的需求。
透過合理配置這些通訊物件,CANopen 網路可以實現裝置之間高效、可靠的資料交換,為上層應用提供堅實的通訊基礎。