DCM模块唤醒网络主动与被动唤醒机制探讨

通信网络

624人已加入

描述

前言

我们知道ECU的网络管理是按照AUTOSAR标准开发的话,诊断报文是无法唤醒ECU且唤醒网络的,因为CanNm状态机处于Bus-Sleep Mode的时候,因为ComM-->CanSm-->CanIf-->CanTrcv, CanDriver关闭了Can收发器和控制器,则在Bus-Sleep Mode下通信协议栈是无法收到Can报文的,诊断报文也就无法唤醒网络。但是,但CanNm处于Prepare Bus-Sleep Mode时Cantrcv和CanDriver还是没被关闭,则诊断报文是可以被通信协议栈收到的,那么CanNm处于Prepare Bus-Sleep Mode时诊断报文是可以唤醒网络的。

那么,我们的问题来了,CanNm处于Prepare Bus-Sleep Mode时收到诊断报文唤醒网络,到底是主动唤醒还是被动唤醒了

这个问题的答案很容易得到,我们在CanNm处于Prepare Bus-Sleep Mode时发送诊断报文唤醒网络,看NM报文是否有快发过程就能轻易的确定是主动唤醒还是被动唤醒。

这里直接给出答案,CanNm处于Prepare Bus-Sleep Mode时收到诊断报文唤醒网络是主动唤醒,那么为什么了?

正文

1.CanNm的状态机分析

CAN收发器

CanNm专题机从Prepare Bus-Sleep Mode切换到Nework Mode的Repeat Message State是如果是通过CanNm_PassiveStartUp()条件切换的就是被动唤醒,如果是通过CanNm_NetworkRequest()条件切换的就是主动唤醒。

那么,DCM诊断报文使得CanNm状态机从Prepare Bus-Sleep Mode切换到Nework Mode的Repeat Message State调用的是CanNm_PassiveStartUp()还是CanNm_NetworkRequest()了?

2.ComM的状态机分析

CAN收发器

CaNm处于Prepare Bus Sleep Mode时,ComM处于COMM_FULL_COM_READY_SLEEP模式,如果DCM模块收到诊断报文,则DCM模块会调用ComM_DCM_ActiveDiagnostic()这个callback函数,就会切换ComM模块状态机到COMM_FULL_COM_NETWORK_REQUESTED模式。

ComM从COMM_FULL_COM_READY_SLEEP模式切换到COMM_FULL_COM_NETWORK_REQUESTED模式后会执行什么动作了?-- 调用Nm_NetworkRequest()函数主动唤醒网络。

CAN收发器

3.小结

本文的结论容易得出,DCM模块唤醒网络是主动唤醒且是AUTOSAR规范定义的。但是,要想至下而上理清楚网络休眠和唤醒还是挺不容易的,我们需要理解CanTrcv, CanDriver, CanIf, CanNm, EcuM, ComM, Dcm这么多模块的功能及其之间的耦合关系才能真正理解。至于怎么把这么多模块理清楚还能串起来,个人是从CanTrcv开始自底向上学习各个模块,然后以报文唤醒和网络唤醒源这条线索把所有的模块给串起来的

审核编辑:黄飞

 

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

全部0条评论

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

×
20
完善资料,
赚取积分