CAN總線中,相對(duì)其他通信類問題,Busoff問題比較難搞。本文從CanSM模塊出發(fā),就Busoff產(chǎn)生、Busoff信息交互、Busoff快/慢恢復(fù)等問題展開聊一聊。
這個(gè)話題前面有聊過,可以參考前文Autosar網(wǎng)絡(luò)管理:說說Busoff那點(diǎn)事。
1Busoff產(chǎn)生
這里再說一次Busoff產(chǎn)生的條件:TEC > 255。也就是說ECU自身發(fā)出的報(bào)文錯(cuò)誤,導(dǎo)致TEC(Transmit Error Counter)不斷累加,直到TEC超過255產(chǎn)生Busoff,如下所示:
舉例:ECU1::CAN1發(fā)送的錯(cuò)誤幀只能使ECU1::CAN1進(jìn)入Busoff狀態(tài),而不能使ECU2::CAN1進(jìn)入Busoff,如下所示:
因?yàn)殄e(cuò)誤由ECU1::CAN1自己產(chǎn)生,ECU1::CAN1有問題,自己脫離CAN總線即可,不要影響ECU2::CAN1繼續(xù)使用CAN總線。
2Busoff信息交互及Busoff恢復(fù)機(jī)制
節(jié)點(diǎn)產(chǎn)生Busoff以后,ControllerMode狀態(tài)自動(dòng)切換到CANIF_CS_STOPED模式,停止發(fā)送錯(cuò)誤幀,避免影響總線其他節(jié)點(diǎn)的通信。既然Busoff已經(jīng)發(fā)生,對(duì)應(yīng)的信息就需要傳遞給上層,讓上層決策后續(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標(biāo)準(zhǔn)接口以外,其他接口,不同軟件供應(yīng)商,實(shí)現(xiàn)上可能存在不同。
Step2、CanSM請(qǐng)求重啟Can Controller,通知ComM、BswM模式切換
Busoff發(fā)生以后,CanSM調(diào)用CanIf_SetControllerMode()接口,請(qǐng)求將ControllerMode切到CANIF_CS_STARTED模式,以便于后續(xù)嘗試恢復(fù)通信。同時(shí)關(guān)閉Tx PDU的發(fā)送,只能接收Rx PDU。所以這也是為什么在恢復(fù)期內(nèi)可以收到報(bào)文的原因。CanSM調(diào)用BswM_CanSM_CurrentState()接口通知BswM進(jìn)入CANSM_BSWM_BUS_OFF狀態(tài),調(diào)用ComM_BusSM_ModeIndication()接口通知ComM進(jìn)入COMM_SILENT_COMMUNICATION狀態(tài)。
Busoff發(fā)生以后,CanSM先告知ComM,ComM在請(qǐng)求CanSM對(duì)應(yīng)Channel由FULL COMMUNICATION進(jìn)入SILENT COMMUNICATION。進(jìn)入CANSM_BSM_S_SILENTCOM_BOR狀態(tài),如下所示:
Busoff發(fā)生以后,CanSM會(huì)啟動(dòng)一個(gè)Busoff Timer,BusoffTimer分為兩種:
快恢復(fù)時(shí)間參數(shù):CanSMBorTimeL1;
慢恢復(fù)時(shí)間參數(shù):CanSMBorTimeL2。
具體BusoffTimer應(yīng)該等于CanSMBorTimeL1還是CanSMBorTimeL2,取決于配置參數(shù)CanSMBorCounterL1ToL2。
如果Busoff連續(xù)發(fā)生次數(shù) <CanSMBorCounterL1ToL2,BusoffTimer =CanSMBorTimeL1;
如果Busoff連續(xù)發(fā)生次數(shù)≥ CanSMBorCounterL1ToL2,BusoffTimer=CanSMBorTimeL2;
注意:CanSMBorTimeL1、CanSMBorTimeL2、CanSMBorCounterL1ToL2三個(gè)參數(shù)均在CanSM模塊配置,具體數(shù)值根據(jù)OEM需求配置。測試中,busoff的快/慢恢復(fù)行為如下所示:
在快/慢恢復(fù)時(shí)間內(nèi),可以接收?qǐng)?bào)文。
Step3、CanSMBorTimeL1或者CanSMBorTimeL2耗盡
CanSMBorTimeL1或者CanSMBorTimeL2耗盡(elapse),重新發(fā)送Tx PDU,讓故障節(jié)點(diǎn)再次嘗試向CAN總線發(fā)送報(bào)文。同時(shí),CanSM通知BswM進(jìn)入CANSM_BSWM_FULL_COMMUNICATION狀態(tài),通知ComM進(jìn)入COMM_FULL_COMMUNICATION狀態(tài)。可以啟動(dòng)CanSMBorTimeTxEnsured,確認(rèn)Busoff是否恢復(fù),也可以使用Confirm方式確認(rèn)Busoff恢復(fù)。
Step4、CanSMBorTimeTxEnsured耗盡
在CanSMBorTimeTxEnsured時(shí)間內(nèi),Busoff再次發(fā)生,則進(jìn)行下一次的Busoff恢復(fù)機(jī)制,如果CanSMBorTimeTxEnsured耗盡,則說明成功從Busoff狀態(tài)恢復(fù)。如果在CanSMBorTimeTxEnsured時(shí)間內(nèi),再次發(fā)生Busoff,則Busoff次數(shù)累加。
3Busoff發(fā)生時(shí)的網(wǎng)絡(luò)狀態(tài)
這里主要討論Busoff進(jìn)入慢恢復(fù)期,節(jié)點(diǎn)在NOS(Normal Operation State)和RSS(Ready Sleep State)下是否會(huì)進(jìn)行網(wǎng)絡(luò)狀態(tài)切換。
NOS:Busoff進(jìn)入慢恢復(fù)期,如果上層不主動(dòng)請(qǐng)求釋放網(wǎng)絡(luò),網(wǎng)絡(luò)狀態(tài)無法進(jìn)入RSS,所以,節(jié)點(diǎn)會(huì)一直在NOS狀態(tài)下,一直處于慢恢復(fù)狀態(tài),如下所示:
RSS:Busoff進(jìn)入慢恢復(fù)期,如果在恢復(fù)期收不到有效的網(wǎng)絡(luò)管理報(bào)文,NM-Timeout時(shí)間超時(shí)以后,進(jìn)入PBSM(Pre Bus Sleep Mode);如果可以收到有效的網(wǎng)絡(luò)管理報(bào)文,則網(wǎng)絡(luò)處于RSS狀態(tài),如下所示:
如果節(jié)點(diǎn)在NOS狀態(tài)下,一直處于慢恢復(fù),會(huì)帶來什么問題呢?節(jié)點(diǎn)一直在慢恢復(fù)期,意味著該節(jié)點(diǎn)不會(huì)外報(bào)文(應(yīng)用報(bào)文和網(wǎng)絡(luò)管理報(bào)文均不會(huì)外發(fā)),其他節(jié)點(diǎn)會(huì)上報(bào)對(duì)應(yīng)的節(jié)點(diǎn)丟失故障。
審核編輯:劉清
-
CAN總線
+關(guān)注
關(guān)注
145文章
1954瀏覽量
130919 -
中斷
+關(guān)注
關(guān)注
5文章
900瀏覽量
41590 -
AUTOSAR
+關(guān)注
關(guān)注
10文章
363瀏覽量
21649
發(fā)布評(píng)論請(qǐng)先 登錄
相關(guān)推薦
評(píng)論