电子说
前言
在<
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报文快发过程的需求。
具体的做法:就是在<
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报文 |
审核编辑:汤梓红
全部0条评论
快来发表一下你的评论吧 !