AUTSOAR ComStack如何实现PDU只收不发的

admin 2024年9月18日10:30:50评论14 views字数 2972阅读9分54秒阅读模式

前言

如下表所示,从ComM的模式来看,ComM处于COMM_FULL_COMMUNICATION模式时报文能收能发;ComM处于COMM_NO_COMMUNICATION模式时报文不能收也不能发;ComM处于COMM_SILENT_COMMUNICATION模式时报文能收不能发;

AUTSOAR ComStack如何实现PDU只收不发的

CAN通信为例,从Can控制器和Can收发器的硬件状态来看,一旦Can控制器或Can收发器被关闭则整个CAN->CanIf->Com的通信都不能收且不能发了,如果Can控制器且Can收发器被打开则整个CAN通信链路是既能收也能发报文的。

所以,站着硬件的角度来讲,硬件要么能收报文,要么能发报文,不存在硬件只能收报文不能发报文的状态。那么站着软件的角度来讲,ComM模块处于COMM_SILENT_COMMUNICATION模式时报文能收不能发一定是个软件逻辑状态,也就是说Can控制器且Can收发器一定是处于Active的(没有被关闭,CanDriver处于STARTED状态且CanTrcv处于Normal状态)。

那么,问题来了,ComStack是如何实现PDU只收不发的了?本文就来回答这个问题。

目录

AUTSOAR ComStack如何实现PDU只收不发的

注:本文章引用了一些第三方工具和文档,若有侵权,请联系作者删除!

正文

1.初始状态

我们假设CAN这路ComM ChannelFULL类型的,也就是说这路CAN支持AUTOSAR网络管理,CAN网络存在本地唤醒源IGN硬线以及远程(网络)唤醒源NM报文。

在本地唤醒源IGN硬线Active且外部其他节点也往CAN总线上发NM报文的时候,ComM应该处于COMM_FULL_COMMUNICATION模式下COMM_FULL_COM_NETWORK_REQUESTED状态,CanNM处于Network Mode模式下的Normal Operation State状态。此时,APP报文和NM报文都能收能发。

接下来,我们分析当外部触发源(IGN硬线和其他ECUNM报文)Not Active后,整个Com StackComM, CanNM的状态变化。

2.唤醒源Disable

本地唤醒源IGN硬线唤醒源Disable后,也就是IGOFF后,User一般会调用ComM_RequestComMode(<user>, COMM_NO_COMMUNICATION),这个Action需要用户(User)根据项目的需求在UserSWC或者BswMAction中完成。

远程唤醒源Disable,也就是CAN总线上其他ECU停发NM报文,后会影响CanNM的状态切换,这个在第5小节讲解。

3.ComM模式状态切换1

3.1. 状态变化

User调用ComM_RequestComMode(<user>, COMM_NO_COMMUNICATION)后,ComM状态从COMM_FULL_COM_NETWORK_REQUESTED切换到COMM_FULL_COM_READY_SLEEP.

AUTSOAR ComStack如何实现PDU只收不发的

3.2. 执行动作

ComM进入到COMM_FULL_COM_READY_SLEEP状态后就会调用Nm_NetworkRelease()通知到CanNM释放网络。

AUTSOAR ComStack如何实现PDU只收不发的

4.CanNM模式状态切换1

4.1. 状态变化

ComM调用Nm_NetworkRelease()后,CanNMNormal Operation State切换到Ready Sleep State.

AUTSOAR ComStack如何实现PDU只收不发的

4.2. 执行动作

停发NM报文。

AUTSOAR ComStack如何实现PDU只收不发的

5.CanNM模式状态切换2

5.1. 状态变化

进入到NetworkModeCanNM就会开始NM-Timeout Timer (收到NM报文则清零计时器),在Network Mode下的Repeat Message State/Normal Operation State就算NM-Timeout实际发生也不会产生模式状态变化(因为本地唤醒源头还在维持,只不过网络唤醒源没了),但是在Network Mode下的Ready Sleep State如果发生了NM-TimeoutCanNM会从Network Mode下的Ready Sleep State切换到 Prepare Bus-Sleep Mode.

AUTSOAR ComStack如何实现PDU只收不发的

5.2. 执行动作

调用Nm_PrepareBusSleepMode通知到上层模块(ComM模块)。

AUTSOAR ComStack如何实现PDU只收不发的

AUTSOAR ComStack如何实现PDU只收不发的

6. ComM模式状态切换2

6.1. 状态变化

ComM模块收到ComM_Nm_PrepareBusSleepMode()的通知后从COMM_FULL_COMMUNICATION模式下的COMM_FULL_COM_READY_SLEEP状态切换到COMM_SILENT_COMMUNICATION模式。

AUTSOAR ComStack如何实现PDU只收不发的

6.2. 执行动作

调用CanSM_ RequestComMode(network:=<channel state machine’s network>, mode:= COMM_SILENT_COMMUNICATION)通知到CanSM模块。ComM模块通过调用CanSM_ RequestComMode()接口来实现ComM Channel关闭报文发送能力,但是保持报文的接收能力。

AUTSOAR ComStack如何实现PDU只收不发的

7.CanSM模式状态切换

7.1. 状态变化

调用CanSM_ RequestComMode(network:=<channel state machine’s network>, mode:= COMM_SILENT_COMMUNICATION)通知到CanSM后,CanSMCANSM_BSM_S_FULLCOM模式切换到CANSM_BSM_S_SILENTCOM模式。

AUTSOAR ComStack如何实现PDU只收不发的

7.2. 执行动作

CanSM进入到CANSM_BSM_S_SILENTCOM模式后会调用CanIf_SetPduMode()设置ControllerId标识的CAN通道到CANIF_TX_OFFLINE状态。

AUTSOAR ComStack如何实现PDU只收不发的

8. CanIf完成报文发送阻断

CANIF_TX_OFFLINE状态下,CanIf阻断报文的发送,但是报文的接收能力依然保持。

AUTSOAR ComStack如何实现PDU只收不发的

CANIF_TX_OFFLINE模式下,CanIf阻断报文的发送具体通过CanIf_Transmit()函数来实现。如果

PDU Channel Mode处于CANIF_TX_OFFLINE模式,则CanIf_Transmit()函数会丢弃发送的报文(不调用Can Driver的驱动接口Can_Write往下发送报文)。

AUTSOAR ComStack如何实现PDU只收不发的

9.总结

ComMCOMM_NO_COMMUNICATION模式切换COMM_SILENT_COMMUNICATION模式由外部唤醒源Disable来触发;ComM处于COMM_SILENT_COMMUNICATION模式时报文能收不能发的特性最终由CanIf模块来实现。而这个过程需要CanNM, CanSM, Can Driver, CanTrcv.eg.等模块的参与。

值得注意的是PDU Channel ModesCan Controller State不要混淆起来,PDU Channel Modes只涉及到软件逻辑状态,PDU Channel Mode处于只收不发的CANIF_TX_OFFLINE模式下时Can Controller State依然是STARTED状态(Active)的。

End

原文始发于微信公众号(汽车电子嵌入式):AUTSOAR ComStack如何实现PDU只收不发的

  • 左青龙
  • 微信扫一扫
  • weinxin
  • 右白虎
  • 微信扫一扫
  • weinxin
admin
  • 本文由 发表于 2024年9月18日10:30:50
  • 转载请保留本文链接(CN-SEC中文网:感谢原作者辛苦付出):
                   AUTSOAR ComStack如何实现PDU只收不发的https://cn-sec.com/archives/3177829.html

发表评论

匿名网友 填写信息