接上篇基于CAN汇流排的Autosar网路管理简述。。。。。

2.3.1状态跳转

注:图片引自《AUTOSAR_SWS_CANNetworkManagement》

  • Power on后初始化完成CanNM模块后进入睡眠状态。如果没有初始化完成就触发本地或被动(远程)唤醒事件有可能使NM模块异常。

在睡眠状态中触发本地唤醒事件或被动唤醒事件,ECU进入重复报文状态。CanNm_NetworkRequest()表示的触发本地唤醒事件后ECU请求网路;CanNm_PassiveStartup()表示的是接收到被动唤醒事件后ECU请求网路;

  • ECU进入重复报文状态后启动Repeat Message Timer和NM-Timeout Timer。在重复报文状态ECU开始发送周期性的发送NM报文。如果是本地事件唤醒,通过配置可使ECU按照CanNmImmediateNmCycleTime 周期快速发送NM报文,以尽快唤醒整个网路。如果使被动唤醒,则以正常周期CanNmMsgCycleTime发送NM报文。

快发次数和快发周期AUTOSAR中并没有指定特定的数字,一般由OEM决定。多数开发周期为10ms或20ms,快发次数为10或20次。

这里注意,NM报文的周期要为时基的整数倍。

  • 当Repeat Message Timer超时后,如果ECU仍有维持由本地唤醒事件(例如KL15IgnON),则进入正常工作状态。

前面已经说过NM-Timeout Timer定时器在超时之前在成功发送或成功接收到一帧NM报文后就会重启,NM-Timeout Timer重启并不会改变NM报文的周期。NM报文的周期从开发发送后只要ECU没有ReleaseNetwork就一直按周期发送,与NM-Timeout Timer定时器无关,与状态跳转也无关。

  • 当Repeat Message Timer超时后,如果ECU自身没有本地唤醒条件,则进入准备睡眠状态。此时ECU不发送自身NM报文,但会接收其他节点发送的NM报文,NM-Timeout Timer重启,维持在准备睡眠状态。

当所有节点均没有本地唤醒事件了,最后一个维持网路的节点请求释放网路,不在发送NM报文,待NM-Timeout Timer超时后,同时进入预睡眠状态。

  • 进入预睡眠状态后ECU会启动CanNmWaitBusSleepTimer,此定时器不会重启,待它超时后进入睡眠模式。

如果在预睡眠状态中接收到诊断请求或者触发本地或远程唤醒事件,则ECU进入重复报文状态。

在预睡眠状态中收发器不能关闭,需要能够正常应答报文。

  • 在正常工作状态或转变睡眠状态,收到重复信息请求指示位位1(CVB的bit0置1)的NM报文,ECU要回到重复报文状态。
  • 在准备睡眠状态如果触发了本地唤醒事件,ECU会返回正常工作状态。收到诊断请求,一般也要求返回正常工作状态。

以上即为状态跳转的大体过程,这里有几个问题大家可以讨论下:

  • 进入重复报文状态后什么时候开始发送NM报文?

目前OEM有要求ECU从睡眠状态中被唤醒后发出的第一帧报文必须释NM报文,然后再发送应用报文。被唤醒后偏移多长时间开发发送NM报文可通过CanNmMsgCycleOffset来配置。

这个参数的目的有两个:一是避免某节点被本地事件唤醒后触发NM报文快发机制,如果offset=0有可能会以brust方式发送。二是避免同一时刻很多控制器一起向汇流排发送报文,造成汇流排负载率过高(这个理由个人觉得意义不大,即使同时上15电,控制器也很难一起初始化完成一起请求网路,即唤醒时间是不同的。)

  • NM报文的周期、CanNmTimeoutTime、CanNmWaitBusSleepTime、Repeat Message Time在数值上需要满足什么关系吗?

NM报文的周期必须要小于CanNmTimeoutTime,如果大於则可能还没收到就超时了,就不会重启了。CanNmWaitBusSleepTime、Repeat Message Time一般看OEM的需求自行定义,一般均在4s以内。

如果使用了局部网路管理,则CanNmMsgCycleTime<CanNmPnResetTime<CanNmTimeoutTime

  • 如果维持有本地唤醒事件,但汇流排故障(例如CANH和CANL短路)了,NM的状态机应如果处理?

CANstateManagement里有明确的规定,此种情况下ECU虽然即接收不到NM报文也发送不出NM报文,但NM-Timeout Timer定时器超时后需要重启,也就是故障恢复后ECU必须仍然处在正常工作状态。

2.4函数和参数配置

就先写到这吧,下面介绍CAN_COM。

推荐阅读:

相关文章