文章目录


前言

本文介绍CP AUTOSAR 架构下的CanNm组件,基于S32K312芯片、Vector提供的CBD包,使用DaVinci Configurator工具进行配置的经验。
CanNm组件位于Communication Services层,上层为Nm,下层为CanIf,大多数情况下只与这两个组件交互。
CanNm组件基于AUTOSAR标准实现ECU与ECU之间的网络管理。
在这里插入图片描述在这里插入图片描述

上图为CP AUTOSAR CAN网络架构。


一、CanNm功能概述

CanNm实现了以CAN为通信的AUTOSAR直接式网络协议。
AUTOSAR直接式网络管理是一种‌基于网络管理报文(NM PDU)的分布式协同机制‌,通过节点间的NM报文交互实现网络状态的同步(如唤醒、休眠)‌。其核心目标是‌降低整车静态功耗‌,确保网络中的节点在无通信需求时同步进入低功耗模式‌。

(一)、AUTOSAR网络管理和OSEK网络管理

OSEK/VDX是面向ECU级开发的操作系统与网络管理标准,定义了直接网络管理的核心机制(如令牌环逻辑)‌。OSEK标准为ISO17356。OESK支持直接式和间接式网络管理。
AUTOSAR在OSEK基础上扩展为整车级软件架构标准,其网络管理机制继承了OSEK的直接网络管理模式,但优化了状态机与同步算法‌。AUTOSAR网络管理只有直接式。
两者均依赖‌特定的网络管理报文(NM PDU)‌协调节点状态,通过报文交互实现网络唤醒与休眠同步‌。

差异点:
OSEK‌:
使用‌令牌环逻辑‌(Token Ring),节点通过Alive报文建环,再通过Ring报文传递令牌‌。
状态机层级复杂,包含NMOff、NMOn、NMShutDown等主状态,以及NMAwake、NMBusSleep等子状态‌。
NM报文分为Alive、Ring、LimpHome三类,携带SleepInd/SleepACK等控制位‌。
适用于轻量级ECU、小规模网络(如车身控制模块)‌。
AUTOSAR‌:
采用‌分层状态机‌,分为Bus Sleep Mode(BSM)、Prepare Bus Sleep Mode(PBSM)、Network Mode(NOS/RMS/RSS)‌。
无令牌环机制,通过快发(Fast Transmission)和协同睡眠算法实现状态同步‌。
NM报文仅包含‌控制位向量(如RPB)‌,无类型细分,数据字段支持用户自定义扩展‌。
适用于复杂整车网络(支持部分网络管理、多总线协同)‌。

(二)、直接式网络管理和间接式网络管理

1、实现机制与报文依赖‌
直接式网络管理通过‌专用网络管理报文(NM PDU)‌实现节点状态协调,例如AUTOSAR中通过携带控制位(如RPB)的NM报文触发全网唤醒或休眠‌。
间接式网络管理‌无需专用报文‌,仅通过应用报文的存在与否间接判断网络活跃状态,例如OSEK间接式依赖应用层心跳报文维持网络‌。两者的本质差异在于是否独立定义协议层的网络管理机制‌。
2、状态机与同步逻辑‌
‌直接式‌:
采用分层状态机(如AUTOSAR的BSM、RMS),通过全局参数(如CanNmTimeoutTime)强制同步休眠请求‌。
OSEK直接式依赖令牌环机制(Alive/Ring报文),需所有节点设置Sleep.Ind位并通过SleepACK确认同步‌。
‌间接式‌:
无独立状态机,网络状态由应用逻辑驱动,例如停止发送应用报文后被动休眠,同步性较弱且延迟较高‌。
3、唤醒与休眠控制‌
‌直接式‌支持快速唤醒:任一节点发送NM报文(如AUTOSAR中RPB=1)即可触发全网唤醒,首帧报文需为NM类型‌。
‌间接式‌需依赖应用报文触发唤醒(如车门开关信号),灵活性受限‌。
‌休眠同步‌:
直接式通过协议层算法强制同步(如AUTOSAR的协同睡眠),所有节点依次进入低功耗模式‌。
间接式需所有应用报文停止后被动休眠,易因个别节点未释放请求导致同步失败‌。
4、资源占用与适用场景‌
‌直接式‌占用额外总线带宽(NM报文周期发送),但支持高精度同步和复杂网络管理功能(如AUTOSAR的部分网络管理EIRA)。
‌适用场景‌:整车级网络(动力域、底盘域)。
‌间接式‌无额外协议开销,实现简单,但同步性差且依赖应用设计约束‌。
‌适用场景‌:资源受限的小型ECU或子网(如车身控制模块)‌。

二、CanNm与其他组件的依赖关系

在这里插入图片描述
CanNm直接调用CanIf的接口进行NM PDU的收发,实现CAN NM的逻辑供上层Nm作接口用,其他组件如Com、ComM实现UserData或PNC功能则调用Nm的接口。
CanNm只处理AUTOSAR NM的实现协议如模式转换、超时处理、事件通知等,具体应用层逻辑由上层实现,如requested和released调用时机,UserData写入操作等。

三、Network states和Initialization

(一)、Network states

CanNm网络的状态分为requested和released,当CanNm_NetworkRequest()被调用,进入requested,当CanNm_NetworkRelease()被调用,进入released。
requested下持续发送NM PDU(被动模式下除外)禁止进入休眠,监听总线活动维持网络同步,released下停止发送NM PDU准备进入休眠,监听总线唤醒事件,如接收到NM PDU。

(二)、Initialization

上电时当CanNm_Init()被调用后CanNm进入初始化,然后模式设置为Bus-Sleep Mode,若没有唤醒请求时间超时后,在Bus-Sleep Mode下ECU继续休眠。CanNm需要在CanIf初始化后面。

初始化后,network state应该为released。

CanNmGlobalPnSupport为TRUE,并且CanNm初始化完成,NM Message Tx Timeout
Timer需要停止计数。

在初始化期间bus load reduction需要失效。

CanNm初始化后需要停止Message Cycle Timer,从而暂停NM PDU的发送(被动模式不需要关注)。

在初始化期间CanNm的user data需要设置为0xFF。

在初始化期间CanNm的Control Bit Vector需要设置为0x00。

在初始化期间并且CanNmPnEnabled为TRUE,PNC bit vector需要设置为0x00。

在初始化后如果CanNmSynchronizedPncShutdownEnabled为TRUE,PN shutdown message的相关活动策略需要关闭不能激活防止误发。

四、NM PDU 结构

在这里插入图片描述CAN网络管理通过NM PDU来控制切换状态和模式,网络内的每个主动节点都需要发送NM PDU,内容如上所示。

(一)、Source Node Identifier

Source Node Identifier也就是SNI用来标识发送NM PDU的节点身份,通常NM PDU CANID为0x500-0x57F,网络内每个ECU分配一个ID,所以SNI为00-7F。
CanNmPduNidPosition参数能配置成Byte 0, Byte 1, 或off,也就是让SNI选择在BYTE0还是BYTE1或者关闭,网络上所有的节点该参数都要统一否则NM PDU会解析错误,为BYTE1时那么CBV在BYTE0,为off时,BYTE为User data或PNC。

(二)、Control Bit Vector

Control Bit Vector也就是CBV用于传递网络管理控制信息(如休眠指示、唤醒请求等)。
CanNmPduCbvPosition参数能配置成Byte 0, Byte 1, 或off,也就是让CBV选择在BYTE0还是BYTE1或者关闭,网络上所有的节点该参数都要统一否则NM PDU会解析错误,为BYTE0时那么SNI在BYTE1,为off时,BYTE为User data或PNC。
在这里插入图片描述
CBV的数据结构如上所示。

