控制器區域網（，簡稱 CAN 或者 CAN bus）是一種功能豐富的標準。被設計用於在不需要主機（Host）的情況下，允許網路上的微控制器和儀器相互通訊。 它基於訊息傳遞協議，設計之初在車輛上採用複用通訊線纜，以降低銅線使用量，後來也被其他行業所使用。 CAN 建立在基於資訊導向傳輸協定的廣播機制（Broadcast Communication Mechanism）上。其根據資訊的內容，利用資訊標誌符（Message Identifier，每個標誌符在整個網路中獨一無二）來定義內容和訊息的優先順序進行傳遞，而並非指派特定站點位址（Station Address）的方式。 因此，CAN 擁有了良好的彈性調整能力，可以在現有網路中增加節點而不用在軟、硬體上做出調整。除此之外，訊息的傳遞不基於特殊種類的節點，增加了升級網路的便利性。 歷史 羅伯特博世公司於 1983 年開發了控制器區域網（CAN bus）。該協議於 1986 年美國密歇根州底特律市舉行的國際汽車工程師學會（SAE）會議上正式發表。第一個 CAN 控制晶片，由英特爾和飛利浦生產，並且於 1987 年釋出。 世界上第一臺裝載了基於 CAN 的多重線系統的汽車是 1991 年推出的梅賽德斯 賓士 W140。 博世公司發表了關於 CAN 規範的幾個版本，最新的 CAN 20 於 1991 年釋出。該規範被分為兩部分；A 部分適用於使用 11 位識別符號的標準格式，B 部分適用於使用 29 位標誌符的拓展格式。使用 11 位識別符號的 CAN 裝置一般被稱作 CAN 20A，而使用 29 位識別碼的 CAN 裝置通常稱為 CAN 20B。博世公司免費提供標準、規範和白皮書。Bosch Semiconductor CAN Literature 1993 年，國際標準化組織（ISO）公佈了 CAN 標準 ISO11898。後來 CAN 標準被重新編譯分成兩個部分：ISO118981 涵蓋了資料鏈路層；ISO118982 涵蓋了高速 CAN 匯流排的物理層； ISO118983 於晚些時候公佈並且涵蓋了低速 CAN 匯流排的物理層和 CAN 匯流排容錯規範。 物理層標準 ISO118982 和 ISO118983 並不包含在博世 CAN20 規範中，它們可以單獨從 ISO 購買。 之後，博世公司仍然積極地拓展 CAN 標準。2012 年，博世公佈 CAN FD 10 或稱作可變資料速率的 CAN。這個規範使用不同的架構，允許在仲裁之後，切換至更快的位元率，傳輸不同的資料的長度。CAN FD 相容現有的 CAN 20 網路，所以新的 CAN FD 裝置能夠與現有 CAN 裝置共存於同一控制網路。 CAN 匯流排是五個使用在車載診斷 OBDII 標準的協議的其中一個。1996 年以後，所有在美國銷售的汽車及輕型卡車被強制要求符合 OBDII 標準。在歐盟，自 2001 年後銷售的汽油載具及 2004 年後銷售的柴油載具都強制規定需要符合 EOBD 標準。Building Adapter for Vehicle Onboard Diagnostic obddiagnet accessed 20090909 應用 CAN 匯流排通常應用於如下領域 乘用車、卡車、公共汽車（汽油車及電動車） 航空、航海電子儀器 工業自動化及機械控制 電梯、扶梯 建築自動化 醫療儀器及裝置 汽車 現代的汽車可能為其子系統配備多達 70 個電子控制器（ECU）。Comparison of EventTriggered and TimeTriggered Concepts with Regard to Distributed Control Systems A Albert Robert Bosch GmbH Embedded World 2004 Nürnberg 最常見的控制器為發動機控制器。除此以外，變速器、安全氣囊、防鎖死煞車系統 ABS、定速巡航、動力方向盤、音響系統、、車門、後視鏡調整、電池和混合動力電動汽車的充電系統等等均使用電子控制器。這其中，有的是獨立的子系統，有些需要跟其他子系統進行通訊，控制驅動器或接收感測器的反饋資訊。為此設計了控制器區域網絡，將汽車的不同系統相互連線在一起。傳統的 電纜直連 成本高，佈線複雜，而控制器區域網絡僅需軟體就可實現，不僅安全、經濟還十分便利。 自動啟動 停止：車輛各處的各種感測器（速度感測器、轉向角、空調關閉，發動機溫度）所發出的各種訊號可由 CAN 匯流排收集並用於決定是否可以在停車時關閉發動機，進而改善燃油效率和尾氣排放。 電子駐車制動系統：斜坡駐車 的功能需要車輛的傾斜感測器（同時用於防盜報警器）和道路的速度感測器（同時用於防鎖死制動、發動機控制和牽引力控制）透過 CAN 匯流排傳輸取樣訊號並決定車輛是否停在斜坡上。同樣，安全帶的感測器 安全氣囊的一部分 透過 CAN 匯流排傳輸訊號，以確定安全帶是否扣上，然後泊車的剎車會自動在移動時關閉。 ：當司機切換至倒檔，變速器控制單元可以透過 CAN 匯流排傳送訊號，啟用停車感測器系統和車門控制模組，使副駕駛側的後視鏡向下傾斜顯示路涯。 CAN 匯流排也可以從雨水感測器獲取訊號，在倒車時自動觸發後擋風玻璃雨刮。 車道偏離警示 ：車道偏離警示 駐車感測器的訊號也可透過 CAN 匯流排用於駕駛輔助系統判斷附近物體，比如車道偏離警示。最近，這些訊號可以透過 CAN 匯流排觸發防撞系統中的電子剎車系統。 汽車剎車清掃：雨水感測器 主要用於自動擋風玻璃雨刷 透過 CAN 匯流排將訊號送達防抱死制動系統模組中，在行駛中輕微觸發一次人體不會察覺的剎車來清除剎車片上的液體。奧迪和寶馬的某些高效能型號搭配有這一功能。 近些年又開發出了 LIN（區域網際網路絡）標準，用在非關鍵系統中的應用，例如空調和資訊娛樂系統等資料傳輸速度和可靠性不是很重要的系統中。 其他 CAN 匯流排協議自 2009 年後被用於禧瑪諾 DI2 的公路腳踏車電子變速系統上。同樣的，Ansmann 和在它們的直驅電機中使用 CAN 協議。 由於 CAN 控制器和處理器價格低廉，CAN 匯流排同樣可應用於普通自動化環境的現場匯流排中。 包括在內的開發商致力於使用 CAN 匯流排資料在 GT 賽車 6 中利用遊戲內的 GPS 資料，重建真實的賽車視覺動態模糊，玩家將獲得真實的賽車動態模糊效果。 約翰霍普金斯大學應用物理學實驗室的模組化假肢（MPL）使用局域 CAN 匯流排使假肢上的伺服電機和控制器的溝通更容易。 架構 CAN 是一個用於連線電子控制單元（ECU）的序列匯流排標準。電子控制單元有時也被稱作節點。CAN 網路上需要至少兩個節點才可進行通訊。節點的複雜程度可以只是簡單的輸入輸出裝置，也可以是包含有 CAN 互動器並搭載了軟體的嵌入式元件。節點還可能是一個閘道器，允許普通計算機透過 USB 或乙太網埠與 CAN 網路上的裝置通訊。 所有節點透過兩根平行的匯流排連線在一起。兩條電線組成一條雙絞線，並且接有 120Ω 的特性阻抗。 ISO 118982，也稱為高速度 CAN。它在匯流排的兩端均接有 120Ω 電阻。 高速 CAN 匯流排在傳輸顯性（0）訊號時，會將 CAN_H 端抬向 5V 高電平，將 CAN_L 拉向 0V 低電平。當傳輸隱性（1 訊號時，並不會驅動 CAN_H 或者 CAN_L 端。 顯性訊號 CAN_H 和 CAN_L 兩端差分標稱電壓為 2V。 終端電阻在沒有驅動時，將差分標稱電壓降回 0V。顯性訊號（0）的共模電壓需要在 15V 到 35V 之間。隱性訊號（1）的共模電壓需要在 12V。 ISO 118983，也被稱作低速或者容錯 CAN。它使用線性主線，星形主線或者連線到一個線性主線上的多星結構主線著稱。每個節點都有終端電阻作為全域性終端電阻的一部分。全域性終端電阻不應低於 100 Ω。 低速 容錯 CAN 訊號在傳輸顯性訊號（0）時，驅動 CANH 端抬向 5V，將 CANL 端降向 0V。在傳輸隱性訊號（1）時並不驅動 CAN 匯流排的任何一端。在電源電壓 Vcc 為 5V 時，顯性訊號差分電壓需要大於 23V，隱性訊號的差分電壓需要小於 06V。CAN 匯流排兩端未被驅動時，終端電阻使 CANL 端迴歸到 RTH 電壓（當電源電壓 Vcc 為 5V 時，RTH 電壓至少為 Vcc03V47V），同時使 CANH 端迴歸至 RTL 電壓（RTL 電壓最大為 03V）。兩根線需要能夠承受 27V 至 40V 的電壓而不被損壞。 在高速和低速 CAN 中，從隱性訊號向顯性訊號過渡的速度更快，因為此時 CAN 線纜被主動積極地驅動。顯性向隱性的過渡速度主要取決於 CAN 網路的長度和導線的電容。 高速 CAN 通常被用於汽車和工業應用，在這些應用環境中，匯流排通常從一端橫跨至另一端。容錯 CAN 匯流排則經常被用在需要連線在一起的一組節點。 ISO 規格只要求匯流排共模電壓必須保持在最小和最大範圍內，但不定義如何將匯流排電壓保持在這個範圍。 CAN 匯流排必須使用終端電阻。終端電阻可以用來抑制，同時可以使匯流排電壓回到隱性狀態或者閒置狀態。 高速 CAN 在匯流排兩端使用 120Ω 電阻。低速 CAN 在每個節點均使用電阻。也有其他型別的終端，例如中定義了終端偏壓電路。 終端偏壓電路使用由 4 條導線組成的線纜，除了 CAN 訊號線以外還有電源線和地線。這在每段匯流排兩端提供自動偏壓和終端功能。ISO11783 網路是專為熱拔插匯流排段和電子控制單元設計的。 每個節點需要 中央處理器、微處理器或主處理器 處理主機決定收到的資訊的意思以及想要傳輸的資訊。 感測器、驅動器和控制裝置可以與主處理器連線。 CAN 控制器；通常是整合微控制器的一部分 接收：CAN 控制器將從總線上接收的串位位元組儲存直到整個訊息可用，之後主處理器可以獲取這個訊息（通常由於 CAN 控制器觸發一箇中斷）。 傳送：主處理器傳送傳遞資訊到 CAN 控制器，之後當匯流排空閒時將串位資訊傳遞至匯流排。 收發器；由 ISO1189823 介質訪問單元（MAU）標準定義 接收：把資料流從 CAN 匯流排層轉換成 CAN 控制器可以使用的標準。 CAN 控制器通常配有保護電路。 傳輸：把來自 CAN 控制器的資料流轉換至 CAN 匯流排層。 每個節點能夠傳送和接收資訊，但不是同時進行的。 一個訊息或幀主要包括識別符號 ID，它表示資訊的優先順序，最多八個資料位元組。CRC、ACK 和其他幀部分也是訊息的一部分。改進了的 CAN FD 將每個幀拓展至最多 64 位元組。 訊息採用不歸零 NRZ 格式串聯傳送到主線並可被所有節點接收。 被 CAN 網路連線的裝置通常是感測器，驅動器和其他控制裝置。 這些裝置透過一箇中央處理器、一個 CAN 控制器，和一個 CAN 接收器連線至匯流排。 資料傳輸 CAN 資料傳輸如果出現爭執，將會使用無損位仲裁解決辦法。該仲裁法要求 CAN 網路上的所有節點同步，對每一位的取樣都在同一時間。這就是為什麼有人稱之為 CAN 同步。然而，同步這個術語在此並不精確，因為資料以非同步格式傳輸而不包含時鐘訊號。 CAN 規範中使用術語 顯性 位和 隱性 位來表示邏輯高低。顯性是邏輯 0 由發信器積極驅動透過電壓 而隱性是邏輯 1 被動地透過電阻返回到一個電壓。 閒置狀態代表隱性的水平，也就是邏輯 1。如果一個節點發送了顯性位而另一個節點發送一個隱性位，那麼總線上就有衝突，最終結果是顯性位 獲勝。這意味著，更高優先順序的資訊沒有延遲。較低優先順序的節點資訊自動在顯性位傳輸結束，6 個時鐘位之後嘗試重新傳輸。這使得 CAN 適合成為一個即時優先通訊系統。 邏輯 0 或 1 的確切電壓取決於所使用的物理層，但 CAN 的基本原則要求每個節點監聽 CAN 網路上的資料，包括髮信節點本身。如果所有節點都在同時傳送邏輯 1，所有節點都會看到這個邏輯 1 訊號，包括髮信節點個接受節點。如果所有發信節點同時傳送邏輯 0 訊號，那麼所有節點都會看到這個邏輯 0 訊號。當一個或多個發信節點發送邏輯 0 訊號，但是有一個或多個發信節點發送了邏輯 1 訊號，所有節點包括髮送邏輯 1 訊號的節點也會看到邏輯 0 訊號。當一個節點發送邏輯 1 訊號但是看到一個邏輯 0 訊號，它會意識到線上有爭執並退出發射。透過這個過程，任何傳送邏輯 1 的節點在其他節點傳送邏輯 0 時退出或者失去仲裁。失去仲裁的節點會在稍後把資訊重新加入佇列，CAN 幀的位元流保持沒有故障繼續進行直到只剩下一個發信節點。這意味著傳送第一個邏輯 1 的節點喪失仲裁。由於所有節點在開始 CAN 幀時傳輸 11 位 或 CAN 20B 中是 29 位 識別符號，擁有最低識別符號的發信節點在起始處擁有更多 0。那個節點贏得仲裁併且擁有最高優先順序。 例如，一個 11 位識別符號的 CAN 網路，有兩個節點，他們的 ID 分別為 15（二進位制表示為 00000001111）和 16（二進位制表示為 00000010000）。如果這兩個節點同時傳輸，每個都會優先傳輸它們識別符號中的前 6 個 0 而不觸發仲裁。 起始位 ID 位 ID 位 ID 位 ID 位 ID 位 ID 位 ID 位 ID 位 ID 位 ID 位 ID 位 幀剩下的部分 起始位 10 9 8 7 6 5 4 3 2 1 0 幀剩下的部分 節點 15 0 0 0 0 0 0 0 0 1 1 1 1 節點 16 0 0 0 0 0 0 0 1 停止傳輸 停止傳輸 停止傳輸 停止傳輸 停止傳輸 CAN 資料 0 0 0 0 0 0 0 0 1 1 1 1 當 ID 中的第 7 位傳輸時，節點 16 為其 ID 傳送 1 隱性，而節點 15 為其 ID 傳送 0（顯性）。當這種情況發生時，該節點 16 知道自己傳送了 1，但在總線上看到了 0，意識到有衝突發生並且自己失去仲裁。節點 16 停止傳送而節點 15 繼續傳輸自己的 ID，沒有丟失任何資料。擁有最低 ID 的節點總是贏得仲裁，因此具有最高優先順序。 長度小於 40m 的網路最高支援的位元率高達 1 百萬位元 秒。降低位元率可以允許使用更長的網路距離（例如，125 千位元 秒支援最大 500 米）。改進的 CAN FD 標準允許仲裁後升高位元率，可以將資料區段速度增加至仲裁位速率的八倍。 ID 分配 資訊 ID 在單條 CAN 總線上必須是唯一的，否則兩個節點將在仲裁位 ID 傳送結束後繼續傳輸，造成錯誤。 1990 年代早期，為資訊選擇標誌符（ID）的準則僅僅基於資料的種類和發信節點。但是，當標誌符同樣代表著資訊的優先順序時，這會帶來不好的即時響應。在這種情況下，通常要求 CAN 匯流排只能使用大概 30 才能保證資訊可以在截止時間之前到達。然而，如果資訊的標誌符根據資訊的優先順序決定，更低標誌符的資訊獲得更高優先順序，那麼在不損失資料的前提下，匯流排的使用率可以達到 70 到 80。 位時序 CAN 網路上的所有節點必須執行在相同的標稱位元率下，但噪音、相移、振盪頻率容差和振盪頻率漂移導致實際的位元率可能與標稱位元率不同。由於沒有使用一個單獨的時鐘訊號，需要一個同步節點方法。同步在仲裁機制中十分重要，因為仲裁中的節點需要能夠同時看到它們傳輸資料的資料和其他節點的傳輸資料。 同步在確保節點間震盪時間不同時不發生錯誤上十分重要。 匯流排閒置一段時間後，在第一個隱性訊號向顯性訊號轉換時（起始位） 進行硬同步。再次同步發生在傳輸幀期間的每次從隱性向顯性轉換時。CAN 控制器期望在標稱位時間內發生多次轉換。如果並沒有在期望的確定時間發生，控制器將根據這調整標稱位時間。 調整是透過將每一位劃分成多個稱為量子的時間段，並分配一定數量的量子到位中的四個階段完成的。這四個階段分別為：同步、傳播、相位段 1 和相位段 2。 位被分成的量子數量會因控制器的不同而不同，每一個階段分配的量子數會因位元率和網路狀況的不同而改變。 在預期時刻之前或之後發生的過渡會促使控制器計算時間差，並根據計算所得的時間差延長相位段 1 或者縮短相位段 2。這有效地改變接收器到發信器的時序，將它們同步在一起。這個重新同步過程不斷地在每次隱性向顯性過渡時進行已確保發信器和接收器保持同步。不斷地重新同步降低了噪聲產生的錯誤，讓同步至已經失去仲裁的節點的接收節點重新同步到贏得仲裁的節點。 層級 CAN 協議與很多網路協議相似，可以被分解為下列抽象層： 應用層 物件層 資訊過濾 訊息和狀態處理 傳輸層 大多數 CAN 標準應用在傳輸層。傳輸層從物理層接收訊息並將這些資訊傳遞給物件層。傳輸層負責特定時序、同步、資訊位構架、仲裁、確認、錯誤檢測及發信和故障約束。它的職責為： 故障約束 錯誤監測 訊息驗證 資訊確認 仲裁 資訊幀 傳輸速率和時間 路由資訊 物理層 CAN 匯流排（ISO1189812003）最初指定的鏈路層協議僅包括對物理層的抽象需求。 物理層關於電氣方面的（電壓，電流，數量導體）規定來自於 ISO1189822003，該協議目前被廣泛接受。但是，物理層關於機械方面的（接頭種類和數量、顏色、標籤、標準輸出）尚未被正式指定。因此，汽車的電子控制單元（ECU）通常會有定製的介面和各種線纜組成 CAN 匯流排。儘管如此，領域中已經出現若干機械方面的標準，最常見的是使用 9 個引腳的 Dsub 型插頭，擁有以下引腳分佈： 引腳 2：CANLow （CAN） 引腳 3：GND （地線 引腳 7：CANHigh （CAN） 引腳 9：CAN V （供電） 這個 CAN 的機械標準可以用於 Dsub 介面的插頭和插座。匯流排電流從插座流向插頭。這遵循了電源在插座處截止的電氣工程慣例。採用本標準避免了為將節點連線到同一個 D 介面而製作定製分離器。非標準 自定義 線束 分離器，線上纜上分離 CAN 分支，減少匯流排的可靠性、消除電纜可交換性、減少線束的相容性並且增加成本。 完整的物理層規範的缺失（電氣和機械方面）減少了 CAN 匯流排的限制，降低了實現功能時物理層面的複雜度。但它讓 CAN 匯流排在互動時因為機械原因不相容。為了提高互用性，許多汽車製造商制定了描述可相容使用的 CAN 接收器的一套引數規範。最大寄生電容包括電容本身以及靜電保護（ESD）（靜電保護在 ISO 76373 中定義）。除了寄生電容、12V 和 24V 系統因為最大電壓不同有不同的標準。事實上，在助推啟動（jump start）時，輕型車輛的先電壓可以達到 24V，而卡車系統可以達到 36V。新的解決方案，允許同樣的元件使用於 CAN 和 CAN FD 詳見）即將投入市場。 ISO1189822003 中的噪聲免疫是透過在匯流排兩端使用低電阻值（120 歐姆）維持匯流排兩條線間的差分阻抗實現的。然而，當處於休眠狀態時，例如 CAN 匯流排的低阻值匯流排會比其他基於電壓的訊號匯流排消耗更多電流。在 CAN 匯流排系統中，當一條訊號線中的電流於另一條反方向電流值一樣時，該平衡傳輸線為接收器提供穩定的 0V 參考電壓。最好的做法是在已經有很嘈雜的射頻干擾的汽車內，對 CAN 匯流排使用帶遮蔽層的雙絞線，以儘量減少射頻訊號的發射，降低干擾的敏感性。 ISO118982 在發信器和接收器之間提供一定的共模電壓免疫。透過一個 0V 的通路保持節點間的電壓關聯。此外，在上述的現有機械結構裡，包含一個將電力分配到各個節點的收發器的供電軌通道。該設計為所有收發器提供了一個共用的電源。總線上應用的實際電壓由使用的收發器決定，並沒有統一規範。常見設計是，透過 CAN 匯流排為每個與自身節點電氣隔離的收發器提供電壓驅動 5V 變壓器。這通常提供足夠多的冗餘度來保證節點間的互用性。 這種網路的典型供電電壓在 7V 到 30V 之間。但是，通用標準的缺失導致系統的設計者要為供電軌道的相容性負責。 ISO 118982 中描述的電氣實施方法構建了一個在匯流排兩端使用終端電阻組成的多站單端平衡線路佈局。在這個結構中，顯性狀態由一個或多個傳輸器將 CAN_L 切換至 0V，同時將 CAN_H 切換至 5V 匯流排電壓來形成透過終端電阻的電流通路。終端電阻在這種訊號系統中起到限制高頻反射波形的核心作用。 在隱性狀態時，訊號線和電阻相對於高低軌道保持在高阻抗狀態。CAN_H 和 CAN_L 軌道的電壓趨向於中立。隱性狀態僅在總線上沒有任何傳輸器宣佈顯性狀態時出現。 在顯性狀態時，訊號線和電阻相對於高低軌道變為低阻抗狀態，因此電流能夠流過電阻。CAN_H 電壓趨向於 5V，同時 CAN_L 趨向於 0V。 不管總線上訊號是什麼狀態，訊號線線上纜兩端因為電阻的存在，相互之間總是保持低阻抗。 這個訊號策略與例如 RS4223 和 RS485 等等的其他平衡線路傳輸技術由顯著的不同。RS4223 和 RS485 擁有差分線纜驅動但是差分模式下電壓為一正一負。在這樣的系統多路通訊通常依靠在時域中支援三種狀態（高電平有效、低電平有效和不活動三種狀態）的介質。在 CAN 總線上進行多路通訊只需要系統的電邏輯支援兩個狀態，在概念上與 由線纜構成的與門 wired AND 網路相似。 幀 CAN 網路可以配置為使用兩種不同的訊息（或 幀）格式：標準或基本幀格式（在 CAN 20 A 和 CAN 20 B 中描述）和擴充套件幀格式（僅由 CAN 20 B 描述）。兩種格式之間的唯一區別是，CAN 基本幀 支援識別符號長度為 11 位，CAN 擴充套件幀 支援識別符號長度為 29 位，由 11 位識別符號（基本識別符號）和一個 18 位擴充套件（識別符號擴充套件）組成。CAN 基本幀格式和 CAN 擴充套件幀格式之間的是透過使用 IDE 位進行區分的，該位在傳輸顯性時為 11 位幀，而在傳輸隱性時使用 29 位幀。支援擴充套件幀格式訊息的 CAN 控制器也能夠傳送和接收 CAN 基本幀格式資訊。所有的幀都以開始位（SOF）作為資訊傳輸的起始。 CAN 有 4 種幀型別： 資料幀：包含用於傳輸的節點資料的幀 遠端幀：請求傳輸特定識別符號的幀 錯誤幀：由任何檢測到錯誤的節點發送的幀 過載幀：在資料幀或遠端幀之間插入延遲的幀 資料幀 資料幀是唯一用於實際資料傳輸的幀。它有兩種資訊結構： 基本幀格式：有 11 個識別符號位 擴充套件幀格式：有 29 個識別符號位 CAN 標準要求必須接受基本幀格式並可能接受擴充套件幀格式，但必須能承受擴充套件幀格式。 基本幀格式 幀格式如下：位值是用於描述 CANLO 訊號的。 欄位名 字長 （位） 作用 起始位（SOF） 1 表示幀的傳輸開始 辨識碼（IDgreen） 11 唯一識別碼，同樣代表了優先順序 遠端傳輸請求（RTR 藍色） 1 資料幀時一定是顯性（0），遠端請求幀時一定是隱性（1）（詳見遠端影格章節） 標誌碼拓展位（IDE） 1 對於只有 11 位標誌碼的基本幀格式，此段一定為顯性（0） 預留位（R0） 1 預留位一定是顯性（0），但是隱性（1）同樣是可接受的 資料長度程式碼（DLC 黃色） 4 資料的位元組數（08 位元組） 資料段（Data field 紅色） 064 08 位元組 待傳輸資料（長度由資料長度碼 DLC 指定） 迴圈冗餘校驗（CRC） 15 迴圈冗餘校驗 迴圈冗餘校驗定界碼 1 一定是隱性（1） 確認槽（ACK） 1 發信器傳送隱性（1）但是任何接收器可以宣示顯性（0） 確認定界碼（ACK delimiter） 1 一定是隱性（1） 結束位 EOF 7 一定是隱性（1） 拓展幀格式 幀的格式如下表所示： 欄位名 字長 （位） 作用 起始位（SOF） 1 表示幀的傳輸開始 標誌符 A（ID Agreen） 11 唯一識別碼的第一部分，同樣代表了優先順序 替代遠端請求（SRR） 1 資料幀時一定是顯性（0），遠端請求幀時一定是隱性（1） 標誌符拓展位（IDE） 1 對於有 29 位標誌符的拓展幀格式，此段一定為隱性（1） 標誌符 B（ID Bgreen） 18 唯一識別碼的第二部分，同樣代表了優先順序 遠端傳輸請求（RTR 藍色） 1 資料幀時一定是顯性（0），遠端請求幀時一定是隱性（1）（詳見遠端影格章節） 預留位（r1，r0） 2 預留位一定是顯性（0），但是隱性（1）同樣是可接受的 資料長度程式碼（DLC 黃色） 4 資料的位元組數（08 位元組） 資料段（Data field 紅色） 064 08 位元組 待傳輸資料（長度由資料長度碼 DLC 指定） 迴圈冗餘校驗（CRC） 15 迴圈冗餘校驗 迴圈冗餘校驗定界符 1 一定是隱性（1） 確認槽（ACK） 1 傳送器傳送隱性（1），任何接收器都可以傳送顯性（0） 確認定界符（ACK delimiter） 1 一定是隱性（1） 結束位 EOF 7 一定是隱性（1） 兩個定位符區域 A 和 B 共同組成 29 位定位符。 遠端幀 通常資料傳輸是在資料來源節點（例如感測器）發出資料幀的情況下自主執行的。但是，目標節點也可以透過傳送遠端幀來從資訊源請求資料。 資料幀和遠端幀之間有兩個區別。首先，RTR 位在資料幀中作為顯性位傳輸，其次在遠端幀中沒有資料段。DLC 欄位表示所請求的訊息的資料長度，而不是傳送的資料長度。 也就是說： RTR 0；資料幀中為顯性 RTR 1；遠端幀中位隱性 在資料幀和具有相同識別符號的遠端幀同時傳送的情況下，由於資料幀識別符號之後的 RTR 位是顯性，它將贏得仲裁。 錯誤幀 錯誤幀由兩個不同的欄位組成： 第一段由不同站點提供的錯誤標誌（612 個顯性位 隱性位）的疊加給出。 接下來的第二段是錯誤幀定界符（ERROR DELIMITER，8 個隱性位）。 錯誤標誌也有兩種： 主動錯誤標誌：六個顯性位 由網路上錯誤狀態為 主動錯誤 的出錯的節點傳送。 被動錯誤標誌：六個隱性位 由網路上錯誤狀態為 被動錯誤 的出錯的節點傳送。 CAN 有兩種錯誤計數器： 1 傳輸錯誤計數器（Transmit error counter，簡稱 TEC） 2 接受錯誤計數器（Receive error counter，簡稱 REC） 當傳輸錯誤計數器 TEC 或接受錯誤計數器 REC 大於 127 且小於 255 時，將在總線上傳輸被動錯誤幀。 當傳輸錯誤計數器 TEC 或接受錯誤計數器 REC 小於 128 時，將在總線上傳輸主動錯誤幀。 當傳輸錯誤計數器 TEC 或接受錯誤計數器 REC 大於 255 時，節點進入主線離線狀態，不會傳輸幀。 過載幀 過載幀包含兩個位欄位：過載標誌（Overload Flag）和過載定界符（Overload Delimiter）。有兩種過載條件可導致過載標誌的傳輸： 接收器的內部條件，要求延遲下一個資料幀或遠端幀。 中斷檢測到一個顯性位。 由於情況 1 引起的過載幀只允許在預期中斷的第一位時間開始，而由情況 2 引起的過載幀在檢測到顯性位後一位開始。過載標誌由六個顯性位組成，其整體形式與主動錯誤標誌的形式相對應。過載標誌的形式破壞了中斷區的固定形式。因此，所有其他站點也會檢測到過載情況，並在它們自己的部分開始傳輸過載標誌。過載定界符由 8 個隱性位組成，與錯誤分隔符的形式相同。 偵錯機制 CAN 提供了五種除錯機制，使其錯誤發生率低於 471011。當一個以上的上述錯誤發生時，傳送中的傳輸將會失敗中止並且產生錯誤資料包，發訊端則會試著重新發送訊息資料包。各個節點將會重新爭取優先權。 CAN 的五種偵測錯誤機制 迴圈冗餘校驗（CRC） CRC 在訊息結尾處加上一個 FCS（frame check sequence）來確保訊息的正確。接收訊息端會將其 FCS 重新演算並與所接收到的 FCS 比對，如果不相符，表示有 CRC 錯誤。 Frame check 檢查封包中幾個固定值的欄位以驗證該封包是否有被訊號幹擾導致內容錯誤。 ACK errors 接收端在收到封包後會告知發訊端，發訊端若沒有收到確認訊息，ACK 錯誤便發生。 Monitoring 傳輸一位到網路上，再從網路讀取來檢查是否一致。 Bit stuffing 用於訊息同步。 確認槽（ACK） 確認插槽用於確認收到的 CAN 幀有效。接收到幀而沒有發現錯誤的每個節點在 ACK 槽中傳送顯性水平，來覆蓋發射機的隱性水平。如果發射機在 ACK 時隙中只檢測到隱性電平，它就知道沒有任何接收器獲得有效的幀。接收節點可以傳送隱性訊號來指示它沒有接收到有效幀，但是確實接收到有效幀的其它節點可以用顯性訊號覆蓋它。傳送節點無法知道 CAN 網路上的是否所有節點都收到了該訊息。 幀間內容 資料幀和遠端幀透過稱為幀間空間的區域與前面的幀分開。幀間空間由至少三個連續的隱性（1）位組成。之後，如果檢測到一個顯性位，它將被視為下一幀的 起始位。 過載幀和錯誤幀不比幀間空間重要，並且多個過載幀也不由幀間空間分隔。幀間空間包含了欄位中斷和匯流排空閒，並且如果前一訊息的傳送器是被動錯誤站點，會將匯流排暫掛。 位填充 傳輸器會在相同極性的五個連續位之後插入一個相反的極性的位，以確保足夠的轉換來保持同步。這種做法被稱為位填充，並且對於 CAN 這樣的不歸零（NRZ）編碼是必要的。填充的資料幀由接收器去掉填充。 除了 CRC 定界符，ACK 欄位和結束位這樣固定字長的區域之外，幀中其他所有欄位都會被填充，這些欄位是固定大小且未被填充。在使用位填充的欄位中，具有相同極性的六個連續位（111111 或 000000）被視為錯誤。 當檢測到錯誤時，節點可以傳送主動錯誤標誌。主動錯誤標誌由六個連續的顯性位組成，違反了位填充規則。 位填充意味著資料幀可能比上述表中列舉的預期的要長。CAN 幀（基本格式下）的最大尺寸的情況是 11111000011110000 被填充為：（填充位用粗體顯示） 111110000011111000001 填充位本身可能成為五個連續相同位中的第一個，所以在最壞的情況下，每四個原始位有一個填充位。 長度由下面公式給出： 8n 47 leftlfloor frac 34 8n 14 rightrfloor 其中 8n 47 是填充前幀的長度，在最壞情況下，原資料除了第一個 4 位後，在每個 4 位後增加一位（所以分子減去 1），同時由於位的結構，固有的 47 位中只有 34 位能夠被填充。 CAN 低層標準 ISO 11898 系列規定了用於道路車輛的 CAN 序列通訊技術的物理層和資料鏈路層（ISOOSI 模型的第一和第二層），支援分散式即時控制和多路複用。 有如下幾個 CAN 物理層及其他層的標準： ISO 1189812015 規定了控制器區域網（CAN）的資料鏈路層（DLL）和物理信令。該文件根據 ISOIEC 74981 中建立的開放系統互連（OSI）的 ISO 參考模型，描述了 CAN 匯流排層級通用架構，並提供了在模組之間建立數字資訊交換實現 CAN 資料鏈路層的特性，和邏輯鏈路控制（LLC）次層和介質訪問控制（MAC）次層的詳細引數。 ISO 1189822003 規定了高速（傳輸速率高達 1 Mbit s）介質訪問單元（MAU）和一些介質相關介面（MDI）特性（根據 ISO 88023），共同組成了控制區域網的物理層。ISO 118982 使用雙線平衡傳輸線信令體系，是車用動力總成應用和工業控制網路中最常用的物理層。 ISO 1189832006 規定了在道路車輛電子控制單元之間建立的低速、容錯、依賴介質的介面的數字資訊交換設定，其傳輸速率在 40kBits 至 125kBits 之間。 ISO 1189842004 規定了在 CAN 中的時間觸發通訊（TTCAN）。它適用於在配備 CAN 的道路車輛的電子控制單元（ECU）之間建立時間觸發的數字資訊交換，並且根據 ISO118981 規定了與邏輯鏈路和介質訪問控制協調的幀同步，提供了時間觸發的通訊時間表。 ISO 1189852007 規定了道路車輛內傳輸速率高達 1 Mbits 的 CAN 網路物理層。它根據 ISO 88022 描述了介質訪問單元的功能以及一些與介質相關的介面功能。它是 ISO 118982 的擴充套件，應對沒有主動主線通訊但是要求低功耗特性的系統。 ISO 1189862013 規定了道路車輛內傳輸速率高達 1 Mbits 的 CAN 網路物理層。它根據 ISO 88022 描述了介質訪問單元的功能以及一些與介質相關的介面功能。它是 ISO 118982 和 ISO 118985 的擴充套件，描述了一種可選的，利用可配置的 CAN 網路幀的選擇性喚醒機制。 ISO 1684512004 提供了用於檢查 CAN 是否符合 ISO 118981 規定所必需的方法和簡要測試套件。 ISO 1684522014 設立測試案例和測試要求，驗證具有選擇性喚醒功能的 CAN 收發器是否符合指定的功能。ISO 168452：2014 中定義的測試型別稱為一致性測試。 基於 CAN 的高層協議 由於 CAN 標準不包括例如資料流量控制、裝置定址、傳輸多條訊息的資料塊和應用資料等應用層協議的工作，許多高層協議被指定出來。 儘管這些協議都能被製造商擴充套件，但其中只有幾個為商用領域標準化。對於乘用車，每個製造商都有自己的標準。 其中包括： 標準化的方法 ARINC 812 或 ARINC 825（航空工業） CANopen EN 503254（工業自動化技術） DeviceNet（工業自動化技術 EnergyBus CiA 454（輕型電動汽車） ISOBUS ISO 11783（農用機械） ISOTP ISO 157652（機動車診斷用傳輸協議） SAE J1939（公車和卡車的車用網路） MilCAN NMEA 2000 IEC 611623（航海工業） 統一診斷服務（UDS） ISO 14229 （汽車診斷） 其他方法 CANaerospace Stock 航空工業 CAN Kingdom Kvaser 嵌入式系統 CCPXCP（汽車 ECU 校正校準） GMLAN General Motors（通用汽車） RVC RVIA（娛樂用載具） SafetyBUS p Pilz（工業自動化技術） UAVCAN（航空航天及機器人） CANopen 電梯 CANopen 特別興趣組織（SIG）電梯控制 成立於 2001 年，為電梯控制系統開發了 CiA 417 CANopen 應用配置。CiA 417 的第一個版本於 2003 年夏釋出。20 版本於 2010 年 2 月在 CiA 網站公佈。SIG 致力於擴充套件 CANopen 電梯系統的功能，改進技術內容並確保滿足當前對電梯控制系統的法律標準。210 版本於 2012 年 7 月釋出，於 2015 年 12 月釋出 220 版本（CiA 成員可以獲得）標準草案提案。 目前（2016 年）SIG 正在開發 230 版本（CiA 成員可以獲得）。 SIG 的主席是 Jörg Hellmich（ELFIN GmbH），它同時是 CANopen 電梯社群維基的管理員。 安全性 CAN 是低階協議，不支援任何內在的安全功能。在標準的 CAN 中也沒有加密，這使得這些網路資料能被擷取。在大多數應用中，應用程式需要部署自己的安全機制，例如認證傳入命令或網路上某些裝置的存在。若不執行適當的安全措施，其他人可能設法在總線上插入訊息。 儘管一些安全關鍵功能（如修改韌體，程式設計鍵或控制防抱死制動）存在密碼，但這些系統並未普遍實施，並且金鑰對的數量有限。 開發工具 在開發 CAN 匯流排或排除故障時，檢查硬體訊號非常重要。可以使用邏輯分析儀和匯流排分析儀來收集、分析、解碼並儲存高速波形訊號。此外，還有 CAN 匯流排監視器及其它特殊工具。 CAN 匯流排監視器是一個分析工具，通常是硬體和軟體的組合，用於開發使用在 CAN 總線上的硬體。 通常，CAN 匯流排監視器將監聽 CAN 總線上的通訊量，以便將其顯示在自身的使用者介面中。它通常也能將 CAN 幀傳送到匯流排來模擬 CAN 匯流排活動。 因此，CAN 匯流排監視器可用於驗證來自待測裝置的預期 CAN 流量或模擬 CAN 流量以驗證測試裝置連線到 CAN 匯流排時的反應。 許可 博世公司擁有該技術的專利，生產相容 CAN 的微處理器的製造商需要向博世公司支付許可費，這些費用通常加在芯片價格中傳遞給客戶。 生產相容 CAN 的定製特殊應用積體電路（ASICs）或現場可程式設計邏輯閘陣列（FPGA）模組的製造商需要為 CAN 協議許可證支付費用。License Conditions CAN Protocol and CAN FD Protocol 參見 CANopen 嵌入式系統的通訊協議 CAN 的開源裝置驅動 CAN FD 新的具有更快傳輸的 CAN CAN 的開源 Linux 裝置驅動程式 另一種實現方法 另一種較高規格的車用網路 LIN 匯流排 另一種低成本的車用網路 MOST 引數 ID 列表 OSEK 卡車和公共汽車的通訊協議 大眾汽車研究院為 Linux 核心開發的一系列開源 CAN 驅動程式和網路堆疊。 DBC 檔 CAN 參考文獻 外部連結 Bosch 引數 （舊檔案 在某些方面略有含糊 不明確，被標準取代 ） 博世公司 CAN FD 引數 v10 控制器區域網（CAN）可排程性分析：反駁，重訪和修訂 常用的 CAN 匯流排聯結器引腳 獨立討論平臺 CANLIST 關於車用 CAN 安全性的網頁 具有 FIFO 佇列的控制器區域網（CAN）可排程性分析 控制器區域網（CAN）實施指南 教程：控制器區域網（CAN）簡介和基礎知識 Windows 系統位時序計算器免費軟體，支援許多微控制器。例如 Atmel STM32 Microchip Renesas 壓縮檔案 汽車 CAN 和 CANFD 保護 CAN 簡介 免費電子學習模組 ARINC825 教程（影片） 來自 Excalibur Systems 公司。 ISO 國際標準化組織 瞭解和使用的控制器區域網，來自加州大學伯克利分校 Full fledged professional CAN course Category 電腦網路 Category 序列匯流排 Category 工業計算 Category 工業自動化 CategoryCAN bus