控制器區域網路

控制器區域網（Controller Area Network，簡稱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 2.0於1991年發布。該規範被分為兩部分；A部分適用於使用11位標識符的標準格式，B部分適用於使用29位標誌符的拓展格式。使用11位標識符的CAN裝置一般被稱作CAN 2.0A，而使用29位識別碼的CAN裝置通常稱為CAN 2.0B。博世公司免費提供標準、規範和白皮書。

1993年，國際標準化組織（ISO）公布了CAN標準ISO11898。後來CAN標準被重新編譯分成兩個部分：ISO11898-1涵蓋了數據鏈路層；ISO11898-2涵蓋了高速CAN總線的物理層； ISO11898-3於晚些時候公布並且涵蓋了低速CAN總線的物理層和CAN總線容錯規範。物理層標準ISO11898-2和ISO11898-3並不包含在博世CAN2.0規範中，它們可以單獨從ISO購買。

之後，博世公司仍然積極地拓展CAN標準。2012年，博世公布CAN FD 1.0或稱作可變數據速率的CAN。這個規範使用不同的架構，允許在仲裁之後，切換至更快的比特率，傳輸不同的數據的長度。CAN FD兼容現有的CAN 2.0網路，所以新的CAN FD裝置能夠與現有CAN裝置共存於同一控制網路。

CAN總線是五個使用在車載診斷 (OBD)-II標準的協議的其中一個。1996年以後，所有在美國銷售的汽車及輕型卡車被強制要求符合OBD-II標準。在歐盟，自2001年後銷售的汽油載具及2004年後銷售的柴油載具都強制規定需要符合EOBD標準。

## 應用

CAN總線通常應用於如下領域

- 乘用車、卡車、公共汽車（汽油車及電動車）
- 航空、航海電子儀器
- 工業自動化及機械控制
- 電梯、扶梯
- 建築自動化
- 醫療儀器及設備

### 汽車

現代的汽車可能為其子系統配備多達70個電子控制器（ECU）。最常見的控制器為發動機控制器。除此以外，變速器、安全氣囊、防鎖死煞車系統/ABS、定速巡航、動力方向盤、音響系統、動力車窗、車門、後視鏡調整、電池和混合動力電動汽車的充電系統等等均使用電子控制器。這其中，有的是獨立的子系統，有些需要跟其他子系統進行通信，控制驅動器或接收傳感器的反饋資訊。為此設計了控制器區域網路，將汽車的不同系統相互連接在一起。傳統的「電纜直連」成本高，布線複雜，而控制器區域網路僅需軟體就可實現，不僅安全、經濟還十分便利。

- 自動啟動/停止：車輛各處的各種傳感器（速度傳感器、轉向角、空調關閉，發動機溫度）所發出的各種信號可由CAN總線收集並用於決定是否可以在停車時關閉發動機，進而改善燃油效率和尾氣排放。
- 電子駐車制動系統："斜坡駐車"的功能需要車輛的傾斜傳感器（同時用於防盜報警器）和道路的速度傳感器（同時用於防鎖死制動、發動機控制和牽引力控制）通過CAN總線傳輸採樣信號並決定車輛是否停在斜坡上。同樣，安全帶的傳感器(安全氣囊的一部分)通過CAN總線傳輸信號，以確定安全帶是否扣上，然後泊車的剎車會自動在移動時關閉。
- 自動停車系統：當司機切換至倒檔，變速器控制單元可以通過CAN總線發送信號，激活停車傳感器系統和車門控制模塊，使副駕駛側的後視鏡向下傾斜顯示路涯。CAN總線也可以從雨水傳感器獲取信號，在倒車時自動觸發後擋風玻璃雨刮。
- 車道偏離警示/防撞系統：車道偏離警示/駐車傳感器的信號也可通過CAN總線用於駕駛輔助系統判斷附近物體，比如車道偏離警示。最近，這些信號可以通過CAN總線觸發防撞系統中的電子剎車系統。
- 汽車剎車清掃：雨水傳感器(主要用於自動擋風玻璃雨刷)通過CAN總線將信號送達防抱死制動系統模塊中，在行駛中輕微觸發一次人體不會察覺的剎車來清除剎車片上的液體。奧迪和寶馬的某些高性能型號搭配有這一功能。