CBV在CanNm初始化期间需要设置为0x00。

PartialNetworkInformationBit为1代表NM PDU中的PNC字段有效。
如果PN功能开启,NM PDU在发送时会将改位设置为1。

PartialNetworkLearningBit为1代表ECU进入PN学习流程,通过CanNm_PnLearningRequest()置1。该位为1通常RMR位也为1,CanNm进入了RMS,当离开RMS时,该位清0.

ActiveWakeupBit表示ECU是否主动唤醒。如果CanNm_NetworkRequest()被调用CanNm从BSM或PBM切换到Network Mode,说明ECU是主动唤醒的,并且CanNmActiveWakeupBitEnabled为TRUE的话,那么ActiveWakeupBit要变为1,别的ECU就知道该ECU是主动唤醒的,可能更改电源策略,同样的在退出Network Mode时,ActiveWakeupBit要变为0.

NM CoordinatorSleepReadyBit为1代表网络上的ECU处于RSS,收到1后需要立即切换到RSS,CanNmCoordinatorSyncSupport为TRUE下有效,通过CanNm_SetSleepReadyBit()置位。该位通常是网关节点去置位,当发现总线上其他ECU没发NM PDU了,便置位告诉其他节点进入睡眠流程。

PNShutdownRequestBit为1代表进入PNC同步关闭流程,收到该位为1后,CanNm调用Nm_ForwardSynchronizedPncShutdown()通知Nm,释放相关的PNC位,重置PnResetTimer,CanNmSynchronizedPncShutdownEnabled和CanNmPnEnabled为TRUE下有效,通常是网关节点需要有关联的部分节点进入RSS便调用CanNm_ActivateTxPnShutdownMsg()激活该位。

RepeatMessageRequestBit为1代表需要进入RMS,如果ECU处于NOS或RSS下收到NM PDU中RepeatMessageRequestBit为1,那么需要切换到RMS,但是要发送的NM PDU中该位保持上一次的值,不快发报文。
通过调用CanNm_RepeatMessageRequest()将该位置1,调用该函数的ECU在NOS或RSS下的话切换到RMS并且快发报文,离开RMS时该位清零。
当主动唤醒进入RMS快发报文时,该位要置1,快发结束清零。
进入RMS为什么要快发报文是因为主动唤醒的节点需要快点唤醒整个网络。

(三)、User data

User data为用户自定义数据,通常OEM要求表示ECU的唤醒源或其他数据。
NM PDU的长度受EcuC模块里的PduLength所定义,User data必须位于PduLength内并且不与System Bytes(SNI和CBV)和PNC字节重叠。
当CanNmPnEnabled为FALSE时,即没有PNC功能,除了SNI和CBV外,NM PDU里剩余的字节都是User data。若SNI或CBV设置为off,那BYTE0或BYTE1也是User data。
当CanNmPnEnabled为TRUE时,User data只能位于System Bytes和PNC之间或PNC之后,长度由NmPncBitVectorOffset和NmPncBitVectorLength参数决定。若定义为中间位置,那么长度为NmPncBitVectorOffset-System Bytes长度,若定义为末尾位置,那么长度为PduLength-(NmPncBitVectorOffset + NmPncBitVectorLength)。
User data的配置网络内所有节点需要统一不然会解析错误。

(四)、PNC

如果PN功能开启,NM PDU中的PNI Bit有效时,CanNm需要提取PNC并通过Nm_PncBitVectorRxIndication()传给Nm。
通过识别PNC字段判断判断要不要维持唤醒。

五、Partial Networking

部分网络功能主要在ComM中实现,CanNm里要做的逻辑是识别出NM PDU中的PNC字段并提供给Nm再提供给ComM。
激活PN功能需要CanNm_ConfirmPnAvailability()被调用,CAN收发器需要带PN功能,即能收到特定帧进行唤醒的功能,如果没有那需要在软件里进行滤波识别出PN功能,不过ECU休眠每次都能被任意帧唤醒会消耗能量。

(一)、Rx Handling of NM PDUs

当CanNmPnEnabled为FALSE时,CanNm关闭PN功能,不丢弃任何NM PDU,对与PN相关的字段如PNI、PNSR、PNC进行忽略不处理。

当CanNmPnEnabled为TRUE时,即开启PN功能,有以下处理:

如果PNI bit为0时,CanNmAllNmMessagesKeepAwake为TRUE,继续处理NM PDU,忽略PN相关的字段。(如网关在接收到任何NM PDU下都需要保持唤醒)

如果PNI bit为0时,CanNmAllNmMessagesKeepAwake为FALSE,需要忽略收到的NM PDU。

如果PNI bit为1时,CanNmSynchronizedPncShutdownEnabled为FALSE或为TRUE但是PNSR bit为0,则提取NM PDU中的PNC bit,通过NmPncBitVectorOffset和NmPncBitVectorLength两个参数确定PNC的位置,然后调用Nm_PncBitVectorRxIndication()传给Nm。
如果Nm_PncBitVectorRxIndication()调用后,传入的NM PDU只有满足任一条件才会被处理:
1、CanNmAllNmMessagesKeepAwake为TRUE,表示无论PNC是否相关,所有的NM PDU都会被处理。
2、CanNm_ConfirmPnAvailability()没有被调用,说明CAN控制器或CAN收发器没有检测到PN功能的帧,则所有NM PDU都会被处理。
3、Nm_PncBitVectorRxIndication()输出的RelevantPncRequestDetectedPtr为TRUE,表示NM-PDU的PNC位包含当前ECU需响应的部分网络请求,NM PDU会被上层处理。
例子:
CanNmPduCbvPosition = 0、CanNmPduNidPosition = 1、NmPncBitVectorOffset = 4、NmPncBitVectorLength = 4时
NM PDU结构如下
在这里插入图片描述
如果CanNmSynchronizedPncShutdownEnabled为TRUE,接收到的NM PDU的PNI和PNSR bit有置1的话,将PNC提取出并调用Nm_ForwardSynchronizedPncShutdown()将PNC位向量广播给网络中的其他节点,确保整个部分网络(PN)同步关闭‌。
如果对应的ComM通道为actively coordinated(ComMPncGatewayType=COMM_GATEWAY_TYPE_ACTIVE),那么忽略PNSR bit 仅按普通NM PDU处理,因为该配置下ECU为网关是主动发送同步关闭请求的节点而不是接收的。

(二)、Tx Handling of NM PDUs

如果CanNmPnEnabled为TRUE,则发送的NM PDU的PNI为1否则为0.
当CanNmPnEnabled为TRUE时,即开启PN功能,有以下处理:

每次发送NM PDU前CanNm需要调用Nm_PncBitVectorTxIndication()获取最新的PNC bit并根据NmPncBitVectorOffset和NmPncBitVectorLength参数填入NM PDU并发送。

如果NM PDU被发送成功,即CanNm_TxConfirmation()被调用,CanNm也需要调用Nm_PncBitVectorTxConfirmation()并传入之前发送成功的PNC bit,通知Nm表示发送成功,不管是周期性NM PDU还是PN shutdown messages。

如果NM PDU被发送失败,即CanNm_TxConfirmation()被调用结果为E_NOT_OK或调用CanIf_Transmit()返回E_NOT_OK,CanNm需要调用Nm_PncBitVectorTxConfirmation()传入结果为E_NOT_OK表示发送失败,Nm模块会利用E_NOT_OK结果触发synchronized PNC shutdown流程‌(例如重试发送或强制关闭相关PNC),如果PNC shutdown流程有配置的话。

