前言
如下表所示,从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只收不发的了?本文就来回答这个问题。
目录
注:本文章引用了一些第三方工具和文档,若有侵权,请联系作者删除!
正文
我们假设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的状态变化。
本地唤醒源IGN硬线唤醒源Disable后,也就是IGOFF后,User一般会调用ComM_RequestComMode(
远程唤醒源Disable,也就是CAN总线上其他ECU停发NM报文,后会影响CanNM的状态切换,这个在第5小节讲解。
User调用ComM_RequestComMode(
ComM进入到COMM_FULL_COM_READY_SLEEP状态后就会调用Nm_NetworkRelease()通知到CanNM释放网络。
ComM调用Nm_NetworkRelease()后,CanNM从Normal Operation State切换到Ready Sleep State.
停发NM报文。
进入到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.
调用Nm_PrepareBusSleepMode通知到上层模块(ComM模块)。
ComM模块收到ComM_Nm_PrepareBusSleepMode()的通知后从COMM_FULL_COMMUNICATION模式下的COMM_FULL_COM_READY_SLEEP状态切换到COMM_SILENT_COMMUNICATION模式。
调用CanSM_ RequestComMode(network:=
调用CanSM_ RequestComMode(network:=
CanSM进入到CANSM_BSM_S_SILENTCOM模式后会调用CanIf_SetPduMode()设置ControllerId标识的CAN通道到CANIF_TX_OFFLINE状态。
在CANIF_TX_OFFLINE状态下,CanIf阻断报文的发送,但是报文的接收能力依然保持。
在CANIF_TX_OFFLINE模式下,CanIf阻断报文的发送具体通过CanIf_Transmit()函数来实现。如果
PDU Channel Mode处于CANIF_TX_OFFLINE模式,则CanIf_Transmit()函数会丢弃发送的报文(不调用Can Driver的驱动接口Can_Write往下发送报文)。
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
「汽车电子嵌入式在CSDN上同步推出AUTOSAR精进之路专栏,本专栏每个模块完全按实际项目中开发及维护过程来详细介绍。模块核心概念介绍、实际需求描述、实际工程配置、特殊需求介绍及背后原理、实际工程使用经验总结。目的是让读者看完每一个章节后能理解原理后根据需求完成一个模块的配置或者解决一个问题。」
点击文章最后左下角的阅读原文可以获取更多信息
或者复制如下链接到浏览器获取更多信息
https://blog.csdn.net/qq_36056498/article/details/132125693
文末福利
2.为便于技术交流,创建了汽车电子嵌入式技术交流群,可尽情探讨AP,CP,DDS,SOME/IP等前沿热点话题,后台回复“加群”即可加入;
注:本文引用了一些第三方工具和文档,若有侵权,请联系作者删除!
推荐阅读
汽车电子嵌入式精彩文章汇总第一期:20210530-20230703
汽车电子嵌入式精彩文章汇总第2期
汽车电子嵌入式精彩文章汇总第3期
【OS】AUTOSAR OS Event实现原理
【OS】AUTOSAR OS Spinlock实现原理(下篇)
【OS】AUTOSAR OS Spinlock实现原理(上篇)
CanNm处于PBS状态下接收到一帧诊断报文DCM会响应吗
TC3xx芯片CAN模块详解
AUTOSAR OS Alarm实现原理
AUTOSAR OsTask切换原理
TC3xx 芯片SPI模块详解
End
欢迎点赞,关注,转发,在看,您的每一次鼓励,都是我最大的动力!
汽车电子嵌入式
微信扫描二维码,关注我的公众号