AUTOSAR进阶图解==>AUTOSAR_SWS_CANStateManager

AUTOSAR CAN状态管理器(CanSM)详解

AUTOSAR经典平台4.4.0版本规范

目录

  1. 概述
  2. 模块架构
  3. 功能详解
  4. 配置结构
  5. API接口
  6. 总结

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模块主要负责:

  1. CAN网络状态管理

    • 管理CAN网络的三种通信状态:全通信、静默通信和无通信
    • 根据ComM请求执行状态转换
    • 通知BswM关于CAN网络的当前状态
  2. CAN控制器和收发器控制

    • 通过CanIf模块控制CAN控制器的工作模式(STARTED、STOPPED)
    • 控制CAN收发器的工作模式(NORMAL、STANDBY)
    • 协调多个CAN控制器和收发器的状态同步
  3. 总线关闭(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网络在不同通信模式之间的切换。

在这里插入图片描述

状态机的主要状态包括:

  1. 未初始化状态(CANSM_BSM_NOT_INITIALIZED)

    • 系统上电后的初始状态
    • 此状态下CAN网络不可用
    • 调用CanSM_Init后离开此状态
  2. 无通信状态(CANSM_BSM_S_NOCOM)

    • CAN控制器处于STOPPED状态
    • CAN收发器处于STANDBY状态
    • 不能收发CAN报文,低功耗状态
  3. 全通信状态(CANSM_BSM_S_FULLCOM)

    • CAN控制器处于STARTED状态
    • CAN收发器处于NORMAL状态
    • 可以正常收发CAN报文
    • 网络完全活动状态
  4. 静默通信状态(CANSM_BSM_S_SILENTCOM)

    • CAN控制器处于STARTED状态
    • CAN收发器处于NORMAL状态
    • 可以接收报文但不发送(TX离线)
    • 通常用于准备进入睡眠状态

状态转换的主要流程:

  1. 上电和初始化

    • PowerOn后状态机处于CANSM_BSM_NOT_INITIALIZED状态
    • 调用CanSM_Init触发转换到CANSM_BSM_S_NOT_INITIALIZED状态
    • 然后自动转换到CANSM_BSM_S_NOCOM状态
  2. 进入全通信

    • 状态机从CANSM_BSM_S_NOCOM转换到CANSM_BSM_S_FULLCOM
    • CanSM设置CAN控制器为STARTED模式
    • CanSM设置CAN收发器为NORMAL模式
    • 设置PDU组为ONLINE模式以启用发送
  3. 进入静默通信

    • 状态机从CANSM_BSM_S_FULLCOM转换到CANSM_BSM_S_SILENTCOM
    • 保持CAN控制器为STARTED模式
    • 保持CAN收发器为NORMAL模式
    • 设置PDU组为TX_OFFLINE模式以禁止发送
  4. 进入无通信

    • 状态机转换到CANSM_BSM_S_NOCOM状态
    • CanSM设置CAN控制器为STOPPED模式
    • CanSM设置CAN收发器为STANDBY模式
    • 完全禁止CAN通信
  5. 反初始化

    • 调用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模块实现了复杂的总线关闭恢复机制:

  1. 总线关闭检测

    • CanIf模块检测到总线关闭事件
    • 通过回调函数CanSM_ControllerBusOff通知CanSM
    • 触发状态机进入CANSM_BSM_S_SILENTCOM_BOR状态
  2. 恢复策略类型

    • 基于时间的恢复:等待配置的时间后尝试重启CAN控制器
    • 基于TX确认的恢复:等待TX确认后再重启CAN控制器
    • 分级恢复:L1和L2两个恢复等级,L2拥有更长的恢复时间
  3. 恢复过程

    • 当发生总线关闭时,CanSM停止CAN控制器
    • 等待配置的恢复时间(L1或L2)
    • 重新启动CAN控制器
    • 如果再次发生总线关闭,使用L2恢复时间(更长)
  4. 错误报告

    • 当超过最大恢复尝试次数时,报告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网络、控制器、收发器和总线关闭恢复参数:

  1. CanSM配置类

    • 顶层配置容器
    • 包含所有配置的CAN网络信息
    • 包含通用模块参数设置
  2. CanSMManagerNetwork配置类

    • 核心配置类
    • 定义每个CAN网络的配置
    • 关联控制器和收发器配置
    • 设置总线关闭恢复参数
  3. CanSMControllerConfig配置类

    • CAN控制器配置
    • 定义CAN控制器的配置
    • 关联到特定的CAN网络
  4. CanSMTransceiverConfig配置类

    • CAN收发器配置
    • 定义CAN收发器的配置
    • 可选项,某些网络可能不使用收发器
  5. CanSMBorConfig配置类

    • 总线关闭恢复配置
    • 设置恢复策略和时间
    • 定义恢复阈值和计数器

4.2 关键配置参数

CanSM模块的关键配置参数包括:

  1. 基础网络参数

    • CanSMNetworkId:CAN网络的唯一标识符
    • CanSMComMNetworkHandleRef:关联的ComM网络句柄
    • CanSMSizeOfControllerId:网络中CAN控制器的数量
    • CanSMSizeOfTransceiverId:网络中CAN收发器的数量
  2. 总线关闭恢复参数

    • CanSMBorCounterL1ToL2:L1到L2恢复级别的计数器阈值
    • CanSMBorTimeL1:L1级别的恢复时间
    • CanSMBorTimeL2:L2级别的恢复时间(通常更长)
    • CanSMBorTxConfirmationPolling:是否使用TX确认策略
  3. 模式请求参数

    • CanSMModeRequestRepetitionMax:模式请求的最大重复次数
    • CanSMModeRequestRepetitionTime:模式请求的重复时间间隔
  4. 常规模块参数

    • 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模块提供了标准的初始化和反初始化接口:

  1. 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;
        /* 初始化其他网络状态变量... */
    }
}
  1. 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:

  1. CanSM_RequestComMode

    • 函数:Std_ReturnType CanSM_RequestComMode(NetworkHandleType network, ComM_ModeType ComM_Mode)
    • 功能:请求指定CAN网络的通信模式
    • 参数:网络句柄和目标通信模式
    • 返回:E_OK表示请求已接受,E_NOT_OK表示拒绝
  2. CanSM_GetCurrentComMode

    • 函数:Std_ReturnType CanSM_GetCurrentComMode(NetworkHandleType network, ComM_ModeType* ComM_ModePtr)
    • 功能:获取指定CAN网络的当前通信模式
    • 参数:网络句柄和模式指针
    • 返回:E_OK表示成功获取,E_NOT_OK表示失败
  3. CanSM_StartWakeUpSource

    • 函数:Std_ReturnType CanSM_StartWakeupSource(NetworkHandleType network)
    • 功能:启动CAN网络作为唤醒源
    • 参数:网络句柄
    • 返回:E_OK表示成功启动,E_NOT_OK表示失败
  4. 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网络配置
    • 支持每个网络多控制器和收发器
    • 提供丰富的配置参数以满足不同应用需求

应用场景

  1. 汽车网络管理

    • 实现车辆CAN网络的各种通信状态管理
    • 处理网络休眠和唤醒流程
    • 确保节能模式下的正确网络状态
  2. 故障恢复

    • 处理CAN总线故障并自动恢复
    • 实施分级故障处理策略
    • 提供对总线干扰的鲁棒性
  3. 诊断支持

    • 提供网络状态信息用于诊断
    • 报告通信错误和恢复状态
    • 记录总线关闭统计信息

通过CanSM模块,AUTOSAR架构为CAN网络的状态管理提供了标准化、可靠的解决方案,有效促进了不同ECU供应商之间的互操作性,并简化了复杂网络系统的开发和调试。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

KaiGer666

慧眼~施主!!!

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值