如果PN shutdown messages被激活需要发送PN shutdown messages即PNSR=1,需要比普通NM PDU优先发出并之间调用CanIf_Transmit()马上发出。

(三)、Pn Learning

通过调用CanNm_PnLearningRequest ()设置要发送NM PDU的Repeat Message Request Bit和Partial Network Learning Bit为1,让所有节点强制进入PNC学习阶段,CanNmDynamicPncToChannelMappingSupport为TRUE下有效。
学习结果通过ComM_CurrentPncMode()通知ComM。

六、Communication Scheduling和Bus Load Reduction Mechanism

(一)、Transmission

NM PDU的发送必须满足CanNmPassiveModeEnabled = FALSE(非被动模式)和诊断的通信控制服务Communication Control为开启,NM PDU才能发出去。

NM PDU需要周期传输(非被动模式)。

CanNm可以选择启用bus load reduction降低NM PDU的发送周期,NM PDU只有在Repeat Message State和Normal Operation
State才有发送,所以bus load reduction只有在Normal Operation
State才能启用。Repeat Message State下bus load reduction不管有没有开启都无效。

CanNmImmediateTxconfEnabled为TRUE后,NM PDU的每次发送不需要等待CanIf的TxConfirmation来确认是否发送成功,这样可以减少处理延时提高执行效率。

如果不是通过CanNm_NetworkRequest()进入RMS或CanNmImmediateNmTransmissions参数为0,在RMS下NM PDU的发送需要由CanNmMsgCycleTime为周期并且CanNmMsgCycleOffset时间后再进入RMS。不是通过CanNm_NetworkRequest()说明不是主动唤醒的而是被动唤醒那就不需要快发报文,CanNmImmediateNmTransmissions是快发报文次数,为0说明不需要快发报文。如果每个ECU都快发报文会造成总线上的堵塞。

如果是通过CanNm_NetworkRequest()进入RMS说明是主动唤醒并且CanNmImmediateNmTransmissions参数大于0,那么NM PDU第一帧需要立即发出并且比应用报文先发并且不需要等待CanNmMsgCycleOffset时间,之后应该按照CanNmImmediateNmCycleTime周期发送,直到发的次数满足CanNmImmediateNmTransmissions后再切回CanNmMsgCycleTime周期。

如果CanNm从RSS切换为NOS,则需要立即发出第一帧NM PDU无需等待定时器,这是因为在RSS下ECU认为总线需要释放了,切到NOS说明有事件要处理需要快速发送NM PDU唤醒总线。

CanNmPnHandleMultipleNetworkRequests为TRUE时,调用CanNm_NetworkRequest()时CanNm如果处于RSS时会切换到RMS,并且使用CanNmImmediateNmCycleTime和CanNmImmediateNmTransmissions作为参数来快发报文。为FALSE则不会切到RSS而是进NOS。此参数用于PN功能,也就是前提要CanNmPnEnabled为TRUE。

CanNm需要以CanNmImmediateNmCycleTime为周期发送NM PDU时,如果调用CanIf_Transmit()发送失败,需要在CanNm_MainFunction()里重试发送直到成功为止。重试期间不更新CanNmImmediateNmCycleTime时间。

CanNmSynchronizedPncShutdownEnabled如果为TRUE,在Network Mode内PN shutdown messages有激活的话正在发送,常规NM PDU将被推迟发送,PN shutdown messages会立即发送,如果PN关闭流程持续时间长,常规NM PDU可能被多个CanNm_MainFunction()延迟,导致接收节点误认为本节点离线,触发NmPnResetTime超时,为了确保常规NM PDU延迟不会导致NmPnResetTime超时,需满足条件:(NmPnResetTime – CanNmMsgCycleTime) > n * CanNmMainFunctionPeriod:
NmPnResetTime‌:节点等待有PNC激活的NM PDU的最大时间,超时则PNC位清零。
CanNmMsgCycleTime‌:常规NM PDU的发送周期。
CanNmMainFunctionPeriod‌:CanNm_MainFunction 的主函数调用周期(例如5ms或10ms)。
n‌:允许的连续延迟次数(由系统设计定义)。
NmPnResetTime – CanNmMsgCycleTime 表示从最后一次成功发送NM PDU到超时的剩余时间。

NM PDU或PN shutdown messages如果发送失败即CanNm_TxConfirmation()返回E_NOT_OK或CanIf_Transmit()返回E_NOT_OK,则下一次发送需要在CanNm_MainFunction()里进行发送。

如果CanNmPnHandleMultipleNetworkRequests为TRUE,当CanNm_NetworkRequest()调用后,CanNm要切换到RMS,不管是在NOS还是RSS。Immediate Transmission功能都要强制使用。

(二)、Reception

如果NM PDU成功接收,也就是CanNm_RxIndication()被调用,CanNm需要复制NM PDU的数据到内部缓冲区。

(三)、Bus Load Reduction Mechanism

如果每个主动节点在NOS期间都按CanNmMsgCycleTime周期发送NM PDU或同时发送的话,那么总线上容易出现总线过载,如果总线上节点很多的话,OEM会给每个节点分配CanNmMsgCycleOffset和CanNmMsgReducedTime参数,保证总线上最多只有CanNmMsgReducedTime时间最小的两个节点在发送NM PDU,CanNmMsgCycleOffset是首次发出NM PDU的时间(除了需要快发报文外不使用该参数),CanNmMsgReducedTime用来降低总线负载用。
节点具体时间CanNmMsgReducedTime应该大于0.5*CanNmMsgCycleTime,小于CanNmMsgCycleTime。
CanNmBusLoadReductionEnabled和CanNmBusLoadReductionActive为TRUE,CanNmPassiveModeEnabled为FALSE时,CanNmMsgReducedTime起作用,当本节点收到其他节点的NM PDU时,本节点的下一个NM PDU周期发送时间为CanNmMsgReducedTime,如果本节点的NM PDU发送成功下一个NM PDU发送则改回CanNmMsgCycleTime时间,在CanNmMsgCycleTime时间到之前,如果又收到其他节点的NM PDU,下一次又按CanNmMsgReducedTime为周期来发送。
在这里插入图片描述
如图在T1时刻,Node1发出NM PDU,故设置下次的发送时间为CanNmMsgCycleTime(70MS),Node2和Node3收到Node1的NM PDU,故设置下次的发送时间为CanNmMsgReducedTime(50MS和60MS)。
T2时刻,Node2先发出,故设置下次的发送时间为CanNmMsgCycleTime(70MS),Node1和Node3收到Node2的NM PDU,故设置下次的发送时间为CanNmMsgReducedTime(40MS和60MS)。
T3时刻,Node1因为周期是40MS先发出NM PDU,故设置下次的发送时间为CanNmMsgCycleTime(70MS),Node2和Node3收到Node1的NM PDU,故设置下次的发送时间为CanNmMsgReducedTime(50MS和60MS)。因为Node1和Node2的CanNmMsgReducedTime最短,所以总线上只有Node1和Node2在发送NM PDU,Node3没有发出NM PDU。
T4时刻,Node1进入RSS,不再发送NM PDU。
之后因为Node1没发了,总线上Node2和Node3在交替发送NM PDU。

七、CanNm模式

在这里插入图片描述
上图中绿色描述是模式切换相关,红色描述是错误处理相关,蓝色描述是PNC相关。

CanNm应包含三种运行模式:
Network Mode、Prepare Bus-Sleep Mode(PBM)、Bus-Sleep Mode(BSM),而Network Mode又包含Repeat Message State、Normal Operation State、Ready Sleep State。
CanNm模式每次变更后都应调Nm的回调函数通知到Nm。
各个模式下的报文发送接收权限如下:
在这里插入图片描述

