CAN總線中,相對其他通信類問題,Busoff問題比較難搞。本文從CanSM模塊出發(fā),就Busoff產(chǎn)生、Busoff信息交互、Busoff快/慢恢復等問題展開聊一聊。
這個話題前面有聊過,可以參考前文Autosar網(wǎng)絡管理:說說Busoff那點事。
1Busoff產(chǎn)生
這里再說一次Busoff產(chǎn)生的條件:TEC > 255。也就是說ECU自身發(fā)出的報文錯誤,導致TEC(Transmit Error Counter)不斷累加,直到TEC超過255產(chǎn)生Busoff,如下所示:
舉例:ECU1::CAN1發(fā)送的錯誤幀只能使ECU1::CAN1進入Busoff狀態(tài),而不能使ECU2::CAN1進入Busoff,如下所示:
因為錯誤由ECU1::CAN1自己產(chǎn)生,ECU1::CAN1有問題,自己脫離CAN總線即可,不要影響ECU2::CAN1繼續(xù)使用CAN總線。
2Busoff信息交互及Busoff恢復機制
節(jié)點產(chǎn)生Busoff以后,ControllerMode狀態(tài)自動切換到CANIF_CS_STOPED模式,停止發(fā)送錯誤幀,避免影響總線其他節(jié)點的通信。既然Busoff已經(jīng)發(fā)生,對應的信息就需要傳遞給上層,讓上層決策后續(xù)的通信行為。怎樣通知上層呢?
Can Controller通知到上層有兩種方式:Interrupt或者Polling。
Step1、Busoff事件信息如何通知到CanSM
Interrupt方式:
Busoff中斷發(fā)生->
CanInterruptStatus()
->CanHL_ErrorHandling()->
CanIf_ControllerBusOff()
->
CanSM_ControllerBusOff()
->CanSM_BusOffIndicated(),CanSM_BusOffFlag = TRUE
...CanSM_MainFunction()周期性檢查CanSM_BusOffFlag置位情況。
Polling方式:Can_MainFunction_BusOff()
->CanHL_ErrorHandling()->
CanIf_ControllerBusOff()
->
CanSM_ControllerBusOff()
->CanSM_BusOffIndicated(),CanSM_BusOffFlag= TRUE
...CanSM_MainFunction()周期性檢查CanSM_BusOffFlag置位情況。
提示:上述函數(shù)關(guān)聯(lián)關(guān)系,除Autosar標準接口以外,其他接口,不同軟件供應商,實現(xiàn)上可能存在不同。
Step2、CanSM請求重啟Can Controller,通知ComM、BswM模式切換
Busoff發(fā)生以后,CanSM調(diào)用CanIf_SetControllerMode()接口,請求將ControllerMode切到CANIF_CS_STARTED模式,以便于后續(xù)嘗試恢復通信。同時關(guān)閉Tx PDU的發(fā)送,只能接收Rx PDU。所以這也是為什么在恢復期內(nèi)可以收到報文的原因。CanSM調(diào)用BswM_CanSM_CurrentState()接口通知BswM進入CANSM_BSWM_BUS_OFF狀態(tài),調(diào)用ComM_BusSM_ModeIndication()接口通知ComM進入COMM_SILENT_COMMUNICATION狀態(tài)。
Busoff發(fā)生以后,CanSM先告知ComM,ComM在請求CanSM對應Channel由FULL COMMUNICATION進入SILENT COMMUNICATION。進入CANSM_BSM_S_SILENTCOM_BOR狀態(tài),如下所示:
Busoff發(fā)生以后,CanSM會啟動一個Busoff Timer,BusoffTimer分為兩種:
快恢復時間參數(shù):CanSMBorTimeL1;
慢恢復時間參數(shù):CanSMBorTimeL2。
具體BusoffTimer應該等于CanSMBorTimeL1還是CanSMBorTimeL2,取決于配置參數(shù)CanSMBorCounterL1ToL2。
如果Busoff連續(xù)發(fā)生次數(shù) <CanSMBorCounterL1ToL2,BusoffTimer =CanSMBorTimeL1;
如果Busoff連續(xù)發(fā)生次數(shù)≥ CanSMBorCounterL1ToL2,BusoffTimer=CanSMBorTimeL2;
注意:CanSMBorTimeL1、CanSMBorTimeL2、CanSMBorCounterL1ToL2三個參數(shù)均在CanSM模塊配置,具體數(shù)值根據(jù)OEM需求配置。測試中,busoff的快/慢恢復行為如下所示:
在快/慢恢復時間內(nèi),可以接收報文。
Step3、CanSMBorTimeL1或者CanSMBorTimeL2耗盡
CanSMBorTimeL1或者CanSMBorTimeL2耗盡(elapse),重新發(fā)送Tx PDU,讓故障節(jié)點再次嘗試向CAN總線發(fā)送報文。同時,CanSM通知BswM進入CANSM_BSWM_FULL_COMMUNICATION狀態(tài),通知ComM進入COMM_FULL_COMMUNICATION狀態(tài)。可以啟動CanSMBorTimeTxEnsured,確認Busoff是否恢復,也可以使用Confirm方式確認Busoff恢復。
Step4、CanSMBorTimeTxEnsured耗盡
在CanSMBorTimeTxEnsured時間內(nèi),Busoff再次發(fā)生,則進行下一次的Busoff恢復機制,如果CanSMBorTimeTxEnsured耗盡,則說明成功從Busoff狀態(tài)恢復。如果在CanSMBorTimeTxEnsured時間內(nèi),再次發(fā)生Busoff,則Busoff次數(shù)累加。
3Busoff發(fā)生時的網(wǎng)絡狀態(tài)
這里主要討論Busoff進入慢恢復期,節(jié)點在NOS(Normal Operation State)和RSS(Ready Sleep State)下是否會進行網(wǎng)絡狀態(tài)切換。
NOS:Busoff進入慢恢復期,如果上層不主動請求釋放網(wǎng)絡,網(wǎng)絡狀態(tài)無法進入RSS,所以,節(jié)點會一直在NOS狀態(tài)下,一直處于慢恢復狀態(tài),如下所示:
RSS:Busoff進入慢恢復期,如果在恢復期收不到有效的網(wǎng)絡管理報文,NM-Timeout時間超時以后,進入PBSM(Pre Bus Sleep Mode);如果可以收到有效的網(wǎng)絡管理報文,則網(wǎng)絡處于RSS狀態(tài),如下所示:
如果節(jié)點在NOS狀態(tài)下,一直處于慢恢復,會帶來什么問題呢?節(jié)點一直在慢恢復期,意味著該節(jié)點不會外報文(應用報文和網(wǎng)絡管理報文均不會外發(fā)),其他節(jié)點會上報對應的節(jié)點丟失故障。
審核編輯:劉清
-
CAN總線
+關(guān)注
關(guān)注
145文章
1973瀏覽量
132205 -
中斷
+關(guān)注
關(guān)注
5文章
904瀏覽量
42500 -
AUTOSAR
+關(guān)注
關(guān)注
10文章
371瀏覽量
22385
發(fā)布評論請先 登錄
串口接收不等長的數(shù)據(jù)如何處理的呢?
DLPC3433的PCLK和PDATA【0~23】該如何處理呢?
請問STM32程序不使用的GPIO如何處理?
如何處理接口bewtween?
如何處理電子污染
在國外人們都是如何處理電子垃圾的呢_電子垃圾回收產(chǎn)業(yè)現(xiàn)狀及其意義
如何處理HTTP 503故障問題?

什么是busoff?BUSOFF是如何產(chǎn)生的?BUSOFF恢復機制和故障碼記錄

廣播系統(tǒng)出現(xiàn)噪音、嘯叫如何處理?

評論