AUTOSAR SAE J1939 网络管理模块详解
目录
1. 概述
1.1 J1939网络管理简介
SAE J1939是一种广泛应用于重型车辆、农业机械和工程机械的CAN总线通信协议。与传统AUTOSAR网络管理不同,J1939网络管理的主要目标不是处理ECU的休眠和唤醒,而是为每个ECU分配唯一的网络地址。
在J1939网络中,每个ECU通过发送AddressClaimed消息来声明其网络地址。如果多个ECU尝试使用相同地址,具有更高优先级的ECU将保留此地址,而其他ECU必须放弃地址并发送CannotClaimAddress消息。优先级由64位的NAME值决定,NAME值越小优先级越高。
J1939标准定义了地址范围从0到253(0x00-0xFD)的可用网络地址,其中254(0xFE)被保留用作空地址(NULL),255(0xFF)用作全局地址。
1.2 J1939Nm在AUTOSAR中的定位
AUTOSAR J1939 Network Management模块(J1939Nm)实现了J1939协议中的网络管理功能,主要负责:
- 处理AddressClaimed和CannotClaimAddress消息的发送与接收
- 管理网络状态转换和通知
- 处理地址冲突情况
- 响应地址请求
- 确保ECU在地址声明前或地址丢失后不发送其他消息
J1939Nm是AUTOSAR通信栈的基础软件模块,位于通信层,与其他模块如通信管理器(ComM)、基础软件模式管理器(BswM)、网络管理接口(Nm)等协同工作。
2. 架构设计
2.1 J1939Nm模块架构
J1939Nm模块在AUTOSAR分层架构中的位置及其与其他模块的关系如下图所示:
2.2 与其他模块的交互
J1939Nm模块与其他AUTOSAR基础软件模块有以下主要接口:
-
提供的接口:
- 初始化接口:
J1939Nm_Init()
、J1939Nm_DeInit()
- 网络管理接口:
J1939Nm_NetworkRequest()
、J1939Nm_NetworkRelease()
、J1939Nm_GetState()
- 地址管理接口:
J1939Nm_PassiveStartUp()
、J1939Nm_GetBusOffDelay()
- 回调接口:
J1939Nm_RxIndication()
、J1939Nm_TxConfirmation()
、J1939Nm_RequestIndication()
- 初始化接口:
-
调用的接口:
- CAN接口:
CanIf_Transmit()
- 网络管理通知:
Nm_StateChangeNotification()
、Nm_NetworkMode()
、Nm_BusSleepMode()
- 模式管理通知:
BswM_J1939Nm_StateChangeNotification()
- 诊断接口:
Dem_SetEventStatus()
、Det_ReportError()
- CAN接口:
J1939Nm模块的主要功能包括:
- 管理J1939网络地址声明
- 处理地址冲突
- 响应地址请求
- 确保ECU在地址声明前或地址丢失后不发送消息
从架构上看,J1939Nm位于通信层,直接与CanIf、Nm、J1939Rm等模块交互,同时也接收来自服务层的ComM和BswM的请求和通知。这种分层设计确保了模块间的清晰边界和标准化接口。
3. 状态管理
3.1 网络管理状态机
J1939Nm模块实现了一个状态机来管理ECU在J1939网络中的状态。下图展示了J1939Nm的内部状态转换:
3.2 状态转换流程
J1939Nm状态机包含以下主要状态:
-
SleepMode(NM_MODE_BUS_SLEEP):
- ECU初始化后的默认状态
- 此状态下ECU的网络功能处于休眠状态
- 通过
J1939Nm_Init()
进入此状态
-
NetworkMode(NM_MODE_NETWORK):
- 包含Offline和NormalOperation两个子状态
- 通过
J1939Nm_NetworkRequest()
从SleepMode切换到此状态 - 切换时,会触发AddressClaimed消息的发送并通知Nm接口
-
Offline状态:
-
Claiming子状态:
- 当配置了启动延迟(
J1939NmNodeStartUpDelay
)时,节点进入此状态 - 发送AddressClaimed消息后等待250ms,检测是否有地址冲突
- 延时结束后自动切换到NormalOperation状态
- 当配置了启动延迟(
-
AcLost子状态:
- 当收到更高优先级(NAME值更小)的相同地址声明时,进入此状态
- 进入该状态后发送CannotClaimAddress消息(源地址=0xFE)
- 通知BswM和Nm接口当前状态为OFFLINE
-
-
NormalOperation(NM_STATE_NORMAL_OPERATION):
- ECU已成功获取网络地址,可以正常通信
- 如果未配置启动延迟,在网络请求后直接进入此状态
- 如果配置了启动延迟,在Claiming状态250ms延时后进入此状态
状态转换过程中的关键点:
- 每次状态变化都会通知BswM(通过
BswM_J1939Nm_StateChangeNotification()
) - 通道级别的状态变化会通知Nm接口(通过
Nm_StateChangeNotification()
) - 从NetworkMode返回SleepMode由
J1939Nm_NetworkRelease()
触发 - 地址冲突会导致从NormalOperation切换到AcLost状态
这种状态管理机制确保了ECU在J1939网络中按照标准流程进行地址声明和冲突处理,并通过标准接口通知其他AUTOSAR模块当前网络状态。
4. 地址管理
4.1 地址声明机制
J1939网络中的地址管理通过AddressClaimed消息实现。下图展示了J1939Nm模块处理地址声明的序列流程:
地址声明的主要流程包括:
-
启动阶段地址声明:
- 当ComM请求网络服务时,调用链为:ComM → Nm →
J1939Nm_NetworkRequest()
- J1939Nm更新状态为NetworkMode并通知Nm接口
- 根据
J1939NmNodeStartUpDelay
配置,设置NodeChannel状态 - 通过CanIf发送AddressClaimed消息
- 如果配置了启动延迟,启动250ms计时器,延时后切换到NormalOperation状态
- 当ComM请求网络服务时,调用链为:ComM → Nm →
-
接收地址声明处理:
- 当接收到外部设备的AddressClaimed消息时,通过
J1939Nm_RxIndication()
处理 - 比较接收到的源地址与本地配置的地址和NAME优先级
- 如果地址相同但接收到的NAME优先级更高,本地ECU切换到AcLost状态并发送CannotClaimAddress
- 如果地址相同但本地优先级更高,重新发送本地的AddressClaimed消息
- 如果地址不同,记录外部节点信息
- 当接收到外部设备的AddressClaimed消息时,通过
-
地址请求响应:
- 当接收到地址请求消息(RQST,PGN=0x0EA00)时,J1939Rm调用
J1939Nm_RequestIndication()
- 根据当前NodeChannel状态决定响应方式:
- 如果处于NormalOperation或Claiming状态,发送AddressClaimed消息
- 如果处于AcLost状态,发送CannotClaimAddress消息
- 当接收到地址请求消息(RQST,PGN=0x0EA00)时,J1939Rm调用
-
网络关闭流程:
- 当ComM释放网络时,调用链为:ComM → Nm →
J1939Nm_NetworkRelease()
- J1939Nm更新状态为SleepMode
- 通知Nm接口和BswM状态变化(NM_STATE_BUS_SLEEP)
- 当ComM释放网络时,调用链为:ComM → Nm →
4.2 地址冲突处理
当两个或多个ECU尝试使用相同地址时,会发生地址冲突。J1939Nm通过以下机制处理地址冲突:
-
冲突检测:
- 接收到与本地地址相同的AddressClaimed消息时,比较NAME优先级
- NAME是一个64位标识符,数值越小优先级越高
-
冲突解决:
- 如果本地NAME优先级更高,J1939Nm重新发送AddressClaimed消息
- 如果外部设备NAME优先级更高,本地ECU进入AcLost状态并发送CannotClaimAddress消息
-
随机延时:
- 为避免总线负载峰值和重复冲突,在发送CannotClaimAddress消息前添加随机延时
- 随机延时基于节点NAME计算,确保不同节点使用不同的延时值
-
BusOff处理:
- CAN总线上的BusOff事件后恢复也使用随机延时
- 通过
J1939Nm_GetBusOffDelay()
获取延时值
4.3 地址请求响应
J1939协议允许节点请求网络上其他节点的地址信息。J1939Nm通过以下方式处理地址请求:
-
请求处理:
- J1939Rm收到请求消息后调用
J1939Nm_RequestIndication()
- 请求可以是全局的(DA=0xFF)或针对特定地址的
- J1939Rm收到请求消息后调用
-
响应生成:
- 根据当前状态决定响应类型:
- NormalOperation或Claiming状态:发送AddressClaimed
- AcLost状态:发送CannotClaimAddress
- 根据当前状态决定响应类型:
-
响应传输:
- 所有响应都是全局发送的(DA=0xFF)
- 在AcLost状态发送响应前添加随机延时
通过这些机制,J1939Nm确保了ECU在J1939网络中可以正确声明地址、处理地址冲突并响应地址请求,符合SAE J1939-81标准规范。
5. 配置模型
5.1 配置结构
J1939Nm模块的配置结构如下图所示:
5.2 配置参数
J1939Nm模块的配置分为以下几个主要部分:
-
模块级配置:
- J1939NmGeneral:包含模块通用配置
J1939NmDevErrorDetect
:开发错误检测开关J1939NmMainFunctionPeriod
:主函数周期时间J1939NmVersionInfoApi
:版本信息API开关J1939NmBusOffDelayTickPeriod
:总线关闭延迟周期J1939NmUserCallout
:用户回调函数开关
- J1939NmGeneral:包含模块通用配置
-
配置集:
- J1939NmConfigSet:包含网络配置
J1939NmSharedAddressSpace
:共享地址空间配置J1939NmChannel
:通道配置J1939NmNode
:本地节点配置J1939NmExternalNode
:外部节点配置
- J1939NmConfigSet:包含网络配置
-
共享地址空间配置:
- 用于网关应用场景,允许不同J1939通道间的地址协调
- 定义哪些通道属于同一个地址空间
-
通道配置:
J1939NmChannelId
:通道标识符J1939NmChannelEnable
:通道启用标志J1939NmChannelUsesAddressArbitration
:是否使用地址仲裁J1939NmTxPdu
/J1939NmRxPdu
:发送/接收PDU配置ComMChannelRef
:对应的ComM通道引用
-
节点配置:
-
J1939NmNode:本地节点配置
J1939NmNodeNameXxx
参数:构成64位J1939 NAMEJ1939NmNodePreferredAddress
:节点首选源地址J1939NmNodeStartUpDelay
:是否启用启动延迟J1939NmNodeSpecificDemEventParameterRefs
:诊断事件参数引用
-
J1939NmExternalNode:外部节点配置(用于网关场景)
- 结构与本地节点类似,用于在多个通道间转发外部节点的地址声明
-
-
PDU配置:
- J1939NmTxPdu:发送PDU配置,用于AddressClaimed消息发送
- J1939NmRxPdu:接收PDU配置,用于接收外部AddressClaimed消息
J1939Nm配置模型的设计支持多节点、多通道场景,并能处理网关应用中的地址协调。配置参数允许调整模块行为,如是否启用地址仲裁、是否使用启动延迟等,以适应不同应用需求。
6. 总结
AUTOSAR SAE J1939网络管理模块(J1939Nm)实现了J1939协议中的网络管理功能,专注于地址管理而非传统的ECU休眠和唤醒管理。其主要特点和优势包括:
- 标准合规性:完全符合SAE J1939-81网络管理标准
- 灵活配置:支持多种配置选项,适应不同应用场景
- 网关支持:通过共享地址空间支持网关应用中的地址协调
- 完整状态管理:提供详细的状态转换和通知机制
- 健壮的冲突处理:通过优先级比较和随机延时处理地址冲突
J1939Nm模块作为AUTOSAR通信栈的重要组成部分,为重型车辆、农业机械和工程机械等应用领域提供了标准化的网络管理解决方案,确保不同厂商的ECU可以在同一网络中正确协作。
通过本文介绍的架构设计、状态管理、地址管理和配置模型,开发者可以更好地理解和使用J1939Nm模块,实现基于AUTOSAR标准的J1939网络应用。