电子说
前言
最近遇到一个特殊需求:在ECU系统休眠后需要通过网络管理报文和诊断报文唤醒网络,但是应用报文不能唤醒网络。通常情况下,在ECU系统休眠后,AUTOSAR架构中只能配置通过网络管理报文唤醒网络或者所有报文都能唤醒网络,没有单独的诊断报文唤醒网络的配置。那在AUTOSAR架构下如何来实现这个功能了?
本文先详细介绍这个需求在AUTOSAR架构下遇到的问题,然后再给出一个具体的解决办法。
Note: 使用Vector的工具,以及TJA1043的CAN收发器。
正文
1.面临的问题
1.1 TJA1043的INH脚唤醒事件
ECU系统休眠后TJA1043的INH脚处于floating高阻态,系统休眠后通过硬件外部电路下拉到低电平状态/Low-level,ECU系统休眠前把TJA1043的INH脚配置为唤醒脚,系统休眠后如果收到任意的CAN报文,TJA1043的INH脚会被拉高,产生CAN收发器的硬件唤醒事件(Low-Level to High-Level)。如果ECU系统是断电系统,那么INH脚应该接在SBC上,因为SBC是常电状态,检测到INH的唤醒事件后就会给ECU-MCU供电,MCU冷启动。如果是ECU系统是常电系统,INH脚应该接到MCU的一个中断唤醒脚上,检测到INH的唤醒事件后,中断唤醒MCU,MCU中的软件可以选择继续跑,也可以通过软件Reset后重新热启动。
参考文章:关于CanTrcv模块的几点思考
总之,无论是断电系统还是常电系统,在ECU系统休眠后,任意的CAN报文都能唤醒ECU。
1.2 EcuM配置网络唤醒
实现网络唤醒,需要在EcuM模块中配置唤醒源,同时配置唤醒源检测。
开启EcuM的网络唤醒源校验Validation后需要User实现三个Callout函数函数:
1) EcuM_StartWakeupSources(EcuM_WakeupSourceType);
2) EcuM_StopWakeupSources(EcuM_WakeupSourceType);
3) EcuM_CheckValidation(EcuM_WakeupSourceType);
参考文章:AUTOSAR架构下关于CanNm的几点思考
1.3 CanIf配置唤醒报文过滤
CanIf中可以配置Wakeup Check Valition,有两种配置可选:
1)所有报文可以通过校验
2)只有NM报文可以通过校验
1.4 ComM网络唤醒
EcuM调用CanIf接口校验网络唤醒源成功后,EcuM就会调用ComM_EcuM_WakeUpIndication请求通信,ComM在CommunicationAlllowed后就会调转到Full Com状态开启网络。
参考文章:AUTOSAR网络通信问题分析
1.5诊断报文唤醒面临的问题
我们的需求是:在ECU系统休眠后需要通过网络管理报文和诊断报文唤醒网络,但是应用报文不能唤醒网络。
但是从上文中我们可以得知:
1)如果CanIf配置为所有报文可以校验通过,那么应用报文也会通过校验,从而唤醒网络。
2)如果CanIf配置为只有NM报文可以通过校验,那么诊断报文也就不能通过校验, 从而诊断报文不能唤醒网络。
3)只要ECU被唤醒后,因为程序已经跑起来了,理论上肯定可以让诊断报文来唤醒网络的,但是在AUTOSAR架构下没有提供这个配置,代码框架已经被限制,要实现这个功能就不知道在哪里实现。
也就是说,在AUTOSAR架构下按通常配置是无法实现ECU系统休眠后需要通过网络管理报文和诊断报文唤醒网络,但是应用报文不能唤醒网络的。
2.解决的办法
如果能想办法在EcuM调用CanIf_CheckValication的时候能让诊断报文通过校验(NM报文也通过校验,应用报文不能通过校验)就能解决这个问题。
审核编辑 :李倩
全部0条评论
快来发表一下你的评论吧 !