(一)、Network Mode

Network Mode又包含了三个状态:Repeat Message State(RMS)、Normal Operation State(NOS)、Ready Sleep State(RSS)。

在Network模式下CAN的应用报文、NM报文、诊断报文、标定报文都允许收发,除了在RSS状态下不能发NM报文外。

当从Prepare Bus-Sleep Mode、Bus-Sleep Mode切换到Network Mode时都要进入Repeat Message State,然后启动NM-Timeout Timer定时器,并且调用Nm_NetworkMode()通知Nm。

如果在Network模式下CanNm_RxIndication()都有被调用说明ECU有从CAN驱动那里接收到NM报文,那么NM-Timeout Timer都要被刷新。

如果在Network模式下CanNm_TxConfirmation()都有被调用并且返回E_OK说明ECU有从CAN驱动那里成功发送NM报文,那么NM-Timeout Timer都要被刷新。(如果CanNmImmediateTxconfEnabled有使能则不需要等待CAN驱动发送完成调用NM发送后直接返回CanNm_TxConfirmation())。

CanNm每次在被调用初始化和反初始化后NM-Timeout Timer都要被刷新。

在Network模式下调用CanNm_PassiveStartUp()不应该执行并且返回E_NOT_OK。

在同一个网络内,当CanNmDynamicPncToChannelMappingEnabled设置为TRUE,CanNm_PnLearningRequest()被调用时,处于Network模式,发送NM报文里的CBV字节里的Repeat Message Bit和Partial Network Learning Bit需要置为1,并且要从Network模式要重新从Repeat Message State开始或原先在Repeat Message State下的话要重新启动。

当CanNmDynamicPncToChannelMappingEnabled设置为TRUE,处于Network模式,接收到同一个网络内NM报文如果CBV字节的Partial Network Learning Bit和Repeat Message Request Bit均为1,CanNm需要将发送NM报文的CBV字节里的Partial Network Learning Bit置为1,并且要从Network模式要重新从Repeat Message State开始或原先在Repeat Message State下的话要重新启动。

1、Repeat Message State

进入RMS的话允许NM报文收发(被动节点只能收)、应用报文收发、诊断报文收发、标定报文收发。

如果当前处于Passive模式的话,进入RMS,ECU不会主动发送NM报文,只有处于非Passive模式,从Bus-Sleep模式或Prepare Bus-Sleep模式进入RMS时,会主动发送周期NM报文,让总线上其他ECU节点感知到该节点发生了状态变化,ECU在该状态下至少保持CanNmRepeatMessageTime时间,避免频繁切换状态导致网络抖动。

如果CanNmPassiveModeEnabled为TRUE也就是处于Passive模式或者CanNm_DisableCommunication()被调用(在诊断28服务禁止通信时会调用该函数,被调用后CanNm不能发送NM报文),RMS不能发送NM报文。

如果在RMS下,NM-Timeout Timer超时,则需要重置NM-Timeout Timer,不能进入PBM。

在RMS下,需要维持CanNmRepeatMessageTime时间,即便没收到总线上的NM报文,ECU也要在这时间内周期发送NM报文,时间到了选择进入NOS还是RSS。
如果是主动唤醒进入RMS,则需要快发,快发次数到后,按慢发时间发送直到CanNmRepeatMessageTime时间结束。

从RMS退出后如果CanNm_NetworkRequest()被调用,则进入NOS,如果CanNm_NetworkRelease()被调用则进入RSS。

如果CanNmNodeDetectionEnabled为TRUE,那么在退出RMS时需要将NM报文里的Repeat Message Bit清零。

在RMS、PBM、BSM下调用CanNm_RepeatMessageRequest()不应该执行并且返回E_NOT_OK。

当CanNmDynamicPncToChannelMappingEnabled为TRUE,退出RMS时需要将Partial Network Learning Bit清零。

2、Normal Operation State

进入NOS的话允许NM报文收发(被动节点只能收)、应用报文收发、诊断报文收发、标定报文收发。ECU正常工作下处于该状态。

在该状态下只要CanNm_NetworkRequest()被调用就一直本状态,非被动模式下的节点一直发送NM报文维持网络上节点的唤醒,避免进入睡眠,被动模式的节点则不能发送NM报文但能接收NM报文。

在NOS下,NM-Timeout Timer超时,需要重新NM-Timeout Timer的计时。

在NOS下,如果CanNm_NetworkRelease()被调用则进入Ready Sleep state。

在NOS下,如果CanNmNodeDetectionEnabled为TRUE,并且收到NM报文里Repeat
Message Request Bit为1,则需要切换到RMS。节点发送的NM报文里的Repeat
Message Request Bit需要保持上一次的值(如果CanNm_RepeatMessageRequest()没有被调用的话)。

在NOS下,如果CanNmNodeDetectionEnabled为TRUE,并且CanNm_RepeatMessageRequest()被调用,则需要切换到RMS。在非被动模式下,节点发送的NM报文里的Repeat
Message Request Bit需要置为1.

3、Ready Sleep State

RSS是ECU准备休眠的过度状态,即等待总线上所有节点都停止发送NM报文协调网络上多个ECU同步进入低功耗模式确保网络一致性,该状态下NM报文不发送但能接收、应用报文能收发、诊断报文能收发、标定报文能收发,该状态下只要收到任一节点的NM报文都不能转换到PBM。

在RSS下NM-Timeout Timer超时后,即NM报文没发送也没有接收,则切换到PBM。

在RSS下CanNm_NetworkRequest()被调用则切换到NOS。

如果CanNmNodeDetectionEnabled为TRUE,并且收到NM报文里Repeat
Message Request Bit为1,则需要切换到RMS。

在RSS下,如果CanNmNodeDetectionEnabled为TRUE,并且收到NM报文里Repeat Message Request Bit为1,则需要切换到RMS。节点发送的NM报文里的Repeat Message Request Bit需要保持上一次的值(如果CanNm_RepeatMessageRequest()没有被调用的话)。

在RSS下,如果CanNmNodeDetectionEnabled为TRUE,并且CanNm_RepeatMessageRequest()被调用,则需要切换到RMS。在非被动模式下,节点发送的NM报文里的Repeat
Message Request Bit需要置为1.

在RSS下并且为被动模式,若触发PN shutdown messages需要发送,则也要发出去。

(二)、Prepare Bus-Sleep Mode

PBM是网络正常工作状态切换到总线休眠的过度状态,在该模式下说明总线已经没有NM报文了,ECU本身也停止发送报文,如果有报文在发送缓冲区中,需要尽快发送完然后停止发送,但是还能接收报文。该模式下ECU应该走下电流程处理好下电工作,比如将重要数据保存,但是如果主动节点还有功能触发就要发送NM报文唤醒整个网络然后切换为Network Mode。

进入PBM后,CanNm应该调用Nm_PrepareBusSleepMode()通知Nm。

CanNmStayInPbsEnabled为TRUE时,CanNm需要一直停留在PBM,除非ECU断点或系统重启。

在PBM下,如果接收到NM报文或CanNm_PassiveStartUp()被调用,则切换到Network Mode里并进入RSS中,如果CanNm_NetworkRequest()被调用在切换到RSS。

若从PBM调用CanNm_NetworkRequest()跳到RMS时,如果CanNmImmediateRestartEnabled为TRUE,那么NM应该快速发送第一帧,而不是周期发送,防止总线上其他节点进入休眠,这场景是某个主动节点在PBM时有突发事件需要唤醒整个网络。

PBM下CanNmWaitBusSleepTime时间超时后进入BSM。

(三)、Bus-Sleep Mode

