AUTOMORPHSW Team

CAN Bus 錯誤訊框從哪來?錯誤計數器與 Bus-Off 的除錯路徑

CAN Bus 錯誤訊框從哪來?錯誤計數器與 Bus-Off 的除錯路徑

整合測試跑到凌晨,Trace 裡出現一次錯誤訊框(Error Frame),之後又恢復正常。五家供應商的 ECU 掛在同一條匯流排上,每一家都說「不是我的」。要走出這個羅生門,第一步是搞清楚:錯誤訊框不是故障本身,它是 CAN 控制器的告狀機制

錯誤訊框是「誰先發現誰舉手」

CAN 的錯誤偵測是分散式的:匯流排上每一個節點都在即時檢查每一個訊框。任何節點只要發現異常,立刻送出錯誤旗標(Error Flag)打斷當下的傳輸,發送端隨後自動重傳。

這個設計有個重要的推論:看到錯誤訊框,不代表發出它的節點有問題——它可能只是第一個發現問題的目擊者。除錯時要問的不是「誰發了錯誤訊框」,而是「它看到了什麼」。

五種錯誤類型,指向不同的根因

錯誤類型控制器看到什麼常見根因方向
位元錯誤(Bit Error)自己送出的位元,讀回來不一樣訊號品質:終端電阻、分支過長、反射
填充錯誤(Stuff Error)連續六個相同位準干擾、位元時序設定不一致
CRC 錯誤校驗值對不上傳輸途中被雜訊改掉
格式錯誤(Form Error)固定格式欄位出現不該有的位準時序、干擾
ACK 錯誤沒有任何節點回應確認對端沒上線、鮑率不一致、實體斷線

實務上最有價值的分辨是:只有一個節點回報,還是大家一起回報。單一節點頻繁舉手,通常是它自己的接收路徑有問題(焊點、收發器、時序容忍度);全體同時舉手,問題多半在匯流排本身(終端、拓樸、共模干擾)。

錯誤旗標在位元層長什麼樣

錯誤旗標的設計很巧妙:主動錯誤旗標是連續六個顯性位元——這故意違反了 CAN 的位元填充規則(正常訊框裡不允許連續六個相同位準)。於是其他節點一看到就知道「有人在報錯」,跟著送出自己的旗標,多個旗標疊加後,匯流排上會出現一段最長十二個顯性位元的疊加旗標,之後接八個隱性位元的錯誤定界符,然後大家重新開始。

在 Trace 工具裡看到的「一個 Error Frame」,實際上是這整段疊加的結果。用示波器對照時序,可以分辨誰先拉、誰跟進——這是純協定層分析看不到的資訊,也是定位「第一個目擊者」的關鍵。

被動錯誤旗標是六個隱性位元——隱性在 CAN 上是「弱」位準,蓋不過別人的傳輸。這就是 Error Passive 狀態的實際意義:你還可以自己碎念,但打斷不了任何人。一顆進入 Passive 的節點對匯流排無害,但它自己的資料可靠性已經亮黃燈。

TEC 與 REC:控制器的自我懲罰機制

每個 CAN 控制器內建兩個錯誤計數器:發送錯誤計數 TEC 與接收錯誤計數 REC。規則出自 ISO 11898-1:

  • 發送時發現錯誤:TEC 加 8
  • 接收時發現錯誤:REC 加 1
  • 成功收發一個訊框:對應計數器減 1

注意那個不對稱——發送錯誤的懲罰是接收的八倍。這讓「一直送壞訊框的節點」很快被隔離,而不會拖累整條匯流排:

  • 計數超過 127:進入 Error Passive。還能收發,但錯誤旗標改為隱性,等於「不能再打斷別人」;發送端在連續發送之間還會被罰多等一段暫停時間(Suspend Transmission)
  • TEC 超過 255:進入 Bus-Off,控制器直接離線

所以「某個 ECU 突然從匯流排上消失」的案例,多半不是它當機,而是它把自己數到 Bus-Off 了。往回追它離線前的錯誤類型,通常就能找到方向。

Bus-Off 之後呢? 依 ISO 11898-1,控制器要在匯流排上觀察到 128 次、每次 11 個連續隱性位元之後,才允許重新加入。實務上還有一層軟體策略:立刻自動恢復、延遲恢復、還是等待上層指令——這是應用層的設計決定,功能安全分析常常漏掉這一格。恢復太急,壞節點反覆撞牆把整條匯流排拖下水;恢復太慢,這顆節點負責的功能斷太久。測試案例應該同時覆蓋「恢復成功」與「反覆 Bus-Off」兩種路徑。

偶發問題的正解:把它變成可重現

三天出現一次的錯誤訊框,用示波器守株待兔是等不到的。可行的路徑有兩條:

  1. 協定感知觸發:讓量測設備在「錯誤訊框出現的那一刻」自動抓下波形,而不是人盯著看。CANoe 搭配 Option .Scope 就是這個用途——協定事件與波形在同一個時間軸上對照。
  2. 干擾注入重現:與其等它發生,不如主動製造。用干擾產生器在指定訊框的指定位元位置注入顯性或隱性脈衝,把「三天一次」變成「三十秒一次」,修完立刻驗證。

除錯順序建議

  1. 先分「單一節點還是全體」——方向差很多
  2. 查錯誤類型分布——ACK 錯誤查連線與鮑率,位元錯誤查訊號品質
  3. 讀 TEC/REC 走勢——持續上升代表問題還在,不是偶發
  4. 抓錯誤當下的波形——判斷是協定層還是實體層
  5. 用干擾注入驗證假設——能主動重現,才算真的找到

下一步

如果您的專案正卡在「偶發、無法重現」的網路問題,這正是我們最常被找來處理的題目。歐特莫夫(Vector Informatik 合作夥伴)用 CANoe、Option .Scope 與 VH6501 干擾產生器,把相容性測試的流程與證據一次建起來。