ECU系统休眠后通过诊断报文唤醒ECU且唤醒网络后快发NM报文

电子说

1.3w人已加入

描述

前言

在<>一文中我们分析并实现了通过诊断报文唤醒ECU且唤醒网络的需求,但是经过测试发现网络唤醒后NM报文没有快发过程,而是直接跳过快发过程进入NM报文的周期发送阶段。但是,新的的需求是让诊断报文唤醒网络后有快发过程,又该怎么实现了?本文就先分析CanNM报文的主动唤醒和被动唤醒及其相关的NM报文发送机制,然后给出一个诊断报文唤醒网络后进入快发阶段的解决方案。

Note: 本文使用的AUTOSAR工具为Vector公司的Davinci Configurator,CAN收发器为NXP公司的TJA1043。

正文

1.CanNM状体机分析

参考文档:AUTOSAR架构下关于CanNm的几点思考

收发器

CanNM的Repeat Message State(RMS)状态包括两个子状态:NM Normal Transmit State和NM Immediate Transmit State。

从其他状态进入到NM Normal Transmit State子状态,Can NM报文没有快发阶段,直接进入到Normal Cyclic报文发送阶段。

从其他状态进入到NM Immediate Transmit State子状态,Can NM报文有快发阶段(快发周期和次数可配置)。

从Bus Sleep Mode进入到NM Normal Transmit State的条件(NM_02):

当ECU处于Bus-Sleep阶段时,如果接收到有效的NM报文(ComM调用NM_PassiveStartUp),则会进入到Normal Transmit State。当进入到该阶段后,在T_REPEAT_MESSAGE 超时前,ECU将按照T_NM_MessageCycle周期来传输报文,同时T_MESSAGE_TIMEOUT也会启动。

从Bus Sleep Mode进入到NM Immediate Transmit State的条件(NM_03):

当ECU在Bus-Sleep阶段,存在本地唤醒请求时(ComM调用NM_NetworkRequest),ECU应当主动激活网络,并进入Immediate Transmit State阶段,同时将发送的NM报文中的Active Wake up bit置为1。在该状态下,应当按照N_ImmediateNM_TIMES的次数发送报文周期为T_NM_ImmediateCycleTime的网络管理报文。

从Pre-Bus Sleep Mode进入到NM Normal Transmit State的条件(NM_15):

在Pre-Bus-Sleep模式下,如果存在远程唤醒请求(ComM调用NM_PassiveStartUp),则会进入到RMS阶段中的Normal Transimit State。同时启动T_REPEAT_MESSAGE。

从Pre-Bus Sleep Mode进入到NM Immediate Transmit State的条件(NM_16):

在Pre-Bus-Sleep模式下,如果存在本地唤醒请求,即ComM调用函数接口CanNm_NetworkRequest来进入到RMS中的Immediate Transmit阶段,应当按照N_ImmediateNM_TIMES的次数发送报文周期为T_NM_ImmediateCycleTime的网络管理报文。

小结:

1)当CanNM处于Bus-Sleep或者Pre-Bus-Sleep模式时,如果有本地唤醒事件发生则ComM调用CanNm_NetworkRequest将CanNM状态机切换到NM Immediate Transmit State,Can NM进入快发状态。

2)当CanNM处于Bus-Sleep或者Pre-Bus-Sleep模式时,如果有网络(远程)唤醒事件发生则ComM调用NM_PassiveStartUp将CanNM状态机切换到Normal Transimit State,Can NM报文不会有快发阶段,Can NM报文周期发送。

问题:本地唤醒事件和网络唤醒事件是怎么触发ComM主动和被动唤醒网络的?

2.ComM状态机分析

收发器

ECU上电或唤醒后,如果检测到为本地唤醒或其他条件需要ECU进行主动唤醒时,用户调用ComM接口ComM_RequestComMode请求ComM COMM_FULL_COMMUNICATION使能通信,ComM在接收到请求后,调用 CanSM_RequestComMode()请求CanSM将相应的Can通道状态切换为FULLCOM,CanSM再通过CanIf切换控制器和收发器状态,调用如果该通道的NMVariant为FULL,调用NM接口 Nm_NetworkRequest(),NM再调用CanNm接口 CanNm_NetworkRequest请求进入主动唤醒。

ECU上电或唤醒后,如果检测到为远程唤醒或其他添加需要ECU进行passive唤醒时,调用 ComM_EcuM_WakeUpIndication(如果ECUM中的wakeup source绑定了ComM通道,则在调用EcuM_CheckWakeup时自动调用),如果通道的NMVariant为FULL或PASSIVE,ComM调用 Nm_PassiveStartUp请求NM进行passive唤醒,并调用 CanSM_RequestComMode()请求CanSM将相应的Can通道状态切换为FULLCOM。

问题:本地唤醒事件和网络唤醒事件是怎么触发ComM主动和被动唤醒网络的?

答:本地唤醒事件由User检测后调用ComM_RequestComMode上报给ComM;网络唤醒事件由EcuM轮询到唤醒事件后调用ComM_EcuM_WakeUjpIndication上报给ComM。ComM根据事件类型调用Nm_NetworkRequest主动唤醒网络,调用Nm_PassiveStartUp被动唤醒网络。

3.解决方案

通过上面的分析我们可以得到解决本文提出的问题的答案:让诊断报文唤醒ECU后走主动唤醒网络的路径,就能实现诊断报文唤醒网络后有NM报文快发过程的需求。

具体的做法:就是在<>一文中实现的Callout函数中直接调用ComM_RequestComMode主动请求唤醒网络。

4.总结

  ComM NM CanNM NM报文状态
User调用ComM_RequestComMode 主动唤醒网络:调用NM_NetworkRequest 调用CanNM_NetworkRequest 从Sleep状态切换到NM Immediate Transmit State子状态 快发NM报文结束后周期发送NM报文
EcuM调用ComM_EcuM_WakeUjpIndication 被动唤醒网络:调用
NM_PassiveStartUp
调用
CanNM_PassiveStartUp
从Sleep状态切换到NM Normal Transmit State 无快发NM报文过程,直接周期发送NM报文

审核编辑:汤梓红

打开APP阅读更多精彩内容
声明:本文内容及配图由入驻作者撰写或者入驻合作网站授权转载。文章观点仅代表作者本人,不代表电子发烧友网立场。文章及其配图仅供工程师学习之用,如有内容侵权或者其他违规问题,请联系本站处理。 举报投诉

全部0条评论

快来发表一下你的评论吧 !

×
20
完善资料,
赚取积分