近些年又開發出了LIN（區域網際網路）標準，用在非關鍵系統中的應用，例如空調和資訊娛樂系統等數據傳輸速度和可靠性不是很重要的系統中。

### 其他

- CAN總線協議自2009年後被用於禧瑪諾DI2的公路自行車電子變速系統上。同樣的，Ansmann和BionX在它們的直驅電機中使用CAN協議。
- 由於CAN控制器和處理器價格低廉，CAN總線同樣可應用於普通自動化環境的現場總線中。
- 包括NISMO在內的開發商致力於使用CAN總線數據在GT賽車6中利用遊戲內的GPS數據，重建真實的賽車視覺動態模糊，玩家將獲得真實的賽車動態模糊效果。
- 約翰·霍普金斯大學應用物理學實驗室的模塊化假肢（MPL）使用局域CAN總線使假肢上的伺服電機和控制器的溝通更容易。
- 熔融沉積成型（FDM）的3D列印機，工具頭與控制主板之間的連接線改用CAN bus以簡化傳統繁瑣的接線，並減輕工具頭的重量，以利列印速度提升。

## 架構

CAN是一個用於連接電子控制單元（ECU）的多主機串行總線標準。電子控制單元有時也被稱作節點。CAN網路上需要至少兩個節點才可進行通信。節點的複雜程度可以只是簡單的輸入輸出裝置，也可以是包含有CAN交互器並搭載了軟體的嵌入式元件。節點還可能是一個網關，允許普通電腦通過USB或乙太網埠與CAN網路上的裝置通信。

所有節點通過兩根平行的總線連接在一起。兩條電線組成一條雙絞線，並且接有120Ω的特性阻抗。

ISO 11898-2，也稱為高速度CAN。它在總線的兩端均接有120Ω電阻。

<image>

高速CAN總線在傳輸顯性（0）信號時，會將CAN_H端抬向5V高電平，將CAN_L拉向0V低電平。當傳輸隱性（1)信號時，並不會驅動CAN_H或者CAN_L端。顯性信號CAN_H和CAN_L兩端差分標稱電壓為2V。終端電阻在沒有驅動時，將差分標稱電壓降回0V。顯性信號（0）的共模電壓需要在1.5V到3.5V之間。隱性信號（1）的共模電壓需要在+/-12V。

<image>

ISO 11898-3，也被稱作低速或者容錯CAN。它使用線性主線，星形主線或者連接到一個線性主線上的多星結構主線著稱。每個節點都有終端電阻作為全局終端電阻的一部分。全局終端電阻不應低於100 Ω。

<image>

低速/容錯CAN信號在傳輸顯性信號（0）時，驅動CANH端抬向5V，將CANL端降向0V。在傳輸隱性信號（1）時並不驅動CAN 總線的任何一端。在電源電壓Vcc為5V時，顯性信號差分電壓需要大於2.3V，隱性信號的差分電壓需要小於0.6V。CAN總線兩端未被驅動時，終端電阻使CANL端回歸到RTH電壓（當電源電壓Vcc為5V時，RTH電壓至少為Vcc-0.3V=4.7V），同時使CANH端回歸至RTL電壓（RTL電壓最大為0.3V）。兩根線需要能夠承受-27V至40V的電壓而不被損壞。

<image>

在高速和低速CAN中,從隱性信號向顯性信號過渡的速度更快，因為此時CAN線纜被主動積極地驅動。顯性向隱性的過渡速度主要取決於CAN網路的長度和導線的電容。

高速CAN通常被用於汽車和工業應用，在這些應用環境中，總線通常從一端橫跨至另一端。容錯CAN總線則經常被用在需要連接在一起的一組節點。

ISO規格只要求總線共模電壓必須保持在最小和最大範圍內，但不定義如何將總線電壓保持在這個範圍。

CAN總線必須使用終端電阻。終端電阻可以用來抑制信號反射，同時可以使總線電壓回到隱性狀態或者閒置狀態。

高速CAN在總線兩端使用120Ω電阻。低速CAN在每個節點均使用電阻。也有其他類型的終端，例如ISO 11783中定義了終端偏壓電路。

