文章目錄
- 前言
- Autosar CanNm標準中的相關參數
- CanNmAllNmMessagesKeepAwake
- PN過濾功能
- CanNm_ConfirmPnAvailability
- 問題描述
- 問題原因排查
- 解決方案
- 擴展
- 總結
前言
Autosar Nm中針對于支持PN功能的收發器,要求PNC停發后允許進入休眠模式,開發過程中遇到PNC停發后無法休眠,本文對該問題進行排查與處理。
Autosar CanNm標準中的相關參數
此處我們討論支持PN功能的情況,也就是CanNmPnEnabled為True
CanNmAllNmMessagesKeepAwake
當該參數配置為Trrue時,只要收到Nm報文,就會認為是有網絡喚醒請求
當該參數配置為false時,需要Nm Pdu中PNI位為1且有對應的PNC請求才會認為是有效的網絡喚醒請求
對于不支持PN功能的can收發器,該配置項可以配置為True以防止PNI置位時被頻繁喚醒
對于支持PN功能的can收發器,該配置項需要配置為false,保證PNI置位但沒有PNC請求時也可以進入休眠模式。
注意:此時can收發器端配置data有效數據時不能包含PNI位,只需關聯對應的PNC位為1即可。
標準解讀:
1.對于支持PN功能的ECU,當PNI為0時,CanNmAllNmMessagesKeepAwake為TRUE時,仍需要認為接收到有效的Nm Pdu,也就是能夠維持喚醒。
2.對于支持PN功能的ECU,當PNI為0時,CanNmAllNmMessagesKeepAwake為FALSE時,需要忽略接收到的Nm Pdu,也就是會走網絡管理下電流程(Ready Sleep-PreBus Sleep-Bus Sleep)
3.對于支持PN功能的ECU,當PNI為1且沒有關聯的PNC置位時,CanNmAllNmMessagesKeepAwake為FALSE時,需要忽略接收到的Nm,Pdu,也就是會走網絡管理下電流程
4.對于支持PN功能的ECU,當PNI為1且沒有關聯的PNC置位時,CanNmAllNmMessagesKeepAwake為TRUE時,仍需要認為接收到有效的Nm Pdu,也就是能夠維持喚醒
PN過濾功能
此處有三個配置參數,CanNmPnInfoOffset,CanNmPnInfoLength,CanNmPnFilterMaskByteValue,Offset表示PNC從Nm Pdu中的第幾個字節開始算,Length即為PNC的字節數,MaskByteValue配置有效的PNC位
標準中示例如下:
例子中兩個字節的PNC,第一個字節沒有有效的PNC位,第二個字節中有有效的PNC
CanNm_ConfirmPnAvailability
為了通知CanNm能夠支持PN過濾,需要CanSm調用CanNm_ConfirmPnAvailability函數
問題描述
Nm PDU中關聯的PNC停止發送,ECU報文停發,但未進入休眠模式,導致耗電嚴重
問題原因排查
停發PNC后,Nm狀態仍處于Ready Sleep狀態,Nm Pdu仍能正常接收,查看CanNm配置項CanNmAllNmMessagesKeepAwake已經為FALSE。在CanNm_RxIndication中默認PDU是收到的,只有CanNmAllNmMessagesKeepAwake為FALSE且CANNM_GetPnMsgFilteringStatus為TRUE才能允許PDU未接收
而CANNM_GetPnMsgFilteringStatus一直為FALSE,所以Nm PDU一直能收到
排查發現CANNM_SetPnMsgFilteringStatus沒有運行,該函數在CanNm_ConfirmPnAvailability中調用,而CanNm_ConfirmPnAvailability在CanSM_ConfirmPnAvailability中調用,實際CanSm_ConfirmPnAvailability函數沒有地方調用了
所以導致Nm Pdu一直是收到的狀態,導致無法進入下電過程
解決方案
本質上就是要調用CANNM_SetPnMsgFilteringStatus,可以在初始化完后通過CanNm_ConfirmPnAvailability函數進行調用
注意:該函數傳遞的參數為nmChannelHandle,需要確認對應的Nm通道是否正確
另外,如果關聯的PNC停發后仍然沒有進入休眠狀態,那么就需要再排查下 PN過濾的參數了。
擴展
標準文檔中的推薦流程為:CanTrvc->CanIf->CanSm->CanNm
查看Autosar CanSm文檔,CanSm_ConfirmPnAvailability函數由CanIf模塊調用
CanIf有對應配置CanIfDispatchUserConfirmPnAvailabilityUL及CanIfDispatchUserConfirmPnAvailabilityName,需要在CanIf中配置為CanSm盒CanSm_ConfirmPnAvailability,且配置CANIF_PUBLIC_PN_SUPPORT為TRUE
這樣配置之后,CanIf中的CanIf_ConfirmPnAvailability函數就會調用CanSm_ConfirmPnAvailability了
而CanIf_ConfirmPnAvailability需要由CanTrcv調用,標準中描述如下:
總結
由于我們沒有使用CanTrcv模塊,所以用標準流程會導致很多check不過,但是知道原理之后,怎么解決問題就很簡單了~