CAN Bus 錯誤訊框解析:Error Frame、Error Passive 與 Kvaser 診斷入門

CAN 技術入門 · 錯誤處理與測試診斷

CAN Bus 錯誤訊框(Error Frame,也常稱「錯誤幀」)是 CAN 控制器處理通訊異常的機制。它由錯誤旗標與錯誤分隔符構成,用來處理當前訊框的錯誤;在一般自動重傳設定下,發送端會再嘗試傳送。

理解錯誤訊框,要先分清單一節點的錯誤旗標、匯流排上的疊加結果,以及節點的錯誤狀態。本文以 Classical CAN 為範圍,接著說明如何利用 Kvaser USB to CAN 與 CANlib 觀察錯誤事件。

CAN Bus 錯誤訊框是什麼?

錯誤訊框是 CAN 協定中的錯誤處理結構,不是帶有一般應用資料的正常訊框。它包含 Error Flag(錯誤旗標)及 Error Delimiter(錯誤分隔符);後者為 8 個隱性位元。

處於 Error Active 狀態的節點偵測到錯誤時,可發出由 6 個顯性位元組成的主動錯誤旗標。其他節點偵測到被破壞的訊框後,依協定處理當前訊框,並可能發出自己的錯誤旗標。Error Passive 節點的旗標則由 6 個隱性位元組成,其影響與主動旗標不同。

CAN 控制器如何偵測與處理錯誤?

Classical CAN 透過位元監測、位元填充檢查、格式檢查、ACK 檢查與 CRC 檢查偵測錯誤,並搭配錯誤通知、重傳與錯誤限制維持通訊。仲裁時正常輸掉優先權,不應直接判定為位元錯誤。

以下以三個 Error Active 節點作簡化說明:發送節點察覺送出與讀回的位元不一致,發出主動錯誤旗標;其他節點偵測到異常後亦反應。受影響的訊框被捨棄,發送端在匯流排可用及控制器設定允許的條件下重新傳送。

CAN 三節點的錯誤偵測、錯誤通知與訊框重傳流程示意
圖 1|三節點的簡化錯誤處理示例。先分清原始錯誤與其他節點對錯誤旗標的反應。

位元填充與錯誤旗標的關係

Classical CAN 的動態位元填充規則適用於 SOF 至 CRC 序列的相關區段:連續五個相同邏輯值的位元後,發送端插入一個相反值的填充位元,接收端再移除填充位元。不是整個訊框的所有欄位都採這項規則。

Classical CAN 正常資料訊框的位元序列示意
圖 2|正常 Classical CAN 資料訊框示意,供後續位元填充與錯誤旗標比較。

主動錯誤旗標包含連續 6 個顯性位元,因此在填充區段能引發其他節點的填充錯誤。若錯誤發生於固定格式欄位,其他節點也可能透過格式檢查察覺異常,不能將所有錯誤通知都只解釋為填充錯誤。

Classical CAN 位元填充與主動錯誤旗標示意
圖 3|在需要動態位元填充的區段,連續五個同值位元之後插入相反位元;主動錯誤旗標可打破此規則。

錯誤計數器如何限制故障節點?

每個 CAN 節點以發送錯誤計數器 TEC 與接收錯誤計數器 REC 追蹤錯誤狀態。錯誤累積可使節點轉為 Error Passive;當 TEC 超過 255 時,節點進入 Bus Off。

常見入門示例會將發送錯誤表示為 TEC 增加 8、接收錯誤表示為 REC 增加 1,但完整規則包含例外及其他增減條件。成功通訊可使計數下降,不能把這個簡化示例當成所有錯誤的固定公式。

主動錯誤旗標為何可能形成 6~12 個顯性位元?

單一節點的主動錯誤旗標仍是 6 個顯性位元。當不同節點在不同時間開始發出旗標,匯流排上的旗標疊加區段可能形成 6~12 個顯性位元;這不是單一旗標自行變長。

