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如下:注意: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实际需求出发,简要的介绍了完成这个需求各个模块的功能和动作,希望能给大家带来一些启发。