该模式下所有报文停止发送和接收,ECU进入休眠模式或断电只有CAN收发器在工作。

总线上所有的节点CanNmTimeoutTime和CanNmWaitBusSleepTime都应该设置为一样,即RSS进入PBM的时间和PBM进入BSM的时间,所有节点都应该在统一时间窗口进入休眠模式,其中有三个因素影响时间不同步:1、总线上每个ECU的时钟精度,由于不同节点的本地时钟存在微小偏差,导致超时计时不一致。2、节点的NM任务周期调度延迟可能引发切换时间差异。3、NM PDU在发送队列中的等待时间,如总线上阻塞后可能延迟总线静默状态的判断。

CanNm进入BSM后,应该调用Nm_BusSleepMode()通知Nm。

在BSM下收到NM报文,也就是CanNm_RxIndication()被调用,CanNm应该调用Nm_NetworkStartIndication()通知Nm,但不主动切换到RMS,由上层决定是否切换到RMS,这是因为上层可能在执行关电动作如果主动切会造成冲突,若上层决定切换到RMS则调用CanNm_NetworkRequest()进入RMS。

当BSM或PBM下CanNm_PassiveStartUp()被调用,CanNm需要进入Network Mode并进入RMS,处于BSM或PBM时说明ECU已经释放网络,但又收到其他事件需要唤醒网络比如收到诊断报文需要进行诊断服务,那就直接调用CanNm_PassiveStartUp()进入RMS而不需要通知上层再调用CanNm_NetworkRequest()进入RMS。

在BSM下CanNm_NetworkRequest()被调用则进入Network Mode并进入RMS。

(四)、被动唤醒、主动唤醒、被动节点、主动节点

AUTOSAR网络管理里主动发送NM PDU的叫主动节点,不发只收的叫被动节点,如果ECU在网络上需要与其他节点配合实现某个功能,那么该ECU就该为主动节点,例如网络上在快休眠时发生本地事件需要和其他ECU配合实现,那么马上发送NM PDU唤醒相关的网络和ECU。

唤醒事件分为本地唤醒和远程唤醒,本地唤醒比如收到硬线信号KL15、识别到触摸信号等,有本地唤醒的ECU则从休眠状态醒来执行事件,远程唤醒即收到CAN报文唤醒,通常是NM报文。

主动节点的ECU使用CanNm_NetworkRequest()从BSM或PBM进入NetworkMode并且进入RMS快发报文,并通过CanNm_NetworkRequest()和CanNm_NetworkRelease()在NOS和RSS之间切换。
被动节点的ECU使用CanNm_PassiveStartUp()进入NetworkMode并且进入RMS不快发报文,然后处于RSS下不能进入NOS。

当ECU主动唤醒时使用CanNm_NetworkRequest()进入NetworkMode,被动唤醒的ECU使用CanNm_PassiveStartUp()进入NetworkMode,区别是一个进入RMS会快发报文一个进入RMS不会快发报文。
如某个主动节点ECU处于休眠状态,没有本地唤醒事件只能通过远程唤醒,收到总线上的NM PDU后ECU唤醒,初始状态为BSM,那么可以通过调用CanNm_PassiveStartUp()进入RMS,因为它是被动唤醒的不需要快发报文唤醒整个网络,但是当它处于PBM时突然检测到事件需要唤醒整个网络与其他ECU进行通信,那么可以调用CanNm_NetworkRequest()进入RMS快发报文唤醒整个网络防止其他节点进入BSM。

如果是主动唤醒,ECU发出的第一帧报文需要是NM报文,如果是被动唤醒,第一帧发出的报文不是必须要NM报文,因为此时网络上已经有其他节点唤醒,被唤醒的ECU需要快速把应用报文发出,而不是必须要等周期时间到才发出应用报文,通常OEM会提供一个参数,需要在这参数内把所有应用报文都发出去,保证功能的快速使用。

主动唤醒一般如收到诊断请求、电源模式非OFF、本地唤醒事件、网关节点收到EAR信号要转发给其他通道进行主动唤醒等。

只要不是通过CanNm_NetworkRequest()进入NetworkMode的,都是被动唤醒否则就是主动唤醒,如果进入NetMode还没调用CanNm_NetworkRequest()那么会进入RSS。

通常在BSM和PBM下不能收应用报文,所以应用报文里的电源模式为非OFF时,在BSM和PBM下不能请求网络,只有在NetworkMode下才能请求网络,当然各个客户需求都不一样这个需要提前沟通。

八、Transmission Error Handling

CanNm会监控发送的NM PDU是否发送成功。
如果CanNmPassiveModeEnabled为TRUE或者CanNmImmediateTxconfEnabled为TRUE,CanNm不会执行传输失败处理。
如果CanNmGlobalPnSupport为TRUE,并且定义了CanNmMsgTimeoutTime,当调用CanIf_Transmit发送NM PDU时,启动定时器。CanNm_TxConfirmation()被调用返回E_OK后,停止定时器。若收到E_NOT_OK或定时器超时,调用Nm_TxTimeoutException()通知Nm。若定时器超时还会调用CanSM_TxTimeoutException(),触发CAN控制器的重启。

九、其他功能

(一)、远程睡眠指示(Detection of Remote Sleep Indication)

当CanNmRemoteSleepIndEnabled为TRUE,在NOS下CanNmRemoteSleepIndTime超时后没有收到其他节点的NM PDU,则认为总线上其他节点都处于RSS,便调用Nm_RemoteSleepIndication()通知Nm,调用后如果在NOS或RSS下又收到NM PDU,便调用Nm_RemoteSleepCancellation()通知Nm总线上有节点唤醒了,如果切到RMS也同样要调用取消通知。
Nm收到通知后,可以做低功耗准备处理。
该功能一般用在网关节点。

(二)、User Data

NM PDU中user data可以被OEM自定义,比如携带诊断状态、唤醒源等。user data可以被通过两种方式写入:
如果CanNmUserDataEnabled为TRUE,上层可调用CanNm_SetUserData()给userdata写入数据。
如果CanNmComUserDataSupport为TRUE,user data的数据与Com组件的信号绑定。该方式使能后,CanNm_SetUserData()不能给userdata写数据。
无论哪种方式,读取数据只有CanNmUserDataEnabled为TRUE,可通过CanNm_GetUserData()和CanNm_GetPduData()读取user data和NM PDU。

(三)、Passive Mode

ECU在网络内分为被动节点和主动节点,在CanNm里叫被动模式和主动模式,被动模式下ECU不发送NM PDU,当CanNmPassiveModeEnabled为TRUE便使能被动模式。ECU若处于多个网络内,不能一边设置为主动模式一边设置为被动模式,必须设置为相同的模式。
通常ECU为被动节点,说明没有主动请求与其他节点交互的需求,若有则为主动节点,比如某个ECU在准备休眠时发现需要刷车钥匙,则马上在网络上发NM PDU不让相关的ECU进入休眠。

(四)、NM PDU Rx Indication

如果CanNmPduRxIndicationEnabled为TRUE,CanNm_RxIndication()被调用后CanNm需要调Nm_PduRxIndication()通知Nm,否则不调用Nm_PduRxIndication()。

(五)、State change notification

如果CanNmStateChangeIndEnabled为TRUE,每当CanNm发送状态切换,则调用Nm_StateChangeNotification()通知Nm。

(六)、Communication Control

CanNmComControlEnabled为TRUE,允许调用CanNm_EnableCommunication()和CanNm_DisableCommunication()开启关闭NM PDU,关闭NM PDU时各个超时参数停止,CanNm_RequestBusSynchronization()被调用也无效返回E_NOT_OK。