CAN 節點的主動錯誤旗標及疊加關係示意
圖 4|節點發出錯誤旗標的起點不同,匯流排上的顯性位元序列可能延長。

6 位元範例:節點同時發現錯誤

各節點同時發出主動錯誤旗標時,6 位元序列完全重疊,匯流排上的旗標區段維持 6 個顯性位元。此圖例用來理解起點相同的疊加結果。

多個 CAN 節點同時發出主動錯誤旗標的 6 位元範例
圖 5|6 位元示例:各節點的主動錯誤旗標在同一時刻開始,彼此重疊。

12 位元範例:其他節點較晚反應

若其他節點直到第一個旗標的第 6 個位元才偵測到填充錯誤,接著才開始送出自己的 6 位元主動旗標,疊加區段可延長至 12 個顯性位元。

CAN 節點先後發出錯誤旗標形成 12 個顯性位元的範例
圖 6|12 位元示例:其他節點較晚偵測到異常,後續主動錯誤旗標延長顯性序列。

9 位元範例:旗標部分重疊

若第一個旗標開始前已有 3 個顯性位元,其他節點可能在第一個旗標進行到一半時就偵測到填充錯誤。後續旗標與前一旗標部分重疊,使圖中從第一個旗標起點計算的區段為 9 個顯性位元。

圖例的計數必須先確認起點;旗標之前已存在的資料位元,不應全部算成錯誤旗標。旗標區段與後續 8 位元錯誤分隔符,也不能混成同一長度。

CAN 節點錯誤旗標部分重疊形成 9 個顯性位元的範例
圖 7|9 位元示例:後續旗標與第一個旗標部分重疊。

Error Active、Error Passive 與 Bus Off 有何差異?

Error Passive 仍可參與通訊,Bus Off 則停止參與正常匯流排通訊。區分狀態時,需同時看 TEC/REC 與節點行為,不能只憑看到錯誤旗標就認定 Bus Off。

Classical CAN 節點錯誤狀態比較
狀態判定條件偵測錯誤時的旗標通訊行為
Error ActiveTEC 與 REC 均小於 128。6 個顯性位元的主動錯誤旗標。可正常參與通訊,主動旗標可破壞當前訊框。
Error PassiveTEC 或 REC 達到 128,且尚未 Bus Off。6 個隱性位元的被動錯誤旗標。仍可參與通訊,發送行為有額外限制。
Bus OffTEC 超過 255。不再發出正常通訊與錯誤旗標。退出正常匯流排通訊;恢復程序需依控制器與系統設定確認。

Error Passive 發送節點與接收節點的差異

被動錯誤旗標由隱性位元組成,不能像主動旗標一樣強制匯流排呈現顯性。對發送節點而言,它偵測錯誤後的行為可能使其他節點也發現填充或格式異常,其他 Error Active 節點便可能發出主動旗標;但不是每次被動旗標都必然引發全網反應。

Error Passive 發送節點的被動錯誤旗標示意
圖 8|Error Passive 發送節點示意;其他節點是否發出主動旗標,取決於它們實際偵測到的錯誤。

對 Error Passive 接收節點而言,它的隱性旗標不能覆蓋其他發送節點的顯性資料。因此,不能把它在本地偵測到的每個錯誤,視為所有節點都一定會丟棄當前訊框。

Error Passive 接收節點的被動錯誤旗標示意
圖 9|Error Passive 接收節點示意;被動旗標的隱性位元無法覆蓋其他節點送出的顯性位元。

如何使用 Kvaser 觀察 CAN 錯誤?

使用支援相關功能的 Kvaser CAN 介面與 CANlib,可在接收資料流程中辨識錯誤事件,並讀取所選介面通道的控制器狀態與錯誤計數資訊。這些資料有助於建立異常時間紀錄,但不會自動提供全網所有節點的內部狀態。

