總線關閉(bus off)是CAN節點比較重要的錯誤處理機制。那麼,在總線關閉狀态下,CAN節點的恢複流程是怎樣的?又該如何理解節點恢複流程的“快恢複”和“慢恢複”機制?本文将為大家詳細分析總線關閉及恢複的機制和原理。
故障界定與總線關閉狀态
為了避免某個設備因為自身原因(例如硬件損壞)導緻無法正确收發報文而不斷的破壞總線的數據幀,從而影響其它正常節點通信,CAN網絡具有嚴格的錯誤診斷功能,CAN通用規範中規定每個CAN控制器中有一個發送錯誤計數器和一個接收錯誤計數器。根據計數值不同,節點會處于不同的錯誤狀态,并根據計數值的變化進行狀态轉換,狀态轉換如下圖所示。
圖1節點狀态轉換圖情形1
以上三種錯誤狀态表示發生故障的嚴重程度,總線關閉是節點最嚴重的錯誤狀态。并且,節點在不同的狀态下具有不同的特性,在總線關閉狀态下,節點不能發送報文或應答總線上的報文,也就意味着不能再對總線有任何影響。
狀态跳轉和錯誤計數的規則使得節點在發生通信故障時有了較好的自我錯誤處理和恢複機制,從一種較嚴重的錯誤狀态跳轉到另一種嚴重性相對較低的狀态,本質上就是一種恢複過程。圖1所呈現的轉換過程是CAN通用規範所要求的,我們從設備供應商買回來的CAN控制器已經把這些功能固化在矽片之中。
在通信過程中,錯誤主動和錯誤被動兩種狀态下節點的恢複過程一般不需要MCU進行額外的編程處理,直接使用CAN控制器固有功能即可。但對于總線關閉狀态,往往不直接使用CAN控制器固有的恢複過程,而是對其進行編程控制,以實現“快恢複”和“慢恢複”機制。
注:
由于篇幅有限,關于錯誤計數的詳細規則以及各狀态下節點的具體特性不在本文進行讨論,讀者可以查閱CAN的相關協議規範。
本文的“CAN控制器”是指已經實現了CAN通用協議物理層和數據鍊路層所要求的功能和特性的器件,如SJA1000;而“節點”是指把CAN控制器與MCU、收發器等相關器件進行整合開發出來的具有一定功能的CAN節點。
為什麼需要對總線關閉狀态的節點實現“快恢複”和“慢恢複”策略?
當節點進入總線關閉狀态後,如果MCU僅是開啟自動恢複功能,CAN控制器在檢測到128次11個連續的隐性位後即可恢複通信,在實際的CAN通信總線中,這一條件是很容易達到的。以125K的波特率為例,128*11*(1/125000)= 0.011264s。這意味着如果節點所在的CAN總線的幀間隔時間大于0.011264s,節點在總線空閑時間内便可輕易恢複通信。我們已經知道,當進入總線關閉狀态時,節點已經發生了嚴重的錯誤,處于不可信狀态,如果迅速恢複參與總線通信,具有較高的風險,因此,在實際的應用中,往往會通過MCU對CAN控制器總線關閉狀态的恢複過程進行編程處理,以控制節點從總線關閉狀态恢複到錯誤主動狀态的等待時間,達到既提高靈活性又保證節點在功能上的快速響應性的目的。具體包括“快恢複”和“慢恢複”策略,兩種策略一般同時應用。
通過以上的讨論,我們可以知道,節點進入總線關閉狀态後,存在以下幾種恢複情況:
MCU僅開啟CAN控制器的自動恢複功能,節點隻需檢測到128次11個連續的隐性位便可以恢複通信,恢複過程如圖1所示。
MCU沒有開啟CAN控制器的自動恢複功能,也不主動幹預總線關閉錯誤,節點将一直無法“自動”恢複總線通信,隻能通過重新上電的方式使節點恢複, 恢複過程如圖2所示。
圖2 節點狀态轉換圖情形2
MCU對CAN控制器的恢複過程進行編程處理,這時,節點的恢複行為由具體的編程邏輯決定,各廠家普遍采用了先“快恢複”後“慢恢複”的恢複策略,恢複過程如圖3所示。
圖3 節點狀态轉換圖情形3
MCU如何實現“快恢複”和“慢恢複”?
MCU編程實現總線關閉“快恢複”和“慢恢複”的一般過程可用以下流程圖描述:
圖4 MCU實現總線關閉恢複流程
節點以正常發送模式發送報文的過程中,如果出現了發送錯誤,發送錯誤計數會增加,隻要發送錯誤計數沒有超過255, CAN控制器便會自動重發報文,如果出現多次發送錯誤,使發送錯誤計數累加超過255,則節點跳轉為總線關閉狀态。MCU能夠第一時間知道節點進入了總線關閉狀态(例如在錯誤中斷處理邏輯中查詢狀态寄存器的相應位),這時MCU控制CAN控制器進入“快恢複”過程,即控制CAN控制器停止報文收發,并進行等待,計時達到需要的時間T1(如100ms)後,MCU重新啟動恢複CAN控制器參與總線通信,這樣便完成了一次“快恢複”過程。
節點每進入一次“快恢複”過程時,MCU會對此進行計數,當節點“快恢複”計數達到設定的值N(如5次),則後續再次進入總線關閉狀态時MCU把恢複總線通信的等待時間T2進行延長(如1000ms),這樣便實現了“慢恢複”過程。“快恢複”和“慢恢複”過程的主要區别就在于恢複節點參與總線通信的等待時間的不同。
通過MCU對于總線關閉後的恢複行為進行編程控制,實際上是對CAN控制器的錯誤管理和恢複機制進行了補充,使得總線關閉狀态後的恢複過程更加靈活,更能适應實際應用的需要。對于 “快恢複”和“慢恢複”的等待時間,以及“快恢複”計數多少次後進入“慢恢複”過程,不同廠家可根據具體的需求進行編程實現。
實測總線關閉恢複過程
通過廣州緻遠電子有限公司的CAN總線分析儀的流量分析功能,可以很方便分析總線關閉後節點的恢複過程及測試“快恢複”和“慢恢複”的恢複時間。
第一步,連接DUT但先不要上電。按以下配置,使能接收幹擾功能,并開啟報文讀取功能。
圖5 功能設置
第二步,給DUT上電,并采集一段時間報文,停止采集後使用流量分析功能進行分析。
圖6 采集報文并進行流量分析
第三步,鼠标放置于波形“團”(本文把包含多幀密集幀的波形稱為波形“團”)之間讀取恢複時間。
圖7 讀取恢複時間
至此,我們便可以得出結論:該DUT對總線關閉的恢複過程進行了編程控制,采用了先“快恢複”後“慢恢複”的恢複機制,節點進入總線關閉狀态後,進行一次“快恢複”過程,後續進行“慢恢複”過程,兩個恢複過程的恢複時間分别為27.5ms和209.5ms。
那麼,我們該如何根據所得波形理解該DUT進入總線關閉狀态及恢複通信的整個過程呢?
把第一個波形“團”放大得到下圖:
圖8 放大波形“團”觀察
可以清晰的看到,波形“團”中包含共32幀CAN報文。把其餘各波形“團”放大後也都是包含32幀,這裡不再把詳細的圖片貼出來。
DUT上電後,初始發送和接收錯誤計數都為0。由于在測試時配置了接收幹擾功能,當DUT開始發送報文後,每一幀報文都受到CAN總線分析儀的幹擾而出現發送錯誤,第一次發送時發送錯誤計數加8,并自動重發,第二次發送時錯誤計數再加8,直到發送了32次後,發送錯誤計數大于255,根據圖3的錯誤狀态的轉換規則,這時DUT跳轉為總線關閉狀态,MCU控制進入“快恢複”過程同時對“快恢複”次數進行計數,并等待約27ms後,MCU控制DUT從總線關閉狀态恢複為錯誤主動狀态,由MCU繼續啟動發送,由于仍然受CAN總線分析儀的持續幹擾,發送32幀後再次進入總線關閉狀态,再次執行“快恢複”或“慢恢複”過程,以此類推。
根據流量分析的結果可知,該DUT進入“快恢複”的計數達到1次後便執行“慢恢複”過程,“慢恢複”等待時間約為209ms。
注:
幹擾的設置可以根據需要設置其他的參數,隻要保證能對DUT發送的幀進行幹擾使其出現發送錯誤即可。
為了分析完整的總線關閉恢複過程,建議DUT和CAN總線分析儀連接好後,先開啟“報文讀取”和“接收幹擾”功能後再上電DUT。因為這樣能确保DUT的接收錯誤計數和發送錯誤計數的初始計數都為0。
需要對DUT進行連續的幹擾,否則DUT恢複後成功發送了報文,“快恢複”次數的計數會遞減,這不利于分析DUT總線關閉後的整個恢複行為。
總線關閉後節點的“恢複”是指恢複參與總線的通信,但并不意味着恢複後一定能成功發送或接收報文。如上述案例,DUT恢複通信後由于仍然受CAN總線分析儀的幹擾,導緻報文發送再次失敗。
總結:
在總線關閉狀态下,“快恢複”和“慢恢複”不是CAN控制器固有的功能,而是通過MCU的編程邏輯實現的恢複機制,是總線關閉狀态下恢複過程的補充,使恢複過程更具有靈活性。
,更多精彩资讯请关注tft每日頭條,我们将持续为您更新最新资讯!