前言
如下表所示,从ComM的模式来看,ComM处于COMM_FULL_COMMUNICATION模式时报文能收能发;ComM处于COMM_NO_COMMUNICATION模式时报文不能收也不能发;ComM处于COMM_SILENT_COMMUNICATION模式时报文能收不能发;
以CAN通信为例,从Can控制器和Can收发器的硬件状态来看,一旦Can控制器或Can收发器被关闭则整个CAN->CanIf->Com的通信都不能收且不能发了,如果Can控制器且Can收发器被打开则整个CAN通信链路是既能收也能发报文的。
所以,站着硬件的角度来讲,硬件要么能收报文,要么能发报文,不存在硬件只能收报文不能发报文的状态。那么站着软件的角度来讲,ComM模块处于COMM_SILENT_COMMUNICATION模式时报文能收不能发一定是个软件逻辑状态,也就是说Can控制器且Can收发器一定是处于Active的(没有被关闭,CanDriver处于STARTED状态且CanTrcv处于Normal状态)。
那么,问题来了,ComStack是如何实现PDU只收不发的了?本文就来回答这个问题。
目录
注:本文章引用了一些第三方工具和文档,若有侵权,请联系作者删除!
正文
1.初始状态
我们假设CAN这路ComM Channel是FULL类型的,也就是说这路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硬线和其他ECU的NM报文)Not Active后,整个Com Stack和ComM, CanNM的状态变化。
2.唤醒源Disable
本地唤醒源IGN硬线唤醒源Disable后,也就是IGOFF后,User一般会调用ComM_RequestComMode(<user>, COMM_NO_COMMUNICATION),这个Action需要用户(User)根据项目的需求在User的SWC或者BswM的Action中完成。
远程唤醒源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.
3.2. 执行动作
ComM进入到COMM_FULL_COM_READY_SLEEP状态后就会调用Nm_NetworkRelease()通知到CanNM释放网络。
4.CanNM模式状态切换1
4.1. 状态变化
ComM调用Nm_NetworkRelease()后,CanNM从Normal Operation State切换到Ready Sleep State.
4.2. 执行动作
停发NM报文。
5.CanNM模式状态切换2
5.1. 状态变化
进入到NetworkMode后CanNM就会开始NM-Timeout Timer (收到NM报文则清零计时器),在Network Mode下的Repeat Message State/Normal Operation State就算NM-Timeout实际发生也不会产生模式状态变化(因为本地唤醒源头还在维持,只不过网络唤醒源没了),但是在Network Mode下的Ready Sleep State如果发生了NM-Timeout则CanNM会从Network Mode下的Ready Sleep State切换到 Prepare Bus-Sleep Mode.
5.2. 执行动作
调用Nm_PrepareBusSleepMode通知到上层模块(ComM模块)。
6. ComM模式状态切换2
6.1. 状态变化
ComM模块收到ComM_Nm_PrepareBusSleepMode()的通知后从COMM_FULL_COMMUNICATION模式下的COMM_FULL_COM_READY_SLEEP状态切换到COMM_SILENT_COMMUNICATION模式。
6.2. 执行动作
调用CanSM_ RequestComMode(network:=<channel state machine’s network>, mode:= COMM_SILENT_COMMUNICATION)通知到CanSM模块。ComM模块通过调用CanSM_ RequestComMode()接口来实现ComM Channel关闭报文发送能力,但是保持报文的接收能力。
7.CanSM模式状态切换
7.1. 状态变化
调用CanSM_ RequestComMode(network:=<channel state machine’s network>, mode:= COMM_SILENT_COMMUNICATION)通知到CanSM后,CanSM从CANSM_BSM_S_FULLCOM模式切换到CANSM_BSM_S_SILENTCOM模式。
7.2. 执行动作
CanSM进入到CANSM_BSM_S_SILENTCOM模式后会调用CanIf_SetPduMode()设置ControllerId标识的CAN通道到CANIF_TX_OFFLINE状态。
8. CanIf完成报文发送阻断
在CANIF_TX_OFFLINE状态下,CanIf阻断报文的发送,但是报文的接收能力依然保持。
在CANIF_TX_OFFLINE模式下,CanIf阻断报文的发送具体通过CanIf_Transmit()函数来实现。如果
PDU Channel Mode处于CANIF_TX_OFFLINE模式,则CanIf_Transmit()函数会丢弃发送的报文(不调用Can Driver的驱动接口Can_Write往下发送报文)。
9.总结
ComM从COMM_NO_COMMUNICATION模式切换COMM_SILENT_COMMUNICATION模式由外部唤醒源Disable来触发;ComM处于COMM_SILENT_COMMUNICATION模式时报文能收不能发的特性最终由CanIf模块来实现。而这个过程需要CanNM, CanSM, Can Driver, CanTrcv.eg.等模块的参与。
值得注意的是:PDU Channel Modes和Can Controller State不要混淆起来,PDU Channel Modes只涉及到软件逻辑状态,PDU Channel Mode处于只收不发的CANIF_TX_OFFLINE模式下时Can Controller State依然是STARTED状态(Active)的。
End
「
原文始发于微信公众号(汽车电子嵌入式):AUTSOAR ComStack如何实现PDU只收不发的
- 左青龙
- 微信扫一扫
- 右白虎
- 微信扫一扫
评论