錯誤事件、控制器狀態與電氣波形的分工

CANlib 的三項觀察入口各有不同用途。硬體、韌體、驅動及軟體支援情況應依實際設備確認。

  • 錯誤事件:檢查 canRead() 回傳旗標中的 canMSG_ERROR_FRAME,先辨識錯誤事件,再處理一般資料訊框。
  • 介面自身狀態:以 canReadStatus() 查看所選通道的 Error Active、Error Passive 或 Bus Off 等狀態。
  • 錯誤計數資訊:以 canReadErrorCounters() 取得介面控制器資訊;部分控制器不提供精確計數,可能回傳估計值。

一般錯誤事件的識別碼、DLC 與資料欄位不應當作正常應用訊框解碼,也不能假設它們直接指出故障節點。若要確認振鈴、電壓異常或逐位元邊緣時序,仍需合適的示波器或實體層量測設備。

出現 Error Frame 時的基本檢查順序

先核對網路配置與接收條件,再將錯誤事件和現場條件對照,通常比只反覆更換介面更有診斷價值。

  1. 確認協定與位元時序:核對 Classical CAN/CAN FD、位元率、取樣點與 SJW,避免節點設定不一致。
  2. 檢查接線與終端:確認 CAN H、CAN L、參考接地與拓樸。對典型高速 CAN 雙端 120 Ω 終端網路,可在斷電且適當隔離條件下檢查約 60 Ω 的等效電阻;其他實體層與拓樸不可直接套用。
  3. 確認 ACK 節點與監聽模式:發送端需要其他正確接收且可回覆 ACK 的節點;靜默監聽介面不提供 ACK。
  4. 記錄錯誤與自身狀態:將事件時間、狀態及計數變化,與供電、線束操作和設備啟停條件對照。
  5. 必要時補電氣波形:針對疑似線材、終端或雜訊問題進行實體層量測,修正後重做相同條件的測試。

常見問題

收到 Error Frame,就能知道是哪個 CAN 節點故障嗎?

不能。Error Frame 事件表示控制器偵測到通訊異常,但通常不足以直接定位故障節點。需要結合發生時間、介面自身狀態、位元時序設定、接線與終端檢查,必要時再量測電氣波形。

Error Passive 是否表示節點完全不能傳送資料?

不是。Error Passive 節點仍可參與通訊,但錯誤旗標與再次發送的行為受到限制;Bus Off 節點則不再參與正常匯流排通訊。兩者不能混為同一狀態。

CANlib 讀到的 TEC/REC,是所有節點的計數器嗎?

不是。canReadErrorCounters() 讀取的是所選 Kvaser 介面通道的 CAN 控制器計數資訊,不是全網所有節點的 TEC/REC。部分控制器無法直接提供精確值,CANlib 可能回傳估計資訊,應確認設備能力。

只有一個發送節點,另一個介面採靜默監聽,為何可能一直報錯?

靜默監聽介面不提供 ACK。若匯流排沒有其他正常接收並回覆 ACK 的節點,發送端可能持續遇到 ACK 錯誤。架設測試時需確認接收節點模式與位元時序;不能把 ACK 錯誤直接等同於線路損壞。

延伸閱讀與 Kvaser USB to CAN 選型

若需要在支援腳本的設備上進行本地 CAN 處理,可延伸閱讀Kvaser t Script 開發與 CAN 閘道器應用指南。t Script 能力須依型號確認,不是所有 Kvaser 介面都支援。

若想了解資料擷取的實際應用,可參考Kvaser 車輛排放資料擷取案例;該案例用來理解應用情境,不作為錯誤訊框定位能力的證明。

從量測需求選擇 CAN 介面

準備評估設備時,可整理通道數、Classical CAN/CAN FD、電氣隔離、軟體開發及錯誤觀察需求,讓介面選型對應實際測試工作。

了解 Kvaser USB to CAN 與測試開發工具