終端偏壓電路使用由4條導線組成的線纜，除了CAN信號線以外還有電源線和地線。這在每段總線兩端提供自動偏壓和終端功能。ISO11783網路是專為熱拔插總線段和電子控制單元設計的。

<image>

每個節點需要:

- 中央處理器、微處理器或主處理器
- 處理主機決定收到的資訊的意思以及想要傳輸的資訊。
- 傳感器、驅動器和控制裝置可以與主處理器連接。
- CAN控制器；通常是集成單片機的一部分
- 接收：CAN控制器將從總線上接收的串位字節存儲直到整個消息可用，之後主處理器可以獲取這個消息（通常由於CAN控制器觸發一個中斷）。
- 發送：主處理器發送傳遞資訊到CAN控制器，之後當總線空閒時將串位資訊傳遞至總線。
- 收發器；由ISO11898-2/3介質訪問單元（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 2.0B中是29位)標識符，擁有最低標識符的發信節點在起始處擁有更多0。那個節點贏得仲裁併且擁有最高優先級。

例如，一個11位標識符的CAN網路，有兩個節點，他們的ID分別為15（二進位表示為00000001111）和16（二進位表示為00000010000）。如果這兩個節點同時傳輸，每個都會優先傳輸它們標識符中的前6個0而不觸發仲裁。

起始位｜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。

<image>

位被分成的量子數量會因控制器的不同而不同，每一個階段分配的量子數會因比特率和網路狀況的不同而改變。

在預期時刻之前或之後發生的過渡會促使控制器計算時間差，並根據計算所得的時間差延長相位段1或者縮短相位段2。這有效地改變接收器到發信器的時序，將它們同步在一起。這個重新同步過程不斷地在每次隱性向顯性過渡時進行已確保發信器和接收器保持同步。不斷地重新同步降低了噪聲產生的錯誤，讓同步至已經失去仲裁的節點的接收節點重新同步到贏得仲裁的節點。

## 層級

CAN協議與很多網路協議相似，可以被分解為下列抽象層：

應用層

對象層

- 資訊過濾
- 消息和狀態處理

傳輸層

大多數CAN標準應用在傳輸層。傳輸層從物理層接收消息並將這些資訊傳遞給對象層。傳輸層負責特定時序、同步、資訊位構架、仲裁、確認、錯誤檢測及發信和故障約束。它的職責為：

- 故障約束
- 錯誤監測
- 消息驗證
- 資訊確認
- 仲裁
- 資訊幀
- 傳輸速率和時間
- 路由資訊

物理層

<image>

CAN總線（ISO11898-1:2003）最初指定的鏈路層協議僅包括對物理層的抽象需求。物理層關於電氣方面的（電壓，電流，數量導體）規定來自於ISO11898-2:2003，該協議目前被廣泛接受。但是，物理層關於機械方面的（接頭種類和數量、顏色、標籤、標準輸出）尚未被正式指定。因此，汽車的電子控制單元（ECU）通常會有定製的接口和各種線纜組成CAN總線。儘管如此，領域中已經出現若干機械方面的標準，最常見的是使用9個引腳的D-sub型插頭，擁有以下引腳分布：

- 引腳2：CAN-Low （CAN−）
- 引腳3：GND （地線)
- 引腳7：CAN-High （CAN+）
- 引腳9：CAN V+ （供電）

<image>

這個CAN的機械標準可以用於D-sub接口的插頭和插座。總線電流從插座流向插頭。這遵循了電源在插座處截止的電氣工程慣例。採用本標準避免了為將節點連接到同一個D接口而製作定製分離器。非標準(自定義)線束(分離器)，在線纜上分離CAN分支，減少總線的可靠性、消除電纜可交換性、減少線束的兼容性並且增加成本。

