场景一:下电时不操作transciver,transciver状态完全由autosar静态代码控制
Reset调试器
图例:黄色:EN;蓝色:STB,下同。
从第一次EN拉高到第一次拉低时间为1.09s,拉低时间持续20ms;之后每次EN从拉高到拉低,时间均为1s(1s是因为EcuMValidationTimeout设置时间为1s,下同
),拉低持续时间为20ms。
猜测:20ms是因为ComM的mainfunction调度周期为20ms。
①当主动唤醒时,用户手动调用ComM_RequestComMode(如果生成了RTE接口,则为Rte_Call_***_RequestComMode)上报给ComM模块。ComM收到上报后,调用CanSM_RequestComMode()请求CanSM将相应的Can通道切为FULLCOM,CanSM再通过CanIf切换controller和transciver的状态。
如上图所示,如果该通道的NMVariant属性为FULL(即使用的是AUTOSAR NM),则调用NM接口Nm_NetworkRequest请求进入主动唤醒。
不同的Nm Variant属性含义如下图所示
②当被动唤醒时,EcuM会周期轮询唤醒事件。当轮询到唤醒事件时,调用ComM_EcuM_WakeUpIndication(如果ECUM中的唤醒源绑定了ComM通道(如下图中绑定)
,则在调用EcuM_CheckWakeup时会自动调用)上报给ComM模块。
ComM收到上报后调用CanSM_RequestComMode()请求CanSM将相应的Can通道切为FULLCOM,CanSM再通过CanIf切换controller和transciver的状态。如果该通道的NMVariant属性为FULL或PASSIVE,则调用NM接口Nm_PassiveStartUp请求NM进行被动唤醒。
场景二:下电时手动控制收发器状态,以满足完全掉电的需求
前提条件:设置没有NM报文后等待5s下电
Reset调试器
从第一次EN拉高到第一次拉低时间为1.09s,拉低时间持续20ms;在5s时间内
,每次EN从拉高到拉低,时间均为1s,拉低持续时间为20ms。5s后
,由于没有NM报文,控制器会进入下电,手动控制收发器的代码就会介入,因此后续波形发生变化,如下图所示。
上图中的20ms即对应场景一中EN下拉的20ms。
由于下电逻辑中当监测到收发器模式为standby时(即EN和STB均为低),会将模式切换为sleep(即EN高STB低),直到进入下一个唤醒校验循环,即EN和STB再次被拉高,收发器进入normal模式(EN和STB均为高)。同样由于下电逻辑中对收发器状态的监测和切换,导致收发器进入normal后又被切换为standby,再被切换为sleep(从standby到sleep时间间隔为10ms),直到1s超时,ECUM判断没有NM唤醒源,将收发器切为standby状态。如此循环。
通过下面两种图可以看出,每个循环的时间也为1s,符合设置的validation timeout值,与场景一中一致。
上图为循环校验的起点,下图为循环校验的结束。
附:AUTOSAR规范中收发器状态基流转图
注意:normal模式切换为sleep模式,必须经过standby模式;sleep模式不能直接跳转为standby模式。