(七)、同步睡眠策略(Coordinator Synchronization Support)

如果CanNmCoordinatorSyncSupport为TRUE,允许协调网络同步进入休眠操作,场景如下:
1、CanNm当前处于NOS,或调用过Nm_CoordReadyToSleepCancellation(),收到NM PDU的CBV字节的NmCoordinatorSleepReady为1时,调用Nm_CoordReadyToSleepIndication()通知Nm,表示主协调器已请求休眠,本节点需要进入休眠流程。
2、CanNm当前处于NOS,或调用过Nm_CoordReadyToSleepIndication(),收到NM PDU的CBV字节的NmCoordinatorSleepReady为0时,调用Nm_CoordReadyToSleepCancellation()通知Nm,表示主协调器已取消休眠请求,恢复网络活动。
3、本节点调用CanNm_SetSleepReadyBit()来设置NmCoordinatorSleepReady位,立即触发一次NM PDU的发送。

(八)、Car Wakeup

NM PDU里可以添加Car Wakeup Bit,由CanNmCarWakeUpBytePosition和CanNmCarWakeUpBitPosition两个参数定义位置,如果为1表示有唤醒请求为0表示无请求。
如果CanNmCarWakeUpRxEnabled为TRUE,CanNmCarWakeUpFilterEnabled为FALSE,当收到任意NM PDU其中Car Wakeup Bit为1,便调用Nm_CarWakeUpIndication()通知Nm有唤醒请求。
如果CanNmCarWakeUpRxEnabled为TRUE,CanNmCarWakeUpFilterEnabled为TRUE,当收到任意NM PDU其中Car Wakeup Bit为1并且接收的NM PDU的Node ID为CanNmCarWakeUpFilterNodeId(预设过滤节点),便调用Nm_CarWakeUpIndication()通知Nm有唤醒请求。

该功能场景比如子网关只响应中央网关的唤醒请求,避免误唤醒。

十、CanNm触发方式发送

CanNm会在CanNm_Mainfunction()里调用CanIf_Transmit()去发送NM PDU,在发送前会调用PduR_CanNmTriggerTransmit()去获取Com模块里保存的UserData数据。

如果CanIfTxPduTriggerTransmit为TRUE,那么在调用CanIf_Transmit()入参PduInfoPtr->SduDataPtr如果为NULL则会执行触发方式发送,路径为CanIf_Transmit() -》CanIf_Transmit() -》Can_Write() -》CanIf_TriggerTransmit() -》CanNm_TriggerTransmit() -》PduR_CanNmTriggerTransmit() -》Com_TriggerTransmit()。

十一、主要代码和参数描述

(一)、主要函数

1、void CanNm_Init (const CanNm_ConfigType* cannmConfigPtr)、void CanNm_DeInit (void)
初始化和反初始化CanNm组件。

2、Std_ReturnType CanNm_PassiveStartUp(NetworkHandleType nmChannelHandle)
被动模式下或被动唤醒此函数被调用,进入Network Mode。

3、Std_ReturnType CanNm_NetworkRequest(NetworkHandleType nmChannelHandle)
主动模式下或主动唤醒此函数被调用保持总线唤醒状态。ECU需要主动唤醒或保持总线唤醒时调用该函数。

4、Std_ReturnType CanNm_NetworkRelease(NetworkHandleType nmChannelHandle)
主动模式下此函数被调用进入总线释放状态。ECU满足本地睡眠条件时调用该函数。

5、Std_ReturnType CanNm_DisableCommunication(NetworkHandleType nmChannelHandle)、Std_ReturnType CanNm_EnableCommunication(NetworkHandleType nmChannelHandle)
关闭和开启NM PDU的发送。当收到诊断28服务时被调用。

6、Std_ReturnType CanNm_SetUserData(NetworkHandleType nmChannelHandle,const uint8* nmUserDataPtr)、
Std_ReturnType CanNm_GetUserData(NetworkHandleType nmChannelHandle,const uint8* nmUserDataPtr)
设置发送NM PDU中User Data字段的数值和获取最新接收到的NM PDU中User Data字段的数值。

7、Std_ReturnType CanNm_Transmit(PduIdType TxPduId,const PduInfoType* PduInfoPtr)
NM PDU的发送都是在CanNm_MainFunction()发送的,但是上层也可以调用CanNm_Transmit()直接发送NM PDU。

8、Std_ReturnType CanNm_GetNodeIdentifier (NetworkHandleType nmChannelHandle,uint8* nmNodeIdPtr)
该函数用于获取接收 NM 报文中发送节点的ID。

9、Std_ReturnType CanNm_GetLocalNodeIdentifier (NetworkHandleType nmChannelHandle,uint8* nmNodeIdPtr)
该函数用于获取本地NodeId。

10、Std_ReturnType CanNm_RepeatMessageRequest (NetworkHandleType nmChannelHandle)
调用后要发送的NM PDU的Repeat Message Request Bit设置为1,并且如果在NOS或RSS下切换到RMS。只能在NOS和RSS下调用。

11、Std_ReturnType CanNm_RequestBusSynchronization (NetworkHandleType nmChannelHandle)
只能在NOS或RSS下调用,被Nm调用,调用后立即发送NM PDU然后一些NM的定时器重置,通常网关使用这功能,在协调睡眠流程下使用。CanNmBusSynchronizationEnabled为TRUE下有效。

12、Std_ReturnType CanNm_GetPduData (NetworkHandleType nmChannelHandle,uint8* nmPduDataPtr)
获取最近接收的NM PDU的数据。

13、Std_ReturnType CanNm_GetState (NetworkHandleType nmChannelHandle,Nm_StateType* nmStatePtr,Nm_ModeType* nmModePtr)
获取当前CanNm的状态和模式。

14、Std_ReturnType CanNm_CheckRemoteSleepIndication (NetworkHandleType nmChannelHandle,boolean* nmRemoteSleepIndPtr)
只能在NOS或RSS下调用,查询CanNm是否触发了远程睡眠指示。CanNmRemoteSleepIndEnabled为TRUE下有效。

15、Std_ReturnType CanNm_SetSleepReadyBit (NetworkHandleType nmChannelHandle,boolean nmSleepReadyBit)
设置要发送的NM PDU中NM Coordinator Sleep Ready bit。CanNmCoordinatorSyncSupport为TRUE下有效。

16、Std_ReturnType CanNm_PnLearningRequest (NetworkHandleType nmChannelHandle)
设置要发送NM PDU的Repeat Message Request Bit和Partial Network Learning Bit为1,让所有节点强制进入PNC学习阶段,这个需要节点支持Dynamic PNC-to-channel-mapping功能。CanNmDynamicPncToChannelMappingSupport为TRUE下有效。
学习结果通过ComM_CurrentPncMode()通知ComM。

17、Std_ReturnType CanNm_ActivateTxPnShutdownMsg (NetworkHandleType nmChannelHandle)、
Std_ReturnType CanNm_DeactivateTxPnShutdownMsg (NetworkHandleType nmChannelHandle)
将要发送NM PDU的PNSR bit设置为1或0,即是否激活PN shutdown message。CanNmSynchronizedPncShutdownEnabled为TRUE下有效。

19、void CanNm_TxConfirmation (PduIdType TxPduId,Std_ReturnType result)
回调函数,CanIf调用此函数告诉CanNm NM PDU是否发送成功。

20、void CanNm_RxIndication (PduIdType RxPduId,const PduInfoType* PduInfoPtr)
回调函数,CanIf调用此函数告诉CanNm NM PDU接收到。