完整的物理層規範的缺失（電氣和機械方面）減少了CAN總線的限制，降低了實現功能時物理層面的複雜度。但它讓CAN總線在交互時因為機械原因不兼容。為了提高互用性，許多汽車製造商制定了描述可兼容使用的CAN接收器的一套參數規範。最大寄生電容包括電容本身以及靜電保護（ESD）（靜電保護在ISO 7637-3中定義）。除了寄生電容、12V和24V系統因為最大電壓不同有不同的標準。事實上，在助推啟動（jump start）時，輕型車輛的先電壓可以達到24V，而卡車系統可以達到36V。新的解決方案，允許同樣的元件使用於CAN和CAN FD(詳見）即將投入市場。

ISO11898-2:2003中的噪聲免疫是通過在總線兩端使用低電阻值（120歐姆）維持總線兩條線間的差分阻抗實現的。然而，當處於休眠狀態時，例如CAN總線的低阻值總線會比其他基於電壓的信號總線消耗更多電流。在CAN總線系統中，當一條信號線中的電流於另一條反方向電流值一樣時，該平衡傳輸線為接收器提供穩定的0V參考電壓。最好的做法是在已經有很嘈雜的射頻干擾的汽車內，對CAN總線使用帶屏蔽層的雙絞線，以儘量減少射頻信號的發射，降低干擾的敏感性。

ISO11898-2在發信器和接收器之間提供一定的共模電壓免疫。通過一個0V的通路保持節點間的電壓關聯。此外，在上述的現有機械結構里，包含一個將電力分配到各個節點的收發器的供電軌通道。該設計為所有收發器提供了一個共用的電源。總線上應用的實際電壓由使用的收發器決定，並沒有統一規範。常見設計是，通過CAN總線為每個與自身節點電氣隔離的收發器提供電壓驅動5V變壓器。這通常提供足夠多的冗餘度來保證節點間的互用性。這種網路的典型供電電壓在7V到30V之間。但是，通用標準的缺失導致系統的設計者要為供電軌道的兼容性負責。

ISO 11898-2 中描述的電氣實施方法構建了一個在總線兩端使用終端電阻組成的多站單端平衡線路布局。在這個結構中，顯性狀態由一個或多個傳輸器將CAN_L切換至0V，同時將CAN_H切換至5V總線電壓來形成通過終端電阻的電流通路。終端電阻在這種信號系統中起到限制高頻反射波形的核心作用。

在隱性狀態時，信號線和電阻相對於高低軌道保持在高阻抗狀態。CAN_H和CAN_L軌道的電壓趨向於中立。隱性狀態僅在總線上沒有任何傳輸器宣布顯性狀態時出現。

在顯性狀態時，信號線和電阻相對於高低軌道變為低阻抗狀態，因此電流能夠流過電阻。CAN_H電壓趨向於5V，同時CAN_L趨向於0V。

不管總線上信號是什麼狀態，信號線在線纜兩端因為電阻的存在，相互之間總是保持低阻抗。

這個信號策略與例如RS-422/3和RS-485等等的其他平衡線路傳輸技術由顯著的不同。RS-422/3和RS-485擁有差分線纜驅動但是差分模式下電壓為一正一負。在這樣的系統多路通信通常依靠在時域中支持三種狀態（高電平有效、低電平有效和不活動三種狀態）的介質。在CAN總線上進行多路通信只需要系統的電邏輯支持兩個狀態，在概念上與「由線纜構成的與門(wired AND)」網路相似。

## 幀

CAN網路可以配置為使用兩種不同的消息（或「幀」）格式：標準或基本幀格式（在CAN 2.0 A和CAN 2.0 B中描述）和擴展幀格式（僅由CAN 2.0 B描述）。兩種格式之間的唯一區別是，「CAN基本幀」支持標識符長度為11位，「CAN擴展幀」支持標識符長度為29位，由11位標識符（「基本標識符」）和一個18位擴展（「標識符擴展」）組成。CAN基本幀格式和CAN擴展幀格式之間的是通過使用IDE位進行區分的，該位在傳輸顯性時為11位幀，而在傳輸隱性時使用29位幀。支持擴展幀格式消息的CAN控制器也能夠發送和接收CAN基本幀格式資訊。所有的幀都以開始位（SOF）作為資訊傳輸的起始。

CAN有4種幀類型：

- 數據幀：包含用於傳輸的節點數據的幀
- 遠程幀：請求傳輸特定標識符的幀
- 錯誤幀：由任何檢測到錯誤的節點發送的幀
- 過載幀：在數據幀或遠程幀之間插入延遲的幀

### 數據幀

數據幀是唯一用於實際數據傳輸的幀。它有兩種資訊結構：

- 基本幀格式：有11個標識符位
- 擴展幀格式：有29個標識符位

CAN標準要求必須接受基本幀格式並可能接受擴展幀格式，但必須能承受擴展幀格式。

#### 基本幀格式

<image>

幀格式如下：位值是用於描述CAN-LO信號的。

欄位名｜字長 （位）｜作用

起始位（SOF）｜1｜表示幀的傳輸開始

辨識碼（ID\green）｜11｜唯一識別碼，同樣代表了優先級

遠程傳輸請求（RTR\藍色）｜1｜數據幀時一定是顯性（0），遠程請求幀時一定是隱性（1）（詳見遠端影格章節）

標誌碼拓展位（IDE）｜1｜對於只有11位標誌碼的基本幀格式，此段一定為顯性（0）

預留位（R0）｜1｜預留位一定是顯性（0），但是隱性（1）同樣是可接受的

數據長度代碼（DLC\黃色）｜4｜數據的字節數（0-8位元組）

數據段（Data field\紅色）｜0–64 (0-8 字節)｜待傳輸數據（長度由數據長度碼DLC指定）

循環冗餘校驗（CRC）｜15｜循環冗餘校驗

循環冗餘校驗定界碼｜1｜一定是隱性（1）

確認槽（ACK）｜1｜發信器發送隱性（1）但是任何接收器可以宣示顯性（0）

確認定界碼（ACK delimiter）｜1｜一定是隱性（1）

結束位(EOF)｜7｜一定是隱性（1）

#### 拓展幀格式

幀的格式如下表所示：

欄位名｜字長 （位）｜作用

起始位（SOF）｜1｜表示幀的傳輸開始

標誌符A（ID A\green）｜11｜唯一識別碼的第一部分，同樣代表了優先級

替代遠程請求（SRR）｜1｜數據幀時一定是顯性（0），遠程請求幀時一定是隱性（1）

標誌符拓展位（IDE）｜1｜對於有29位標誌符的拓展幀格式，此段一定為隱性（1）

標誌符B（ID B\green）｜18｜唯一識別碼的第二部分，同樣代表了優先級

遠程傳輸請求（RTR\藍色）｜1｜數據幀時一定是顯性（0），遠程請求幀時一定是隱性（1）（詳見遠端影格章節）

預留位（r1，r0）｜2｜預留位一定是顯性（0），但是隱性（1）同樣是可接受的

數據長度代碼（DLC\黃色）｜4｜數據的字節數（0-8位元組）

數據段（Data field\紅色）｜0–64 (0-8 字節)｜待傳輸數據（長度由數據長度碼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位是顯性，它將贏得仲裁。

### 錯誤幀

錯誤幀由兩個不同的欄位組成：

- 第一段由不同站點提供的錯誤標誌（6-12個顯性位/隱性位）的疊加給出。
- 接下來的第二段是錯誤幀定界符（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提供了五種調試機制，使其錯誤發生率低於4.7×10−11。當一個以上的上述錯誤發生時，發送中的傳輸將會失敗中止並且產生錯誤數據包，發訊端則會試著重新發送消息數據包。各個節點將會重新爭取優先權。

CAN的五種偵測錯誤機制

循環冗餘校驗（CRC）｜CRC在訊息結尾處加上一個FCS（frame check sequence）來確保訊息的正確。接收訊息端會將其FCS重新演算並與所接收到的FCS比對，如果不相符，表示有CRC錯誤。

Frame check｜檢查封包中幾個固定值的欄位以驗證該封包是否有被訊號干擾導致內容錯誤。

ACK errors｜接收端在收到封包後會告知發訊端，發訊端若沒有收到確認訊息，ACK錯誤便發生。

Monitoring｜傳輸一位到網路上，再從網路讀取來檢查是否一致。

Bit stuffing｜用於消息同步。

## 確認槽（ACK）

確認插槽用於確認收到的CAN幀有效。接收到幀而沒有發現錯誤的每個節點在ACK槽中發送顯性水平，來覆蓋發射機的隱性水平。如果發射機在ACK時隙中只檢測到隱性電平，它就知道沒有任何接收器獲得有效的幀。接收節點可以發送隱性信號來指示它沒有接收到有效幀，但是確實接收到有效幀的其它節點可以用顯性信號覆蓋它。發送節點無法知道CAN網路上的是否所有節點都收到了該消息。

## 幀間內容

數據幀和遠程幀通過稱為幀間空間的區域與前面的幀分開。幀間空間由至少三個連續的隱性（1）位組成。之後，如果檢測到一個顯性位，它將被視為下一幀的「起始位」。過載幀和錯誤幀不比幀間空間重要，並且多個過載幀也不由幀間空間分隔。幀間空間包含了欄位中斷和總線空閒，並且如果前一消息的發送器是被動錯誤站點，會將總線暫掛。

## 位填充

<image>

傳輸器會在相同極性的五個連續位之後插入一個相反的極性的位，以確保足夠的轉換來保持同步。這種做法被稱為位填充，並且對於CAN這樣的不歸零（NRZ）編碼是必要的。填充的數據幀由接收器去掉填充。

除了CRC定界符，ACK欄位和結束位這樣固定字長的區域之外，幀中其他所有欄位都會被填充，這些欄位是固定大小且未被填充。在使用位填充的欄位中，具有相同極性的六個連續位（111111或000000）被視為錯誤。當檢測到錯誤時，節點可以發送主動錯誤標誌。主動錯誤標誌由六個連續的顯性位組成，違反了位填充規則。

位填充意味著數據幀可能比上述表中列舉的預期的要長。CAN幀（基本格式下）的最大尺寸的情況是

11111000011110000...

被填充為：（填充位用粗體顯示）

111110000011111000001...

填充位本身可能成為五個連續相同位中的第一個，所以在最壞的情況下，每四個原始位有一個填充位。

長度由下面公式給出：

$$8n + 47 + \left\lfloor \frac{34 + 8n - 1}{4} \right\rfloor$$

其中$8n + 47$是填充前幀的長度，在最壞情況下，原數據除了第一個4位後，在每個4位後增加一位（所以分子減去1），同時由於位的結構，固有的47位中只有34位能夠被填充。

## CAN低層標準

ISO 11898系列規定了用於道路車輛的CAN串行通信技術的物理層和數據鏈路層（ISO/OSI模型的第一和第二層），支持分布式實時控制和多路復用。

有如下幾個CAN物理層及其他層的標準：

ISO 11898-1:2015規定了控制器區域網（CAN）的數據鏈路層（DLL）和物理信令。該文檔根據ISO/IEC 7498-1中建立的開放系統互連（OSI）的ISO參考模型，描述了CAN總線層級通用架構，並提供了在模塊之間建立數字資訊交換實現CAN數據鏈路層的特性，和邏輯鏈路控制（LLC）次層和介質訪問控制（MAC）次層的詳細參數。

ISO 11898-2:2003規定了高速（傳輸速率高達1 Mbit / s）介質訪問單元（MAU）和一些介質相關接口（MDI）特性（根據ISO 8802-3），共同組成了控制區域網的物理層。ISO 11898-2使用雙線平衡傳輸線信令體系，是車用動力總成應用和工業控制網路中最常用的物理層。

ISO 11898-3:2006規定了在道路車輛電子控制單元之間建立的低速、容錯、依賴介質的接口的數字資訊交換設置，其傳輸速率在40kBit/s至125kBit/s之間。

ISO 11898-4:2004規定了在CAN中的時間觸發通信（TTCAN）。它適用於在配備CAN的道路車輛的電子控制單元（ECU）之間建立時間觸發的數字資訊交換，並且根據ISO11898-1規定了與邏輯鏈路和介質訪問控制協調的幀同步，提供了時間觸發的通訊時間表。

ISO 11898-5:2007規定了道路車輛內傳輸速率高達1 Mbit/s的CAN網路物理層。它根據ISO 8802-2描述了介質訪問單元的功能以及一些與介質相關的接口功能。它是ISO 11898-2的擴展，應對沒有主動主線通訊但是要求低功耗特性的系統。

ISO 11898-6:2013規定了道路車輛內傳輸速率高達1 Mbit/s的CAN網路物理層。它根據ISO 8802-2描述了介質訪問單元的功能以及一些與介質相關的接口功能。它是ISO 11898-2和ISO 11898-5的擴展，描述了一種可選的，利用可配置的CAN網路幀的選擇性喚醒機制。

ISO 16845-1:2004提供了用於檢查CAN是否符合ISO 11898-1規定所必需的方法和簡要測試套件。

ISO 16845-2:2014設立測試案例和測試要求，驗證具有選擇性喚醒功能的CAN收發器是否符合指定的功能。ISO 16845-2：2014中定義的測試類型稱為一致性測試。

## 基於CAN的高層協議

由於CAN標準不包括例如數據流量控制、設備尋址、傳輸多條消息的數據塊和應用數據等應用層協議的工作，許多高層協議被指定出來。儘管這些協議都能被製造商擴展，但其中只有幾個為商用領域標準化。對於乘用車，每個製造商都有自己的標準。其中包括：

### 標準化的方法

- ARINC 812或ARINC 825（航空工業）
- CANopen - EN 50325-4（工業自動化技術）
- DeviceNet（工業自動化技術)
- EnergyBus - CiA 454（輕型電動汽車）
- ISOBUS - ISO 11783（農用機械）
- ISO-TP - ISO 15765-2（機動車診斷用傳輸協議）
- SAE J1939（公車和卡車的車用網路）
- MilCAN
- NMEA 2000 - IEC 61162-3（航海工業）
- 統一診斷服務（UDS） - ISO 14229 （汽車診斷）

