前言
本文以一个简化的示例看下ECU唤醒休眠的执行流程,通常不同项目因需求不同流程处理都会有所不同,本示例只是其中一种,并不是标准普适的流程。假设ECU休眠采用的是MCU掉电方式,且只有两个唤醒源:CAN和KL15,当有唤醒时两者通过线“或”的关系通知LDO/SBC给MCU上电。示意图如下:
我们把KL15硬线作为主动唤醒源,CAN作为被动唤醒源,在EcuM中需要配置这两个唤醒源(EcuMWakeupSource),比如分别命名为EcuM_WakeupSource_KL15、EcuM_WakeupSource_CAN,对于CAN唤醒源需要指定对应的ComM通道,对于
主动唤醒(KL15)
KL15硬线拉高后触发LDO/SBC给MCU上电,开始执行初始化,当执行到StartPostOs阶段BswM已经初始化完成并且可以工作时,通过唤醒源判断调用EcuM_SetWakeupEvent(EcuM_WakeupSource_KL15)设置唤醒源为KL15。
在本示例中可以把这一步作为进入UP阶段的前提条件之一,但如果这里存在设置无效的路径,就不适合这么做,需要在更靠后(EcuM_MainFunction运行起来)的位置进行设置。
当进入UP阶段,各模块任务开始正常执行后,APP或BSW通过ComM_RequestComMode请求ComM进入正常通信状态(FULL_COMMUNICATION),ComM继而通过。
CanSM_RequestComMode请求CanSM进入正常通信状态,CanSM继续通过CanIf控制CanDrv将CAN模块设置为正常工作模式,之后,ComM通过NmIf模块(Nm_NetworkRequest)请求CanNM进入NetworkMode,至此,网络通信打开完毕。
休眠过程
当APP或BSW不再有通信需求,ComM会切换到READ_SLEEP状态,在此过程中会通过NmIf模块(Nm_NetworkRelease)请求CanNM释放网络,如果外部其它节点网络均满足休眠,CanNM切换到PrepareBusSleep状态时会通知ComM,ComM继而切换到SLIENT_COMMUNICATION,并且控制CanSM也进入静默通信,CanSM通过CanIf设置CAN模块为只收不发模式,当CanNM最终进入BusSleep状态,会再次通知ComM,此时ComM会进入NO_COMMUNICATION,并且通过CanSM及CanIf将CAN通信关闭。最后,等待其它条件(如果有的话)满足后整个ECU即可进入SHUTDOWN下电流程。
被动唤醒(CAN)
CanTrcv于Standby/Sleep模式下接收到CAN报文后,通过拉高INH通知LDO/SBC给MCU上电,当初始化执行到StartPostOs阶段BswM已经初始化且可工作时,通过唤醒源判断调用EcuM_SetWakeupEvent(EcuM_WakeupSource_CAN)设置唤醒源为CAN。
同样的,可以把CAN唤醒也作为进入UP阶段的前提条件之一,这里由于只有两个唤醒源,硬线KL15又比较好判断(通常只要初始化完IO口即可读取状态),所以采用非此即彼的逻辑来判断是否是CAN唤醒,如果想通过检测报文来设置CAN唤醒的话,那么判断时机可能要靠后,因为检测报文的话至少要等到CanSM将Can/CanTrcv打开能够正常收取报文才行。
还记得CAN唤醒在配置的时候指定了ComM通道,这时EcuM就会通知ComM有唤醒事件发生,和主动唤醒类似,ComM通过CanSM、CanIf、CanDrv设置CAN模块工作状态,然后再通过NmIf模块(Nm_PassiveStartUp)启动CanNM。