概述
看此篇之前,建议先看我的上一篇文章:
Autosar BSW层CAN通讯开发------05(Autosar的CanNM----网管报文在汽车上的作用、“同起同睡”)_嵌软小白呗的博客-CSDN博客https://blog.csdn.net/qq_41848098/article/details/125343580
在了解了CANNM在汽车上的作用之后,我们来看CANNM的状态机是如何实现的。
一、CANNM状态机:
1、首先我们先看一下CanNM的状态机及各个状态下报文发送的情况(一个汽车的ECU在CANNM处于不同状态时,对于CAN应用报文和CANNM报文有着不同的发送要求。比如:在Bus-Sleep-Mode状态,应用报文和网管报文都不往can总线上发送。在Read Sleep State状态,应用报文要往can总线上发送,但CANNM报文不往can总线上发)
2、CANNM各个状态跳转条件
理解CANNM状态机的跳转,需要再理解一下ECU的休眠唤醒机制。在一辆汽车整车上,某个ECU的休眠唤醒定义一般是这样的(比如ECU 1):
休眠:ECU1不向CAN总线外发出报文
唤醒:ECU1向CAN总线外发出报文
我在开发过程中,经常遇到有同事认为休眠是指ECU没电、唤醒是指ECU有电。虽然这样理解很多情况下也没有问题,但实际上对于整车来说,一个ECU醒没醒,是通过CAN报文来看的,你向外发出CAN报文,就认为你醒着,你停发CAN报文,就认为你休眠了。如:当CANNM状态处于Prepare Bus-Sleep Mode 的时候,是不发CANNM报文和应用报文的,有些企业的需求认为此时ECU已处于休眠状态,当处于此状态时有别的唤醒源唤醒ECU时,需要ECU认为此时更换了唤醒源,但ECU此时并未下电。
只不过正常情况下,为了减小功耗,只要ECU没有外发CAN报文的需求就要立即下电,ECU有外发CAN报文的需求就要立即上电。)
好了,那么什么时候ECU要醒来,什么时候ECU要休眠呢?其实情况不多,就两种:被动唤醒和、主动唤醒。而当被动唤醒和主动唤醒都释放的时候,就需要休眠。被动唤醒和主动唤醒解释如下:
①被动唤醒(自己没有主动工作需求,是由于别的节点有主动工作需求,自己才被迫唤醒):ECU节点接收到其他节点的网管报文。
②主动唤醒(自己有主动工作需求,会通过网管报文唤醒别的节点):ECU节点有主动工作需求。如OBC节点检测到充电的插枪动作。
接下来理解CANNM的状态机就好理解了:
(当进入Repeat Message State、Normal Opearation State、Ready Sleep State时,都成CANNM处于Network Mode)
①Bus-Sleep Mode:
就是CANNM状态机处于睡眠状态。CANNM状态机处于这个状态一般有两个情况:
一:ECU被唤醒刚上电初始化,程序还没跑到处理网管状态跳转的时候(无论是主动唤醒还是被动唤醒)
二:是ECU准备进入休眠的时候,即程序跑到即将下电前。
②Repeat Message State:
从上面的状态机可以看出,ECU被唤醒后,必须先经过Repeat Message State。
Repeat Message是指重复发送CANNM报文,那么为什么在这各状态下要重复发NM报文呢?正如前面所说,ECU有主动唤醒和被动唤醒。如ECU1:
当ECU1有主动唤醒需求时,ECU1是第一个醒来的,它需要整车其他节点快速起来配合工作。因此,ECU1需要重复快发CANNM报文,使得其他ECU节点快速唤醒。
当ECU1有被动唤醒需求时,ECU1被总线其他节点的NM报文唤醒后,ECU1在该状态下需要发送几帧CANNM报文,作用就类似于告诉别人:我起来啦!
可以看出主动唤醒和被动唤醒时,Repeat Message State发出的CANNM报文的作用是不一样的。因此在该状态下,主动唤醒和被动唤醒发出的NM报文的周期也不一样。一般来说,主动唤醒需要向外快发NM报文,如20ms一帧,连续快发5帧(如20ms一帧),连续快发5帧。被动唤醒则按正常周期发送NM报文(如500ms一帧。这里的正常是指发出的NM报文周期与CANNM处于Normal状态时发出的NM周期一致)。
一般来说,Repeat Message State状态的停留时间较短,如某车企需求为1.5s,1.5s过后,就要跳到Normal Opearation State或Ready Sleep State。
注意:“主动请求”,当ECU处于休眠状态可被主动请求唤醒,当ECU已经处于唤醒的状态时,也是时刻在检测主动请求的。
③Normal Opearation State:
进入Normal Opearation State:
1、从Repeat Message State跳转至Normal Opearation State条件:
①当ECU主动唤醒且当Repeat Message State的时间参数满足后,主动请求还未释放时,状态跳转至Normal Opearation State
或②当ECU被动唤醒且在Repeat Message State检测到主动请求,则当Repeat Message State的时间参数满足后,状态跳转至Normal Opearation State
2、从Ready Sleep State跳转至Normal Opearation State条件:
①处于Ready Sleep State时检测到主动请求,状态跳转至Normal Opearation State
所谓Normal Opearation State,即正常工作模式,从上面所说的跳转条件可以看出,即只有存在主动请求时,才会跳转到Normal状态。而处于该状态时会持续发出NM报文,至于原因也很好理解,如上篇文章所说的同起同睡机制:当ECU有主动请求一直唤醒时,必须要使其他的ECU节点也保持唤醒,因此有主动请求的ECU必须持续发出CANNM报文唤醒使得其他节点不睡下去。
退出Normal Opearation State:
1、从Normal Opearation State跳转至Repeat Message State条件:
根据Autosar的CAN网络管理标准,当CANNM处于Normal Opearation State或Ready Sleep State时接收到总线上CANNM报文的Byte1的Bit0置1时,需要把状态跳转至Repeat Message State。这个功能的作用实际上是用来检测总线上还有哪些ECU节点在线,因为如前面所说,处于Repeat Message State时需要发出CANNM报文。
2、从Normal Opearation State跳转至Ready Sleep State条件:释放主动请求。
④Ready Sleep State:
当处于Ready Sleep State时,即准备休眠状态,从字面意思也能理解,本ECU此时肯定没有主动唤醒请求,因此不向外发出CANNM报文。但若此时别的ECU有主动唤醒请求(总线持续存在其他ECU的CANNM报文),由于同起同睡机制,我们此时不能进入休眠状态,必须保持唤醒,并向外发出应用报文,持续停留在Ready Sleep State状态。
在该状态,有个时间参数为NM-Timeout Timer(如NM-Timeout Timer = 2000ms),当接收到NM报文时,程序会将该计数器清0,若但该时间参数到达时仍未接收到CANNM报文,则认为总线上所有ECU都已经没有主动请求,所有ECU需要进入休眠状态。(另外需要注意的是,该时间参数只要CANNM进入Network Mode就会开始计时,接收或发送一帧CANNM报文时该时间参数就会清0)
进入Ready Sleep State:
1、从Repeat Message State跳转至Ready Sleep State条件:
当ECU是被动唤醒且Repeat Message State的时间参数已到达后,CANNM状态从Repeat Message State跳转至Ready Sleep State。
2、从Normal Opearation State跳转至Ready Sleep State条件:
本ECU释放主动请求。
退出Ready Sleep State:
1、从Ready Sleep State跳转至Repeat Message State条件:
(跳转条件与Normal Operation State跳到Repeat Message State一样)根据Autosar的CAN网络管理标准,当CANNM处于Normal Opearation State或Ready Sleep State时接收到总线上CANNM报文的Byte1的Bit0置1时,需要把状态跳转至Repeat Message State。这个功能的作用实际上是用来检测总线上还有哪些ECU节点在线,因为如前面所说,处于Repeat Message State时需要发出CANNM报文。
2、从Ready Sleep State跳转至Normal Operation State条件:
检测到主动请求
3、从Ready Sleep State跳转至Prepare Bus-Sleep Mode条件:
未接收到网管报文时间超过NM-Timeout Timer时间。此时认为总线上所有ECU都已经没有主动请求,所有ECU需要进入休眠状态
⑤Prepare Bus-Sleep Mode:
即预休眠状态,在该状态下ECU停发应用报文和网管报文。此时的时间参数为Wait BusSleep Timer(如Wait BusSleep Timer = 5000ms),当该时间参数到达后,则CANNM进入休眠状态。
进入Normal Opearation State条件:
见上面------“从Ready Sleep State跳转至Prepare Bus-Sleep Mode条件”
退出Normal Opearation State条件:
1、从Prepare Bus-Sleep Mode跳转至Repeat Message State条件:
检测到唤醒源,主动唤醒或被动唤醒
2、从Prepare Bus-Sleep Mode跳转至Bus-Sleep Mode条件:
Wait BusSleep Timer已到达(在该过程中未检测到唤醒源)。
各个状态的时间参数示例如下(以某大型车企为例,不同的车企,CANNM的时间参数需求一般都不一致)
CANNM状态的解释大概就这些了。
下一章我将讲解CANNM报文8个字节的用途。
最近工作比较忙,所以这么久才更新一篇笔记。做Autosar的CAN通信开发工程时所设及的内容还是挺多的,如CAN收发器、CAN控制器的位时间参数配置、CAN报文的收发、事件型报文的开发、E2E报文的开发、超时故障的开发、CANNM报文的开发等等。我会尽量把涉及的内容都记录下来。
在现在公司都干一年了,公司还不给我涨工资,给这点钱很难办事啊,而且,公司妹子好少,好没意思呀,什么时候可以去一个全是妹子的公司,呜呜呜。
多记些有用的笔记,明年4月拿完年终奖就跑路。
最后
以上就是务实豌豆为你收集整理的Autosar BSW层CAN通讯开发------06(Autosar的CanNM----CanNM状态机)的全部内容,希望文章能够帮你解决Autosar BSW层CAN通讯开发------06(Autosar的CanNM----CanNM状态机)所遇到的程序开发问题。
如果觉得靠谱客网站的内容还不错,欢迎将靠谱客网站推荐给程序员好友。
发表评论 取消回复