### 其他方法

- CANaerospace - Stock (航空工業)
- CAN Kingdom - Kvaser (嵌入式系統)
- CCP/XCP（汽車ECU校正校準）
- GMLAN - General Motors（通用汽車）
- RV-C - RVIA（娛樂用載具）
- SafetyBUS p - Pilz（工業自動化技術）
- UAVCAN（航空航天及機器人）

## CANopen電梯

CANopen特別興趣組織（SIG）「電梯控制」成立於2001年，為電梯控制系統開發了CiA 417 CANopen應用配置。CiA 417的第一個版本於2003年夏發布。2.0版本於2010年2月在CiA網站公布。SIG致力於擴展CANopen電梯系統的功能，改進技術內容並確保滿足當前對電梯控制系統的法律標準。2.1.0版本於2012年7月發布，於2015年12月發布2.2.0版本（CiA成員可以獲得）標準草案提案。目前（2016年）SIG正在開發2.3.0版本（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協議許可證支付費用。

## 參見

- Byteflight
- 車用音響
- CANopen - 嵌入式系統的通信協議
- CANpie – CAN的開源設備驅動
- CAN FD – 新的具有更快傳輸的CAN
- Can4linux – CAN的開源Linux設備驅動程序
- FlexCAN – 另一種實現方法
- FlexRay – 另一種較高規格的車用網路
- 網路總線列表
- LIN匯流排 – 另一種低成本的車用網路
- MOST
- OBD-II PID – 參數ID列表
- OSEK
- SAE J1939 - 卡車和公共汽車的通信協議
- SocketCAN – 大眾汽車研究院為Linux內核開發的一系列開源CAN驅動程序和網路堆棧。
- DBC檔 (CAN)

## 外部連結

- Bosch參數 （舊文件 - 在某些方面略有含糊/不明確，被標準取代）
- 博世公司CAN FD參數v1.0
- 控制器區域網（CAN）可調度性分析：反駁，重訪和修訂
- 常用的CAN總線連接器引腳
- 獨立討論平台CANLIST
- 關於車用CAN安全性的網頁
- 具有FIFO隊列的控制器區域網（CAN）可調度性分析
- 控制器區域網（CAN）實施指南
- 教程：控制器區域網（CAN）簡介和基礎知識
- Windows系統位時序計算器免費軟體，支持許多單片機。例如Atmel, STM32, Microchip, Renesas (壓縮文件)
- 汽車CAN和CAN-FD保護
- 「CAN簡介」免費電子學習模塊
- ARINC-825教程（影片）來自Excalibur Systems公司。
- ISO - 國際標準化組織
- 了解和使用的控制器區域網，來自加州大學伯克利分校
- Full fledged professional CAN course