21、void CanNm_ConfirmPnAvailability (NetworkHandleType nmChannelHandle)
被CanIf调用,用来通知CanNm PN滤波功能已开启,收到的是特定ID帧。只能CanNmGlobalPnSupport为TRUE下有效。

22、Std_ReturnType CanNm_TriggerTransmit (PduIdType TxPduId,PduInfoType* PduInfoPtr)
触发方式发送,被CanIf_TriggerTransmit()调用,然后CanNm_TriggerTransmit()里调用PduR_CanNmTriggerTransmit()再调用Com_TriggerTransmit(),Com里更新NM PDU的User data值。
当CanNm调用CanIf_Transmit()传入参数SduDataPtr为NULL时,CanDrv会调用CanIf_TriggerTransmit(),CanIf里再根据HANDLE判断出上层是CanNm,调用CanNm_TriggerTransmit()。
CanNmComUserDataSupport为TRUE下有效。

23、void CanNm_MainFunction (void)
周期任务函数。

(二)、主要时间参数

1、CanNmMsgCycleTime
CanNmPassiveModeEnabled为FALSE下有效,NM PDU周期发送的时间。

2、CanNmImmediateNmCycleTime
CanNmImmediateNmTransmissions大于0和CanNmPassiveModeEnabled为FALSE下有效,进入RMS快发NM PDU时的周期时间,触发主动唤醒时使用。

3、CanNmImmediateNmTransmissions
触发主动唤醒时使用,进入RMSNM PDU快发的次数,快发次数到了后再切回CanNmMsgCycleTime周期发送。

4、CanNmRepeatMessageTime
进入RMS后在RMS中的持续时间,需要满足CanNmRepeatMessageTime = n * CanNmMsgCycleTime和CanNmRepeatMessageTime > CanNmImmediateNmTransmissions * CanNmImmediateNmCycleTime。

5、CanNmTimeOutTime
CanNm处于RSS下NM PDU没有发送也没有接收,CanNmTimeOutTime后切到PBM。

6、CanNmWaitBusSleepTime
CanNmStayInPbsEnabled为FALSE下有效,CanNm处于PBM下NM PDU没有发送也没有接收,CanNmWaitBusSleepTime后切到BSM。

7、CanNmRemoteSleepIndTime
CanNmRemoteSleepIndEnabled为TRUE下有效,在NOS下CanNmRemoteSleepIndTime超时后没有收到其他节点的NM PDU,则认为总线上其他节点都处于RSS,便调用Nm_RemoteSleepIndication()通知Nm。

8、CanNmMsgTimeoutTime
CanNmPassiveModeEnabled和CanNmImmediateTxConfEnabled为FALSE下有效,CanNmPnEnabled和CanNmGlobalPnSupport为TRUE下有效,用来监视NM PDU的发送,当调用CanIf_Transmit发送NM PDU时,启动定时器。CanNm_TxConfirmation()被调用返回E_OK后,停止定时器。若收到E_NOT_OK或定时器超时,调用Nm_TxTimeoutException()通知Nm。若定时器超时还会调用CanSM_TxTimeoutException(),触发CAN控制器的重启。

9、CanNmMsgCycleOffset
CanNmPassiveModeEnabled和CanNmPnHandleMultipleNetworkRequests为FALSE下有效,如果被动唤醒进入RMS,那要在CanNmMsgCycleOffset时间后发出NM PDU第一帧。为了防止总线所有ECU同一时间发出NM PDU导致总线阻塞。

10、CanNmMsgReducedTime
CanNmBusLoadReductionEnabled和CanNmBusLoadReductionActive为TRUE,CanNmPassiveModeEnabled为FALSE下有效,用于降低总线负载机制,使能时,ECU使用该参数和CanNmMsgCycleTime周期发送NM PDU,保证总线上同一时间只有两个节点在发送NM PDU。

11、TWakeUpTimeOut
AUTOSAR规范里没有该参数,通常是OEM提供,当ECU不是被NM PDU唤醒时,总线上也没有NM PDU,那么在TWakeUpTimeOut后ECU还是处于BSM,ECU将进入休眠,TWakeUpTimeOut内如果有收到非NM PDU,计数器将刷新。

12、TStartNmTx
AUTOSAR规范里没有该参数,通常是OEM提供,进入RMS快发报文时第一帧NM PDU发出的最大允许时间。

13、TStartAppFrame
AUTOSAR规范里没有该参数,通常是OEM提供,第一帧应用报文发出的最大允许时间。

(三)、主要配置参数

1、CanNmBusLoadReductionEnabled
是否使能总线负载降低机制,如果CanNmPassiveModeEnabled和CanNmGlobalPnSupport为TRUE下不能使能。

2、CanNmBusSynchronizationEnabled
为TRUE后允许使用CanNm_RequestBusSynchronization()用来进行同步功能。通常网关节点使用此功能。

3、CanNmComControlEnabled
为TRUE下允许使用CanNm_DisableCommunication()和CanNm_EnableCommunication()。

4、CanNmCoordinatorSyncSupport
为TRUE后同步睡眠策略有效,需要处理NM PDU中的NmCoordinatorSleepReady Bit。

6、CanNmDynamicPncToChannelMappingSupport
为TRUE后,允许使用CanNm_PnLearningRequest()。

7、CanNmGlobalPnSupport
是否使用PNC功能,与CanNmBusLoadReductionEnabled不能同时为TRUE。

8、CanNmImmediateRestartEnabled
CanNmPassiveModeEnabled为FALSE下有效,CanNmImmediateRestartEnabled为TRUE后,从PBM跳到RMS无需等待周期而立即发送出NM PDU,为了本ECU有事件唤醒时能快速唤醒整个网络。

9、CanNmImmediateTxconfEnabled
CanNmPassiveModeEnabled为FALSE下有效。CanNmImmediateTxconfEnabled为TRUE后NM PDU的发送不需要等CanNm_TxConfirmation()确认,每次发完便默认发送成功。

10、CanNmPassiveModeEnabled
ECU如果是被动节点需要使能,使能只能收NM PDU不能发送NM PDU。

11、CanNmPduRxIndicationEnabled
CanNmPduRxIndicationEnabled为TRUE后,当收到NM PDU CanNm调用CanNm_RxIndication(),CanNm_RxIndication()里会调用Nm_PduRxIndication(),否则不调用。

12、CanNmRemoteSleepIndEnabled
使能后开启远程睡眠指示功能。

13、CanNmStateChangeIndEnabled
如果CanNmStateChangeIndEnabled为TRUE,每当CanNm发送状态切换,则调用Nm_StateChangeNotification()通知Nm。

14、CanNmUserDataEnabled
CanNmUserDataEnabled为TRUE下CanNm_SetUserData()和CanNm_GetUserData()和CanNm_GetPduData()允许使用,允许操作NM PDU中的User Data。

15、CanNmActiveWakeupBitEnabled
CanNmPassiveModeEnabled为FALSE下有效,CanNmActiveWakeupBitEnabled使能后NM PDU中的ActiveWakeup Bit有效。

16、CanNmAllNmMessagesKeepAwake
为TRUE后,收到任意NM PDU都保持唤醒,为FALSE下并且CanNmPnEnabled为TRUE,只有收到有效的PNC才保持唤醒。网关节点CanNmAllNmMessagesKeepAwake需要为TRUE。

17、CanNmBusLoadReductionActive
为TRUE激活总线负载降低机制。

18、CanNmCarWakeUpBitPosition
CanNmCarWakeUpRxEnabled为TRUE下有效,定义NM PDU中Car Wakeup Bit位置。

19、CanNmCarWakeUpBytePosition
CanNmCarWakeUpRxEnabled为TRUE下有效,定义NM PDU中Car Wakeup Bit位置。

