AUTOSAR架构下ECU休眠唤醒Wakeup Time详解

汽车   2024-06-22 09:27   广东  
本文从ECU休眠唤醒实际需求问题,介绍ECU休眠后通过一帧NM报文唤醒ECU后在要求时间内通过第二帧NM报文需要唤醒网络。



环境


AUTOSAR工具链:Vector

Hardware Platform: Infineon Tricore


注:本文章引用了一些第三方工具和文档,若有侵权,请联系作者删除!


1.需求描述


ECU在休眠(断电)状态下收到第一帧NM报文需要唤醒ECU(对外表现就是电流从低功耗开始上升,但无CAN报文发出),在T wakeup timeout内收到第二帧NM报文需要唤醒网络(对外表现就是ECU有CAN报文发出)。要求 1s <= T wakeup timeout <= 3s.

 


2.测试方法


因为要求1s <= T wakeup timeout <= 3s, 则T wakeup timeout可以为[1s, 3s]内的任一值,如果开发工程师实现T wakeup timeout = 2s. 则测试case如下:


第一帧NM报文和第二帧NM报文的间隔时间

ECU对外表现

0.5s, 1s, 1.95s

ECU被唤醒,电流上升且有报文外发

2.05s, 2.5s3.5s

ECU被唤醒,电流上升无报文外发


注意:ECU在休眠状态下测试只能通过CANoe工具来测试该需求,通过其他CAN工具(比如TMaster)无法进行测试(TMaster发送一帧NM报文对外表现就把ECU唤醒且唤醒了网络),在使用CANoe工具发送NM报文时必须勾选如下图所示的TxSelf-ACK(其他工具如TMaster无此配置选项)。



3.完成需求的方法


这里直接给出方法,只要按照下图所示配置EcuM中的CAN唤醒源即可(当然前提是CanIf, Cantrcv…等模块已经配置正确)。

 

Validation Timeout:配置唤醒源的校验时间。

Wakeup Source Polling:定义是否需要轮询检测该唤醒源。


4.原理详解


4.1 CanTrcv 接收到第一帧NM报文


如果采用非SBC方案,采用Infineon芯片的ECU在进入休眠状态后一般会设置Tricore核到Standby状态,也会设置Can transceiver到Sleep状态。收到第一帧NM报文后,CanTrcv获取到远程唤醒事件,CanTcv的INH引脚会拉高到High Level唤醒ECU,ECU醒来后程序从头开始运行,CanTcv的Init函数会Check唤醒事件,Check到唤醒事件后会调用EcuM_SetWakeupEvent(ECUM_WAKEUP_SOURCE_CAN). EcuM就会设置ECUM_WAKEUP_SOURCE_CAN状态到ECUM_WKSTATUS_PENDING状态。



ECU接收到第一帧NM报文时ECU被唤醒,Can Cantroller处于Stop状态且CanTrcv处于Sleep状态,Cantroller不会产生CAN接收中断,所以第一帧报文不会被软件处理。


注意:Vector的代码在CanTrcv_Init就能Check唤醒事件,ETAS的代码只能在CanTrcv_MainFuncton里面Check唤醒源事件。



4.2 EcuM接收到唤醒事件


EcuM检测唤醒源状态到ECUM_WKSTATUS_PENDING后就会调用EcuM_StartWakeupSources(). 

 

EcuM_StartWakeupSources是一个callout函数,一般在EcuM_StartWakeupSources函数中调用CanSM_StartWakeupSource, CanSM_StartWakeupSource正常会设置Can Controller到Normal状态且设置Can Cantrcv到Normal状态,同时开始唤醒源的校验,也就是开始T wakeup timeout的计时。

 

EcuM同时开始唤醒源的校验其实就是调用EcuM_CheckValidation函数,EcuM_CheckValidation也是一个Callout函数,一般会在EcuM_CheckValidation函数中调用CanIf_CheckValidation检测有没有收到有效的NM报文:


a.如果在T wakeup timeout也就是Validation Timeout时间内收到有效的NM报文就会设置CAN唤醒源事件状态到ECUM_WKSTATUS_VALIDATED,同时调用ComM_EcuM_WakeUpIndication通知到ComM, ComM一般就会切换到Full状态,Com模块就会发送周期报文,CanNm模块被动唤醒发送进入到RM状态开始慢发NM报文。


b. 如果在T wakeup timeout也就是Validation Timeout时间内没有收到有效的NM报文就会设置CAN唤醒源事件状态到ECUM_WKSTATUS_EXPIRED,EcuM就会调用EcuM_StopWakeupSources(), EcuM_StopWakeupSources是一个callout函数,因EcuM_StopWakeupSources()会调用CanSM_StartWakeupSource, CanSM_StartWakeupSource又会设置Can Controller到Stop状态且设置CanTrcv到Standby状态。

 


4.3 CanTcv接收到第二帧NM报文


EcuM调用EcuM_StartWakeupSources后Can Cantroller和CanTrcv被打开,如果CanTrcv接收到第二帧NM报文,Can controller就会产生接收中断,Can controller就会调用CanIf_RxIndication将有效报文传递到CanIf模块。这个时候EcuM_CheckValidation -> CanIf_CheckValidation就能完成唤醒源校验。


4.4 EcuM完成唤醒源校验


如4.1, 4.2, 4.3章节所述,ECU 在T wakeup timeout时间内收到2帧有效的NM报文,EcuM就能完成唤醒源检验,对外就是有CAN报文发出。


5. 总结


ECU的休眠唤醒(CAN报文唤醒)需要CanTrcv, Can Controller, CanIf, CanSM, EcuM, Com, ComM这么多模块的共同参与,非常的复杂,通过一篇文章很难全部都讲清楚,本文从T wakeup timeout实际需求出发,简要的介绍了完成这个需求各个模块的功能和动作,希望能给大家带来一些启发。

-end-

分享不易,恳请点个【👍】和【在看】

汽车ECU开发
持续为您提供汽车科技、技术
 最新文章