AUTOSAR CAN状态管理器(CanSM)详解
目录
1. 概述
1.1 CanSM模块的作用与目标
AUTOSAR CAN状态管理器(CanSM)是AUTOSAR通信栈中的关键模块,位于通信服务层,主要负责CAN网络状态的管理和转换。CanSM模块控制CAN控制器和CAN收发器的工作模式,处理CAN网络的各种通信状态(如全通信、静默通信和无通信),并监控和处理总线关闭(Bus-Off)事件。
本文档基于AUTOSAR CP Release 4.4.0规范,详细解析CanSM模块的架构、状态机、配置结构和关键API,帮助开发者更好地理解和实现AUTOSAR CAN状态管理功能。
1.2 模块依赖关系
CanSM模块与其他AUTOSAR模块的依赖关系如下:
- 与ComM模块的依赖:
- ComM模块通过ComM_BusSM接口请求CAN网络的通信模式变更
- CanSM接收请求后执行相应的状态转换,控制底层CAN硬件
- 与CanIf模块的依赖:
- CanSM通过CanIf_CanSm接口控制CAN控制器和收发器的工作模式
- CanIf模块通知CanSM关于CAN外设的事件,如总线关闭(Bus-Off)事件
- 与BswM模块的依赖:
- CanSM通过BswM_CanSM_CurrentState接口向BswM模块通知CAN网络的当前状态
- BswM模块可以根据CAN网络状态进行模式管理决策
- 与系统服务模块的依赖:
- EcuM模块负责初始化CanSM
- SchM模块调用CanSM的主函数
- Dem模块接收CanSM的错误状态报告
- Det模块用于开发错误检测和报告
/* CanSM模块与ComM模块的接口示例 */
void CanSM_RequestComMode(NetworkHandleType NetworkHandle, ComM_ModeType ComM_Mode)
{
/* 参数检查 */
if (CanSM_State != CANSM_INITIALIZED) {
Det_ReportError(CANSM_MODULE_ID, CANSM_INSTANCE_ID,
CANSM_REQUESTCOMMODE_ID, CANSM_E_UNINIT);
return E_NOT_OK;
}
/* 触发状态机转换 */
switch (ComM_Mode) {
case COMM_FULL_COMMUNICATION:
/* 触发状态机转换到全通信 */
/* ... */
break;
case COMM_SILENT_COMMUNICATION:
/* 触发状态机转换到静默通信 */
/* ... */
break;
case COMM_NO_COMMUNICATION:
/* 触发状态机转换到无通信 */
/* ... */
break;
default:
Det_ReportError(CANSM_MODULE_ID, CANSM_INSTANCE_ID,
CANSM_REQUESTCOMMODE_ID, CANSM_E_INVALID_COMM_MODE);
return E_NOT_OK;
}
return E_OK;
}
2. 模块架构
2.1 模块位置与接口
CanSM模块作为AUTOSAR BSW架构中的通信服务层模块,是连接通信管理器(ComM)和CAN接口层(CanIf)的桥梁。CanSM模块主要负责:
-
CAN网络状态管理:
- 管理CAN网络的三种通信状态:全通信、静默通信和无通信
- 根据ComM请求执行状态转换
- 通知BswM关于CAN网络的当前状态
-
CAN控制器和收发器控制:
- 通过CanIf模块控制CAN控制器的工作模式(STARTED、STOPPED)
- 控制CAN收发器的工作模式(NORMAL、STANDBY)
- 协调多个CAN控制器和收发器的状态同步
-
总线关闭(Bus-Off)处理:
- 检测和处理CAN控制器的总线关闭事件
- 实施可配置的总线关闭恢复策略
- 支持基于时间或TX确认的恢复机制
2.2 主要依赖模块
CanSM模块与下列AUTOSAR模块有紧密的交互:
-
ComM(通信管理器):
- 为CanSM提供网络通信模式的请求
- 接收CanSM关于通信模式变更的确认
-
CanIf(CAN接口):
- 提供CAN控制器和收发器的控制接口
- 上报总线关闭事件给CanSM
- 管理PDU(协议数据单元)的发送模式
-
BswM(BSW模式管理器):
- 接收CanSM的网络状态通知
- 基于CAN网络状态执行模式管理决策
-
EcuM(ECU管理器):
- 初始化CanSM模块
- 处理与唤醒相关的功能
-
Dem(诊断事件管理器):
- 接收CanSM的故障事件报告
- 管理与CAN网络相关的诊断事件
3. 功能详解
3.1 网络状态管理
CanSM模块为每个配置的CAN网络实现一个状态机,用于管理网络状态的转换。状态机定义了多个状态和触发器,用于控制CAN网络在不同通信模式之间的切换。
状态机的主要状态包括:
-
未初始化状态(CANSM_BSM_NOT_INITIALIZED):
- 系统上电后的初始状态
- 此状态下CAN网络不可用
- 调用CanSM_Init后离开此状态
-
无通信状态(CANSM_BSM_S_NOCOM):
- CAN控制器处于STOPPED状态
- CAN收发器处于STANDBY状态
- 不能收发CAN报文,低功耗状态
-
全通信状态(CANSM_BSM_S_FULLCOM):
- CAN控制器处于STARTED状态
- CAN收发器处于NORMAL状态
- 可以正常收发CAN报文
- 网络完全活动状态
-
静默通信状态(CANSM_BSM_S_SILENTCOM):
- CAN控制器处于STARTED状态
- CAN收发器处于NORMAL状态
- 可以接收报文但不发送(TX离线)
- 通常用于准备进入睡眠状态
状态转换的主要流程:
-
上电和初始化:
- PowerOn后状态机处于CANSM_BSM_NOT_INITIALIZED状态
- 调用CanSM_Init触发转换到CANSM_BSM_S_NOT_INITIALIZED状态
- 然后自动转换到CANSM_BSM_S_NOCOM状态
-
进入全通信:
- 状态机从CANSM_BSM_S_NOCOM转换到CANSM_BSM_S_FULLCOM
- CanSM设置CAN控制器为STARTED模式
- CanSM设置CAN收发器为NORMAL模式
- 设置PDU组为ONLINE模式以启用发送
-
进入静默通信:
- 状态机从CANSM_BSM_S_FULLCOM转换到CANSM_BSM_S_SILENTCOM
- 保持CAN控制器为STARTED模式
- 保持CAN收发器为NORMAL模式
- 设置PDU组为TX_OFFLINE模式以禁止发送
-
进入无通信:
- 状态机转换到CANSM_BSM_S_NOCOM状态
- CanSM设置CAN控制器为STOPPED模式
- CanSM设置CAN收发器为STANDBY模式
- 完全禁止CAN通信
-
反初始化:
- 调用CanSM_DeInit触发状态机回到CANSM_BSM_NOT_INITIALIZED状态
- 必须确保所有CAN网络都处于CANSM_NO_COMMUNICATION状态
/* CAN网络状态转换示例代码 */
Std_ReturnType CanSM_SetNetworkMode(NetworkHandleType Network, CanSM_NetworkModeType TargetMode)
{
Std_ReturnType result = E_NOT_OK;
switch (TargetMode) {
case CANSM_FULL_COMMUNICATION:
/* 启动CAN控制器 */
result = CanIf_SetControllerMode(
CanSM_Networks[Network].ControllerId,
CANIF_CS_STARTED);
if (result == E_OK) {
/* 设置收发器模式 */
result = CanIf_SetTrcvMode(
CanSM_Networks[Network].TransceiverId,
CANIF_TRCV_MODE_NORMAL);
if (result == E_OK) {
/* 启用PDU组 */
result = CanIf_SetPduMode(
CanSM_Networks[Network].ControllerId,
CANIF_ONLINE);
/* 更新当前模式 */
if (result == E_OK) {
CanSM_Networks[Network].CurrentState = CANSM_BSM_S_FULLCOM;
/* 通知BswM */
BswM_CanSM_CurrentState(Network, CANSM_BSWM_FULL_COMMUNICATION);
}
}
}
break;
case CANSM_NO_COMMUNICATION:
/* 实现进入无通信模式的代码 */
/* ... */
break;
default:
/* 处理无效模式 */
break;
}
return result;
}
3.2 总线关闭处理
总线关闭(Bus-Off)是CAN控制器进入的一种错误状态,当发生严重的总线错误时触发。CanSM模块实现了复杂的总线关闭恢复机制:
-
总线关闭检测:
- CanIf模块检测到总线关闭事件
- 通过回调函数CanSM_ControllerBusOff通知CanSM
- 触发状态机进入CANSM_BSM_S_SILENTCOM_BOR状态
-
恢复策略类型:
- 基于时间的恢复:等待配置的时间后尝试重启CAN控制器
- 基于TX确认的恢复:等待TX确认后再重启CAN控制器
- 分级恢复:L1和L2两个恢复等级,L2拥有更长的恢复时间
-
恢复过程:
- 当发生总线关闭时,CanSM停止CAN控制器
- 等待配置的恢复时间(L1或L2)
- 重新启动CAN控制器
- 如果再次发生总线关闭,使用L2恢复时间(更长)
-
错误报告:
- 当超过最大恢复尝试次数时,报告DEM错误
- 不同的恢复阶段可以配置不同的错误处理策略
/* 总线关闭处理回调函数示例 */
void CanSM_ControllerBusOff(uint8 ControllerId)
{
NetworkHandleType network;
/* 找到对应的网络句柄 */
for (network = 0; network < CANSM_NUMBER_OF_NETWORKS; network++) {
if (CanSM_Networks[network].ControllerId == ControllerId) {
break;
}
}
/* 检查是否找到有效网络 */
if (network < CANSM_NUMBER_OF_NETWORKS) {
/* 更新总线关闭状态 */
CanSM_Networks[network].BusOffStatus = CANSM_BUS_OFF_DETECTED;
/* 停止CAN控制器 */
CanIf_SetControllerMode(ControllerId,
CANIF_CS_STOPPED);
/* 记录总线关闭时间 */
CanSM_Networks[network].BusOffTime = CanSM_GetCurrentTime();
/* 增加总线关闭计数器 */
CanSM_Networks[network].BusOffCounter++;
/* 确定恢复时间 (L1 或 L2) */
if (CanSM_Networks[network].BusOffCounter <=
CanSM_BorCounterL1ToL2Threshold) {
CanSM_Networks[network].BorRecoveryTime = CanSM_BorTimeL1;
} else {
CanSM_Networks[network].BorRecoveryTime = CanSM_BorTimeL2;
}
/* 触发状态转换到总线关闭恢复状态 */
CanSM_SetBusOffRecoveryState(network);
}
}
4. 配置结构
4.1 配置类层次结构
CanSM模块的配置结构包括多个相互关联的配置类,用于设置CAN网络、控制器、收发器和总线关闭恢复参数:
-
CanSM配置类:
- 顶层配置容器
- 包含所有配置的CAN网络信息
- 包含通用模块参数设置
-
CanSMManagerNetwork配置类:
- 核心配置类
- 定义每个CAN网络的配置
- 关联控制器和收发器配置
- 设置总线关闭恢复参数
-
CanSMControllerConfig配置类:
- CAN控制器配置
- 定义CAN控制器的配置
- 关联到特定的CAN网络
-
CanSMTransceiverConfig配置类:
- CAN收发器配置
- 定义CAN收发器的配置
- 可选项,某些网络可能不使用收发器
-
CanSMBorConfig配置类:
- 总线关闭恢复配置
- 设置恢复策略和时间
- 定义恢复阈值和计数器
4.2 关键配置参数
CanSM模块的关键配置参数包括:
-
基础网络参数:
CanSMNetworkId
:CAN网络的唯一标识符CanSMComMNetworkHandleRef
:关联的ComM网络句柄CanSMSizeOfControllerId
:网络中CAN控制器的数量CanSMSizeOfTransceiverId
:网络中CAN收发器的数量
-
总线关闭恢复参数:
CanSMBorCounterL1ToL2
:L1到L2恢复级别的计数器阈值CanSMBorTimeL1
:L1级别的恢复时间CanSMBorTimeL2
:L2级别的恢复时间(通常更长)CanSMBorTxConfirmationPolling
:是否使用TX确认策略
-
模式请求参数:
CanSMModeRequestRepetitionMax
:模式请求的最大重复次数CanSMModeRequestRepetitionTime
:模式请求的重复时间间隔
-
常规模块参数:
CanSMMainFunctionTimePeriod
:主函数的周期时间CanSMDevErrorDetect
:开发错误检测开关CanSMVersionInfoApi
:版本信息API使能开关
/* CanSM配置数据结构示例 */
typedef struct {
uint8 CanSMBorCounterL1ToL2; /* L1到L2恢复级别的阈值 */
float32 CanSMBorTimeL1; /* L1级别恢复时间 */
float32 CanSMBorTimeL2; /* L2级别恢复时间 */
boolean CanSMBorTxConfirmationPolling; /* TX确认策略开关 */
} CanSM_BorConfigType;
typedef struct {
uint8 CanSMControllerId; /* CAN控制器ID */
} CanSM_ControllerConfigType;
typedef struct {
uint8 CanSMTransceiverId; /* CAN收发器ID */
} CanSM_TransceiverConfigType;
typedef struct {
NetworkHandleType CanSMNetworkId; /* CAN网络ID */
NetworkHandleType CanSMComMNetworkHandleRef; /* ComM网络句柄 */
uint8 CanSMModeRequestRepetitionMax; /* 最大重复次数 */
float32 CanSMModeRequestRepetitionTime; /* 重复时间间隔 */
const CanSM_ControllerConfigType* CanSMControllerConfig;
const CanSM_TransceiverConfigType* CanSMTransceiverConfig;
const CanSM_BorConfigType* CanSMBorConfig;
uint8 CanSMSizeOfControllerId; /* 控制器数量 */
uint8 CanSMSizeOfTransceiverId; /* 收发器数量 */
} CanSM_NetworkConfigType;
typedef struct {
boolean CanSMDevErrorDetect; /* 开发错误检测 */
float32 CanSMMainFunctionTimePeriod; /* 主函数周期 */
boolean CanSMVersionInfoApi; /* 版本信息API */
} CanSM_GeneralType;
typedef struct {
const CanSM_GeneralType CanSMGeneral;
const CanSM_NetworkConfigType* CanSMNetworkConfig;
uint8 CanSMSizeOfNetwork; /* 网络数量 */
} CanSM_ConfigType;
5. API接口
5.1 初始化与反初始化
CanSM模块提供了标准的初始化和反初始化接口:
- CanSM_Init:
- 函数:
void CanSM_Init(const CanSM_ConfigType* ConfigPtr)
- 功能:初始化CanSM模块的内部变量和状态
- 参数:指向配置结构的指针
- 行为:初始化模块内部变量,将所有CAN网络状态设置为未初始化
- 调用时机:系统启动阶段
- 函数:
void CanSM_Init(const CanSM_ConfigType* ConfigPtr)
{
uint8 i;
/* 参数检查 */
if (ConfigPtr == NULL_PTR) {
Det_ReportError(CANSM_MODULE_ID, CANSM_INSTANCE_ID,
CANSM_INIT_ID, CANSM_E_PARAM_POINTER);
return;
}
/* 保存配置指针 */
CanSM_ConfigurationPtr = ConfigPtr;
/* 初始化全局变量 */
CanSM_State = CANSM_INITIALIZED;
/* 初始化所有网络状态 */
for (i = 0; i < CanSM_ConfigurationPtr->CanSMSizeOfNetwork; i++) {
CanSM_NetworkStates[i].CurrentState = CANSM_BSM_S_NOT_INITIALIZED;
/* 初始化其他网络状态变量... */
}
}
- CanSM_DeInit:
- 函数:
void CanSM_DeInit(void)
- 功能:关闭CanSM模块,释放资源
- 行为:关闭CanSM模块,将所有CAN网络状态设置回未初始化状态
- 注意:调用此函数前必须确保所有CAN网络都处于无通信状态
- 函数:
void CanSM_DeInit(void)
{
uint8 i;
/* 检查模块是否已初始化 */
if (CanSM_State != CANSM_INITIALIZED) {
Det_ReportError(CANSM_MODULE_ID, CANSM_INSTANCE_ID,
CANSM_DEINIT_ID, CANSM_E_UNINIT);
return;
}
/* 检查所有网络是否都处于无通信状态 */
for (i = 0; i < CanSM_ConfigurationPtr->CanSMSizeOfNetwork; i++) {
if (CanSM_NetworkStates[i].CurrentState != CANSM_BSM_S_NOCOM)
{
Det_ReportError(CANSM_MODULE_ID, CANSM_INSTANCE_ID,
CANSM_DEINIT_ID, CANSM_E_MODE_REQUEST_TIMEOUT);
return;
}
}
/* 反初始化所有网络 */
for (i = 0; i < CanSM_ConfigurationPtr->CanSMSizeOfNetwork; i++) {
CanSM_NetworkStates[i].CurrentState = CANSM_BSM_NOT_INITIALIZED;
/* 清除其他网络状态变量... */
}
/* 重置模块状态 */
CanSM_State = CANSM_UNINIT;
CanSM_ConfigurationPtr = NULL_PTR;
}
5.2 通信模式控制
CanSM模块提供了控制CAN网络通信模式的API:
-
CanSM_RequestComMode:
- 函数:
Std_ReturnType CanSM_RequestComMode(NetworkHandleType network, ComM_ModeType ComM_Mode)
- 功能:请求指定CAN网络的通信模式
- 参数:网络句柄和目标通信模式
- 返回:E_OK表示请求已接受,E_NOT_OK表示拒绝
- 函数:
-
CanSM_GetCurrentComMode:
- 函数:
Std_ReturnType CanSM_GetCurrentComMode(NetworkHandleType network, ComM_ModeType* ComM_ModePtr)
- 功能:获取指定CAN网络的当前通信模式
- 参数:网络句柄和模式指针
- 返回:E_OK表示成功获取,E_NOT_OK表示失败
- 函数:
-
CanSM_StartWakeUpSource:
- 函数:
Std_ReturnType CanSM_StartWakeupSource(NetworkHandleType network)
- 功能:启动CAN网络作为唤醒源
- 参数:网络句柄
- 返回:E_OK表示成功启动,E_NOT_OK表示失败
- 函数:
-
CanSM_StopWakeUpSource:
- 函数:
Std_ReturnType CanSM_StopWakeupSource(NetworkHandleType network)
- 功能:停止CAN网络作为唤醒源
- 参数:网络句柄
- 返回:E_OK表示成功停止,E_NOT_OK表示失败
- 函数:
Std_ReturnType CanSM_RequestComMode(NetworkHandleType network, ComM_ModeType ComM_Mode)
{
/* 检查模块是否已初始化 */
if (CanSM_State != CANSM_INITIALIZED) {
Det_ReportError(CANSM_MODULE_ID, CANSM_INSTANCE_ID,
CANSM_REQUESTCOMMODE_ID, CANSM_E_UNINIT);
return E_NOT_OK;
}
/* 参数检查 */
if (network >= CanSM_ConfigurationPtr->CanSMSizeOfNetwork) {
Det_ReportError(CANSM_MODULE_ID, CANSM_INSTANCE_ID,
CANSM_REQUESTCOMMODE_ID, CANSM_E_INVALID_NETWORK_HANDLE);
return E_NOT_OK;
}
/* 存储请求的通信模式 */
CanSM_NetworkStates[network].RequestedMode = ComM_Mode;
/* 根据请求的模式触发相应的状态转换 */
switch (ComM_Mode) {
case COMM_FULL_COMMUNICATION:
/* 触发全通信模式转换 */
break;
case COMM_SILENT_COMMUNICATION:
/* 触发静默通信模式转换 */
break;
case COMM_NO_COMMUNICATION:
/* 触发无通信模式转换 */
break;
default:
Det_ReportError(CANSM_MODULE_ID, CANSM_INSTANCE_ID,
CANSM_REQUESTCOMMODE_ID, CANSM_E_INVALID_COMM_MODE);
return E_NOT_OK;
}
return E_OK;
}
6. 总结
AUTOSAR CAN状态管理器(CanSM)是AUTOSAR通信栈中的关键组件,承担着CAN网络状态管理的重要职责。它为ComM和CanIf模块之间提供桥接功能,实现通信模式请求的转换为具体的CAN硬件控制。
主要特性
-
统一的网络状态管理:
- 管理不同CAN网络的通信状态(全通信、静默通信、无通信)
- 提供标准化的通信模式转换流程
- 确保CAN控制器和收发器状态同步
-
完整的总线关闭处理:
- 实现可配置的总线关闭恢复策略
- 支持多级恢复机制(L1/L2)
- 可选择基于时间或TX确认的恢复方式
-
灵活的配置结构:
- 支持多CAN网络配置
- 支持每个网络多控制器和收发器
- 提供丰富的配置参数以满足不同应用需求
应用场景
-
汽车网络管理:
- 实现车辆CAN网络的各种通信状态管理
- 处理网络休眠和唤醒流程
- 确保节能模式下的正确网络状态
-
故障恢复:
- 处理CAN总线故障并自动恢复
- 实施分级故障处理策略
- 提供对总线干扰的鲁棒性
-
诊断支持:
- 提供网络状态信息用于诊断
- 报告通信错误和恢复状态
- 记录总线关闭统计信息
通过CanSM模块,AUTOSAR架构为CAN网络的状态管理提供了标准化、可靠的解决方案,有效促进了不同ECU供应商之间的互操作性,并简化了复杂网络系统的开发和调试。