20、CanNmCarWakeUpFilterEnabled
CanNmCarWakeUpRxEnabled为TRUE下有效,为TRUE后收到的NM PDU的CANID需要与CanNmCarWakeUpFilterNodeId相符才提取Car Wakeup Bit。

21、CanNmCarWakeUpFilterNodeId
CanNmCarWakeUpRxEnabled和CanNmCarWakeUpFilterEnabled为TRUE下有效,为TRUE后收到的NM PDU的CANID需要与CanNmCarWakeUpFilterNodeId相符才提取Car Wakeup Bit。

22、CanNmCarWakeUpRxEnabled
为TRUE后,使能Car WakeUp功能,NM PDU中存在Car Wakeup Bit,位置根据CanNmCarWakeUpBitPosition和CanNmCarWakeUpBytePosition来定义,如果Car Wakeup Bit有置1,就调用Nm_CarWakeUpIndication()通知Nm。如果CanNmCarWakeUpFilterEnabled为TRUE后,只有CANID与CanNmCarWakeUpFilterNodeId相符才处理Car Wakeup Bit。

23、CanNmDynamicPncToChannelMappingEnabled
CanNmPnEnabled为TRUE下有效,CanNmDynamicPncToChannelMappingEnabled为TRUE时CanNm_PnLearningRequest ()允许使用,开启Dynamic PNC-to-channel-mapping功能。

24、CanNmNodeDetectionEnabled
CanNmNodeIdEnabled为TRUE和CanNmPassiveModeEnabled为FALSE下有效。为TRUE后影响NM PDU中的Repeat Message Bit逻辑,具体见前几章。

25、CanNmNodeId
CanNmNodeIdEnabled为TRUE下有效,为本地节点的NM PDU CANID,用于填充NM PDU中SNI字段。

26、CanNmNodeIdEnabled
为TRUE后,CanNm_GetNodeIdentifier()允许使用,允许提取接收到的NM PDU中的SNI字段。

27、CanNmPduCbvPosition
指示NM PDU中的CBV字段在BYTE0、BYTE1还是不使用。

28、CanNmPduNidPosition
指示NM PDU中的SNI字段在BYTE0、BYTE1还是不使用。

29、CanNmPnEnabled
CanNmGlobalPnSupport为TRUE下有效,指示是否开启PN功能。

30、CanNmPnHandleMultipleNetworkRequests
CanNmGlobalPnSupport为TRUE下有效。为TRUE的话,CanNm在NetworkMode下,调用了CanNm_NetworkRequest()将切换到RMS并且以CanNmImmediateNmCycleTime为周期快发报文。
该功能比如网关需同时处理多个子网(如动力域、车身域)的唤醒请求,各子网调用 CanNm_NetworkRequest() 后,网关进入 RMS 并快发 NM-PDU,维持所有相关子网的激活状态‌。

31、CanNmRepeatMsgIndEnabled
为TRUE下当收到的NM PDU中Repeat Message Request Bit为1的话调用Nm_RepeatMessageIndication()通知Nm。
CanNmDynamicPncToChannelMappingEnabled和CanNmNodeDetectionEnabled和CanNmDynamicPncToChannelMappingEnabled为TRUE,CanNmPassiveModeEnabled为FALSE下有效。

32、CanNmStayInPbsEnabled
为TRUE后,ECU在PBM下就算CanNmWaitBusSleepTime超时了也不跳到BSM。

33、CanNmSynchronizedPncShutdownEnabled
CanNmPnEnabled为TRUE下有效。为TRUE的话CanNm_ActivateTxPnShutdownMsg()和CanNm_DeactivateTxPnShutdownMsg()允许使用,NM PDU中的PNSR Bit会处理。

十二、DaVinci Configurator主要配置

(一)、CanNmGlobalConfig
在这里插入图片描述在这里插入图片描述Bus Load Reduction Enabled:是否使能Bus Load Reduction功能。
Bus Synchronization Enabled:是否使能Bus Synchronization功能。
Can If Range Config DLC Check:是否使能对收到的NM PDU进行DLC检查,有些项目可能长度不是8字节的,所以需要进行DLC检查。
Com Control Enabled:是否开启通信控制API。
Com User Data Support:是否上层如Com处理NM PDU中的User Data。
Coordinator Sync Support:是否使能Coordinator Synchronization功能。
Immediate Restart Enabled:使能后从PBM跳到RMS无需等待周期而立即发送出NM PDU,为了本ECU有事件唤醒时能快速唤醒整个网络。
Immediate Txconf Enabled:使能后NM PDU的发送不需要等CanNm_TxConfirmation()确认,每次发完便默认发送成功。
Main Function Period:CanNm_MainFunction()的运行周期。
Passive Mode Enabled:是否使能被动模式,是被动节点需要使能该按钮。
Pn Reset Time:AUTOSAR最新规范里R23-11该参数是Nm里配置,但示例用的AUTOSAR代码还是R4.4.0的所以显示的配置在CanNm里。对EIRA和ERA的PNC请求作超时判断。
Remote Sleep Ind Enabled:是否开启Detection of Remote Sleep Indication功能。
Repeat Msg Ind Enabled:开启的话当收到的NM PDU中Repeat Message Request Bit为1的话调用Nm_RepeatMessageIndication()通知Nm。

(二)、CanNmPnInfo
在这里插入图片描述
定义NM PDU中PNC信息如位置。

(三)、CanNmChannelConfigs
在这里插入图片描述
定义NM Channel信息,普通节点只有一个网段,所以只定义一路Channel。
这里定义NM的TX和RX PDU的映射,这里有三个PDU,分别是RxPdu、TxPdu、UserDataTxPdu,映射来自EcuC里定义的Pdus,注意EcuC里的UserDataTxPdu不需要映射CanFrame,因为UserData是被包含在NM PDU里的。而接收的NM PDU ID通常是一段范围的ID,需要在CanIf里给相应的Nm RxPdu设置一段范围如
在这里插入图片描述
在这里插入图片描述
如下是NM通道的配置:
在这里插入图片描述在这里插入图片描述如上是设置AWB位是否使能、是否开启CanNmAllNmMessagesKeepAwake、是否开启Bus Load Reduction机制、CarWakeUpBit的位置、是否接收CarWakeUpBit、是否开启通信控制、PNIBit是否处理、快发报文的周期和次数、CanNmMsgCycleTime时间、是否开启PN功能、RMS持续时间、CanNmTimeOutTime时间、CanNmWaitBusSleepTime时间等。

十三、使用范例

无。

十四、参考资料

AUTOSAR_CP_SWS_CANInterface
AUTOSAR_CP_SWS_CANStateManager
AUTOSAR_EXP_LayeredSoftwareArchitecture
AUTOSAR_FO_PRS_NetworkManagementProtocol
AUTOSAR_FO_TR_Glossary
AUTOSAR_FO_RS_NetworkManagement
AUTOSAR_CP_SWS_COMManager
AUTOSAR_CP_EXP_ModeManagementGuide
AUTOSAR_CP_SWS_NetworkManagementInterface
AUTOSAR_CP_SWS_CANNetworkManagement
AUTOSAR_CP_SWS_CANTransceiverDriver
TechnicalReference_CanNm
ISO17356
can2.0
can_fd_spec


总结

本文文字描述多点,更像是本人的使用笔记,仅供参考,如有不对地方欢迎指教。

Logo

智能硬件社区聚焦AI智能硬件技术生态,汇聚嵌入式AI、物联网硬件开发者,打造交流分享平台,同步全国赛事资讯、开展 OPC 核心人才招募,助力技术落地与开发者成长。

更多推荐