什麼是控制器區域網路?
控制器區域網路(Controller Area Network,CAN)是一種應用於汽車領域的資料傳輸協定,允許網路內的多個裝置互相通訊,提供實時可靠的數據傳輸。CAN 由 Bosch 在 1983 年提出,並在 1993 年由國際標準組織(ISO)正式標準化。
目前的 CAN 版本有:
- CAN 2.0 (1991),又稱 Classical-CAN,是最初版本,最大資料速率為 1 Mbps,負載大小最多 8 字節。
- CAN FD (2012),提供更高速的傳輸速率,FD 為 Flexible Data Rate。最大資料速率為 8 Mbps,負載大小最多 64 字節。
- CAN XL (2022),提供比 CAN FD 更高的資料速率和更大的負載容量,並補足傳輸安全性。XL 為 Extra Large。最大資料速率為 10 Mbps,負載大小最多 2048 字節。
主要簡化電子控制器(electronic control units,ECU)或不同裝置之間的通訊通常需要使用UART進行點對點通訊。藉由 CAN 可以大幅降低線路的複雜度,使多個裝置能夠在單一網路上進行高效溝通,從而簡化布線並提高系統的可靠性和效率。
如今的汽機車領域廣泛使用 CAN 通訊,其特性在於:
- 低成本和輕量級網路:通訊使用線性匯流排(linear bus)架構,降低了實施成本,同時保持網路輕量化。
- 實現多設備直接通訊:允許網路上的多個設備直接互相通訊,無需中央主機控制,提升系統的靈活性。
- 提供可靠的實時性:可提供數據傳輸的即時性,特別適用於車輛控制系統場景。
- 抗干擾能力: 使用差動訊號(CAN-High / CAN-Low),提高對電磁干擾的抗性,確保在雜訊高的環境中穩定通訊。
- 低功耗與支援網路喚醒:具備低功耗特性,同時支援網路喚醒功能。
- 簡潔的架構:相較於乙太網路,CAN 的架構更為簡單,使得系統設計和維護更加容易。
其然而,CAN 的不足之處在於傳輸速率和節點數量的限制,不適用於傳輸大量數據如影像和影片。此外,CAN 協定不實現加密功能,需要時需自行實現安全性。
CAN 主要傳輸的內容包括:
- 控制指令
- 感測器數據(車速、轉向角、溫度、檔位)
- 診斷訊息
- 韌體更新
- 即時事件
CAN 的重點摘要
使用 CAN_H(igh) 與 CAN_L(ow) 進行通訊,距離夠短的情況下,基本上不需要接地(GND)。
然而,在長距離傳輸會產生接地偏移(ground offset)進而提升某個節點的 $V_{cm}$,一旦超過 CAN IC 可接受的 $V_{cm}$,則解碼會失敗。
在達成可靠的連接下,會建議使用共用接地點,以避免解碼失敗。
$CAN_H$ 與 $CAN_L$ 為差動訊號。
CAN 使用差動訊號(differential signal)進行通訊。在通訊過程中會遇到雜訊,即共模訊號(common-mode signal)。
電壓可使用 $V_d$ 表示為差動訊號,$V_{cm}$ 為共模訊號。
$V_{cm}$ 是同時存在於 $CAN_{H}$ 與 $CAN_{L}$,透過 CAN IC 內部的差動放大(相減)可以消除共模雜訊。
$V_{cm}=(V_{CANH}+V_{CANL})/2$
$V_{d}=(V_{CANH}+V_{cm})-(V_{CANL}+V_{cm}) = V_{CANH}-V_{CANL}$
根據 CAN 收發器的資料表(datasheet),以一個 5 V 的 CAN 系統,其預設輸出準位為 0.5 $V{cc}$ = 2.5 V($CAN_H$ 對地 / $CAN_L$ 對地)。
- Recessive 表示位元 1,此時:$V_{CANH}$ = $V_{CANL}$ = 2.5 V,$V_{d}$ 為 0 V。
- Dominant 表示位元 0,此時:$V_{CANH}$ = 3.5 V,$V_{CANL}$ = 1.5 V,$V_{d}$ 為 2 V。
- 更詳細的電壓資訊,需要參照 datasheet。
CAN 傳輸使用仲裁(arbitration)機制,其中 dominant 訊號的優先權高於 recessive 訊號。因此,CAN ID 越小,其優先權越高。然而,在系統設計不當的情況下,低優先級的 CAN ID 可能會面臨傳輸困難的風險。
dominant 訊號較為優先是因為 CAN 收發器(CAN tranceiver)其電路架構為 wired-AND 的邏輯實現,想了解架構可以參照 CAN 收發 IC 的 datasheet 進行理解。
當 A 節點發送 dominant 訊號(0),B 節點發送 recessive 訊號(1)時,B 節點會檢測到碰撞衝突,並停止傳輸轉為接收模式。載波檢測多重存取/碰撞避免(Carrier Sense Multiple Access with Collision Avoidance,CSMA/CA)機制會在網路閒置時自動重發,避免碰撞。
若不知道哪條線是 $CAN_H$ 或是 $CAN_L$,可以透過三用電表的平均值或示波器進行評估,$CAN_H$ 平均電壓會高於 2.5 V,而 $CAN_L$ 平均電壓會低於 2.5 V。($V_{cc}$ = 5 V)
CAN 每次發送稱作數據幀(Frames),一個幀裡面主要有目標 ID、長度、資料內容,細節可參考:Frame 格式
CAN 網路的組成為:
- 微處理機(microprocessor,MCU):負責數據處理和應用層邏輯。並內嵌 CAN 控制器,使得 MCU 可以直接處理 CAN 通訊。後續有必要會依靠 CAN 控制器所提供的相關函數,實作高階協定。
- CAN 控制器(CAN controller):處理 CAN 協議相關的封包格式化、仲裁、錯誤檢測等。
- CAN 收發器(CAN transceiver):為一個獨立的 IC,負責將 MCU 端的 TTL 電壓準位轉換為 CAN 網路上的差動訊號,並反向轉換以供 MCU 接收。即將 MCU 端的 TX 和 RX 轉為 $CAN_H$ 與 $CAN_L$ 差動訊號。
- CAN 網路:由 $CAN_H$ 和 $CAN_L$ 兩條差動信號線組成,用於數據傳輸。
CAN 網路的終端點會加上終端電阻(termination resistor)120 Ohms 減少傳輸線路上的反射波。可參考:終端電阻的設計與考量。
- 透過三用電表量測 CAN 網路中的 $CAN_H$ 與 $CAN_L$,網路的等校電阻為 60 Ohms 附近(約 55 Ohms ~ 65 Ohms)。
- 如果為 0 Ohms ~ 5 Ohms,則 $CAN_H$ 與 $CAN_L$ 可能被短路。
- 如果為 30 Ohms ~ 50 Ohms,則網路中可能有多餘的終端電阻或是阻值錯誤。
- 如果為 110 Ohms ~ 140 Ohms,則網路中可能少了一個終端電阻(標準兩個終端電阻並聯為 60 Ohms)。
- 如果為 1 kOhms ~ 10 kOhms,則網路中可能缺少兩個終端電阻。
- 如果為 > 10 MOhms,則 CAN 實體線路斷線。
CAN 有機率丟包,評估整體負載率建議不要超過 60-70%(經驗法則)。
CAN 2.0 最高速率為 1 Mbps,CAN FD 資料傳輸速率最高可達 8 Mbps。
傳輸速率分為兩種:仲裁位元速率(nominal bit rate,NBR)與資料位元速率(data bit rate,DBR)。
CAN 2.0 中,仲裁階段(arbitration phase)與資料傳輸階段(data phase)的速率一致,因此不會特別區分是哪個速率,一般所說的 500 kbps 或 1 Mbps 指的是整個 CAN 的通訊速率。
CAN FD 中,定義了 NBR 與 DBR,其中在仲裁階段可以使用 500 kbps 或是 1 Mbps 的 NBR 以保持與傳統 CAN 的相容性。在資料傳輸階段,則可以使用高達 5 Mbps 的 DBR 進行數據傳輸。
CAN FD 控制器可以向下兼容 CAN 2.0 的封包。
然而,CAN 2.0 控制器無法處理 CAN FD 的封包。原因在於兩者封包的標頭有所不同。當 CAN 2.0 控制器接收到 CAN FD 封包時,會因為 CAN FD 封包中的某些位元配置與 CAN 2.0 標準不符,而回應一個錯誤幀。
即便將 CAN FD 的仲裁位元速率(nominal bit rate,NBR)與資料位元速率(data bit rate,DBR)都設置為相同的 500 kbps,CAN 2.0 接收器仍然無法解碼 CAN FD 的封包。
CAN 的名詞解釋
名詞 | 說明 |
---|---|
Standard CAN | CAN2.0 標準格式,又名 CAN 2.0A,使用 11 個位元表示 ID。 |
Extended CAN | CAN2.0 擴展格式,又名 CAN 2.0B,使用 29 個位元表示 ID。 |
CAN FD | 具備可彈性資料率(Flexible Data),可使用 11 或 29 個位元表示 ID。並且最多可提高到 64 bytes 資料長度。其特點在於資料傳輸時使用更快的傳輸速率,為 CAN FD 被提出的基本理念。而在一幀內傳輸更多的數據也進而更低的 CAN 負載率。 |
CAN XL | 第三代 CAN 協定,擁有比 CAN FD 更長的資料長度(2048 byte)。 |
FlexCAN | NXP 旗下的 IP 模組,實現了 CAN FD 與 CAN 2.0B 協議,並符合 ISO 11898-1 標準。 |
MCAN | TI 旗下的 IP 模組,實現 CAN FD,並符合 ISO 11898-1 標準。 |
MCMCAN | Infineon 實現的模組,MCMCAN 目前已取代自家的 MultiCAN。支援傳統 CAN 與 CAN FD。 |
Vector | 德國公司,提供汽車和嵌入式系統領域的解決方案。 |
CANoe | Vector 用於 CAN 軟體開發及測試工具。可以產生訊號、模擬通訊行為。簡化版本為 CANalyzer |
CANape | 由 Vector 開發的工具,主要用於電子控制單元(electronic control units,ECU)和高級駕駛輔助系統(advanced driver-assistance systems,ADAS)的測量、標定和診斷工具。 |
Peak-System(PCAN) | 德國公司,提供汽車和嵌入式系統領域的解決方案。 |
XCP | 通用的測量和校準協定(universal measurement and calibration protocol),允許外部設備(例如校準工具或測量儀器)與嵌入式系統通信,以進行參數調整、性能評估和故障診斷等操作。 |
UDS | 統一診斷服務(unified diagnostic services),用於車輛診斷系統中進行通訊和訊息交換的通訊協定。在汽車行業中用於車輛診斷的標準之一,它定義了統一的服務和診斷協定,以確保不同車輛製造商的診斷工具可以與車輛的控制單元(ECU)進行有效的通訊。 |
OBD-II | 為標準協定,允許外部電子設備訪問車輛的內部電腦系統,以進行診斷和排放測試。通常在車上會看到 16-pin(2x8) 的 SAE J1962 母頭連接器 |
.dbc | CANdb-資料庫檔案,由 Vector 所開發的檔案格式,為業界標準。廣泛用於 CAN 相關軟體。描述 CAN 網路上 ID 、名稱、長度等相關內容。 |
CiA | CAN in Automation(CiA)是國際用戶和製造商組織,開發並支持基於 CAN 的高層協定及其國際標準化。以改善 CAN 協定未包含的範疇。像是流量控制、裝置定址、汽車電子控制單元校調(XCP)等… |
CANopen | 基於 CAN 的通訊協定所實現的高層通訊協定。適用於嵌入式應用。它擴展了 CAN 的能力,支援更大的封包大小,並提供了豐富的通訊功能,使其適用於更複雜的機械自動化應用。由 CiA 組織開發和維護。 |
AUTOSAR | AUTOSAR(AUTomotive Open System ARchitecture)是一個全球性開放標準,旨在推動汽車電子系統的軟體架構開發。它由汽車製造商、供應商和軟體公司共同制定,目的是提供一個可擴展和可重用的軟體平台,以應對日益複雜的汽車電子系統需求。 |
DeviceNet | 基於 CAN 的通訊協定所實現的高層通訊協定。主要用於工廠自動化,作為控制器(PLC)與工業 I/O 裝置(例如限位開關、感應器、驅動器、顯示器和操作界面)之間的通訊。由 Open DeviceNet Vendor Association(ODVA)維護。 |
SAE J1939 | 基於 CAN 的通訊協定所實現的高層通訊協定。主要針對車輛應用。它允許在車輛系統中進行廣泛的數據交換,支援消息的無限長度,並支持主/從結構,適用於複雜的車輛通信需求。由國際汽車工程師學會(Society of Automotive Engineers,SAE)制定的標準。 |
CanKingdom | 基於 CAN 的通訊協定所實現的高層通訊協定。專門用於工業和嵌入式系統中的分佈式控制系統。其設計目的是提供一個靈活且高效的通信架構,以便在使用 CAN 協定的系統中實現更高層次的協作和管理。 |
recessive bit | CAN 訊號的邏輯位元 1。 |
dominant bit | CAN 訊號的邏輯位元 0。 |
資料幀格式(data frame)
開始旗標(start of frame,SOF),用於表示資料幀開始的旗標。CAN 節點開始之前會檢測有沒有 11 個位元 1,以確定整個網路為閒置狀態。
仲裁欄位(arbitration field,12 or 32 bit)
- base ID(11 bit)
- 遠程傳輸請求(remote transmission request,RTR),在實際應用中幾乎不使用。
- 擴展 CAN 中,多了遠程請求(substitute remote request,SRR)、IDE 旗標、擴展 ID(extended ID,18 bit)。
控制欄位(control field,6 bit)
- ID 擴展(identifier extension,IDE)旗標,若為 CAN 2.0A 則為位元 0。
- 保留位元 (r0),預設為位元 0。
- 數據長度編碼(data length code,DLC),使用 4 bit 表示後續的資料長度。
資料(data field),使用 1 ~ 8 個 byte 表示傳遞資料。
CRC 欄位(16 bit),包含 15 bit 的 CRC 序列與 CRC 分隔符。
確認欄位(acknowledgement field,2 bit),包含了 ACK slot 和 ACK delimiter。如果 CRC 匹配成功,則會在 ACK slot 為位元 0。ACK delimiter 固定為位元 1。
結束旗標(EOF,7 bit),表示整個幀結束。7 個位元 1 表示幀的結束。
幀間隔(interframe space,IFS),固定 3 個位元 1,確保相鄰的幀有足夠時間間隔。這段時間可以拿來防止干擾、同步,並為接收下一個幀做準備,以及進行錯誤處理。
- 每個訊息幀固定由 11 個位元 1 結尾,分別為 ACK delimiter、EOF、IFS。節點在新的 SOF 旗標,會檢測是否有 11 個位元 1 判斷網路是否為閒置。其中 SOF 為進行節點同步的機制。
- SOF 到 CRC 內只允許連續 5 個位元相同,如果連續 5 個位元 0 或 1,則會塞入一個相反位元作為填充位元(stuff bit),該填充位元可用於訊號同步、也可藉由此機制確定通訊是否異常以提高可靠性。
CAN FD 特點與差異
CAN FD 的思維在於 CAN 2.0 的改良。其重點為:
在一幀內傳輸更多的資料,以降低 CAN 負載。
更快的資料速率。
CAN FD 控制器可向下兼容處理 CAN 2.0 標準。但 CAN 2.0 的控制器沒辦法處理 CAN FD 的封包。
支援 11 與 29 位元的 ID。
移除遠端幀(remote frame),因此將資料中的 RTR 替換為 Remote Request Substitution bit(RRS),並始終為位元 0。
CAN 2.0 中的 r0 位元重新命名為 FD frame(FDF),固定為位元 1。
使用位元速率切換(bit rate switch,BRS)旗標來決定是否以更高的資料傳輸速率(DBR)傳遞資料。
若 BRS 為 0,則和 CAN 2.0 一致使用固定的速率(NBR)傳輸位元。
Error Status Indicator(ESI),預設為位元 0 表示正常工作,若為位元 1 則表示錯誤被動模式。
Stuff bit count(SBC)為三個格雷碼與一個奇偶位元,提高通訊的可靠性。
上圖可以看到,CAN 2.0 與 CAN FD 在傳送相同資料下,如果未開啟 BRS,位元傳送的速率是走 NBR。
開啟 BRS ,資料傳輸率可以最高走 8 Mbps 的速度進行傳輸。圖中所使用的 DBR 分別是 4 倍與 10 倍的 NBR。
位元時間(Bit timing)
位元時間用於確保 CAN 網路上的正確同步和通訊。它涉及配置時間參數,以確保網路上的所有節點都能正確地傳輸和接收數據。
位元結構
針對 CAN 所配置的速率,如 500 kbps 的 NBR,表示每秒傳送 500000 的位元。
將傳輸速率倒數,可以得到每個位元的時間,稱為位元時間(Tb 或是 Tnbt)。
一個位元時間分為 4 段,其中這 4 段分別為:
- 同步區段 (sync segment,SYNC_SEG)
- 傳輸時間區段 (propagation time segment,PROP_SEG)
- 相段緩衝區段 1(phase buffer segment 1,PHASE_SEG1)
- 相段緩衝區段 2(phase buffer segment 2,PHASE_SEG2)
以 500 kbps 的傳輸速率(NBR),表示 Tb = 2 us (公式 1)。這四段時間相加為一個 Tb(公式 2)。
其中傳輸時間區段需要考慮,Node A 處理時間、傳輸時間、Node B 處理時間。
也因此傳輸時間區段至少為:兩倍的物理傳輸延遲 + Node A 處理時間 + Node B 處理時間。
Node A 在傳送 SOF 時,才能滿足 CAN 仲裁的優先機制。
Time Quantum(Tq)
Tq 是 CAN 位元時間中使用的最小時間單位,可以用來評估 CAN 位元時間的基本單位。通常為奈秒。
位元時間分為 4 段,使用最小的單位時間(Time Quantum,Tq)表示每段的長度。
以一個 80 MHz 的裝置時脈,Tq = 1 / 80 MHz = 12.5 ns
如果需要將 CAN FD 的資料位元率(DBR)設定 5000 kbps。
配置 Tsync_seg = 1 (固定),Tseg1 = 13,Tseg2 = 2。整個 Tq 為 16 個單位。
12.5 ns × 16 = 0.2 us 表示一個位元為 0.2 us,將其倒數可以得到 5000 kbps。
預除器(baud rate prescaler,BRP)
裝置內有不同的時脈,使用裝置內部的 BRP 可以進行除頻,以調整 Tq。
例如,如果裝置的時脈為 80 MHz,則 Tq 為 12.5 ns。
若 BRP 設置為 2,則除頻後時脈變為 40 MHz,此時 Tq 為 25 ns。
取樣點(sample point)
一個位元時間內的取樣位置,用來決定 CAN 網路上的狀態為 0 還是 1。
根據行業標準(如 CANopen、DeviceNet),CAN 的取樣點建議使用 87.5%。這是因為 87.5% 的取樣點在網路長度和振盪器誤差之間提供了良好的平衡。
同步跳躍寬度(Synchronization Jump Width,SJW)
SJW 用來補償振盪器的容忍度。與相位緩衝段(Phase Buffer Segments)Phase_Seg1 和 Phase_Seg2 共同作用,以確保 CAN 線路中的同步性。
在 CAN 系統中,振盪器的頻率可能會因溫度變化、電壓波動或元件老化而產生變化。
為了確保不同節點之間的通信穩定,使用相位緩衝段和 SJW 這兩個機制,以補償由於振盪器容忍度引起的相位偏移。
此數值與 NBR、DBR 無關,主要是提供時脈偏移的容忍度,常態值為 1 ~ 2 個 Tq。
計算區段時間
需要考慮
- MCU IC 時脈
- 位元速率(NBR / DBR)
- 傳輸線延遲
- CAN IC 延遲
- 溫度(無法控制)
其中已知數值:
- 位元速率(NBR / DBR)
- 系統時脈(MCU 可能為 8 MHz / 20 MHz / 40 MHz / 80 MHz)
可以透過計算機進行初步評估。根據選定的取樣率(常見為 75 % ~ 90 %,建議使用 87.5 % 進行評估)。
便可決定要多少的 prescaler、TSEG1 與 TSEG2。
終端電阻的設計與考量
標準終端電阻(standard termination)
如前所述,整個 CAN 網路的兩端須配置 120 Ohm 的終端電阻,該數值符合 ISO 11898-2 的規範。由於在兩端各有一個電阻,因此從任一端點觀察時,總輸入阻抗為兩個終端電阻並聯後的結果,約為 60 Ohm。在無電源的情況下,可以使用電表跨接在 $CAN_H$ 和 $CAN_L$ 測量阻抗,其值應在 45 至 65 Ohm 之間。
根據 ISO 11898 的定義,CAN 網路的最高傳輸速率為 1 Mbps,總線長度不應超過 40 公尺,殘段(stub)長度應限制在 0.3 公尺以內,且最大節點數為 30 個。
為了支持更複雜的網路結構,適當的網路設計可減少訊號反射的影響,讓網路能夠支援更長的主線、更長的殘段以及更多的設備。
範例:考慮一個 CAN 網路,兩端各配置 120 Ohm 的終端電阻,若另外連接 8 個裝置,且這 8 個裝置以較長的纜線相連,則這些裝置可以考慮設置終端阻抗為 2.6 kOhm,以維持所需的整體網路阻抗。經計算,此情況下的總阻抗如下:
|
|
根據 ISO 規範,CAN 網路的兩端需各配置 120 Ohms 的終端電阻
。
在實驗室中:
由於測試距離較短,即便殘段端的電阻有無配置,通常仍可正常通訊。在實驗室測試時,訊號反射品質通常較佳,難以觀察到其實際效果。最終會在整車網路中進行信號評估,以確認整體通訊的穩定性。
分離式電阻(split termination)
使用分離式電路組成的 RC 濾波可以濾除高頻雜訊:
即兩個相同電阻(60 Ohms)串接對地,中間並聯一個 4.7 nF 電容對地,其效果為低通濾波器,可以有效提高抗干擾的能力並減少電磁輻射。
其截止頻率 $f_c = 1/(2πRC)$,可計算出約為 1.12 MHz ($R_t$ = 30 Ohms),即超過該頻率的訊號會被濾除。
PCAN-View 收發測試
本節說明 PCAN 的基礎設定,並解釋前章節的參數與其對應介面。
開啟 PCAN-View。上方為接收端,下方為傳送端。
插入硬體後,點選左上方的連接 ICON,可以進入裝置的設定。
這邊走的是 CAN FD,NBR 與 DBR 分別為 1000 kbps 與 5000 kbps。取樣點設定為 87.5%。
設定裝置後,MCU 目前固定每 500 ms 傳送一次資料。可以看到 Receive 端出現 0xC0 的 ID。
若要送資料給 MCU,在 Transmit 空白處右鍵,點 New message…。
傳送資料類型為 CAN FD,並開啟 BRS 加快資料的傳輸。資料長度為 64 個 byte。
新增後,選中 Transmit 底下的 msg,點選空白鍵發送 msg。MCU收到資料後回傳 0x777。
參考文獻
- History of CAN technology
- FlexCAN控制器
- Getting Started with the MCAN (CAN FD) Module
- Introduction to the Controller Area Network (CAN)
- Basics of debugging the controller area network (CAN) physical layer
- TJA1040 high speed CAN transceiver
- Practical tips: CAN-Bus
- SN65HVD23x 3.3-V CAN Bus Transceivers
- ISO 11898-1:2015 - Road vehicles
- ISO 11898-2:2016 - Road vehicles
- XCP (protocol)
- Unified Diagnostic Services
- CAN bus
- Learning Module CAN
- CAN FD Explained
- Calculator for CAN Bit Timing Parameters
- The Configuration of the CAN Bit Timing
- CAN Bit Timing Requirements
- Top Design Questions About Isolated CAN Bus Design
- How To Properly Wire A CAN Bus
- A CAN Physical Layer Discussion
- CAN BUS Troubleshooting Guide
- Rules and recommendations for in-vehicle CAN networks