当前位置: 首页 > news >正文

AUTOSAR进阶图解==>AUTOSAR_SWS_CANTransceiverDriver

AUTOSAR CAN收发器驱动(CanTrcv)详解

基于AUTOSAR标准规范详解CAN收发器驱动架构与实现

目录

  • 1. 概述
    • 1.1 功能简介
    • 1.2 相关模块依赖
  • 2. 模块架构
    • 2.1 架构总览
    • 2.2 模块层次结构
    • 2.3 组件交互关系
  • 3. 状态机模型
    • 3.1 操作模式概述
    • 3.2 状态转换流程
    • 3.3 事件与触发条件
  • 4. 唤醒机制
    • 4.1 唤醒模式
    • 4.2 唤醒序列
    • 4.3 唤醒原因分类
  • 5. 配置结构
    • 5.1 配置参数概览
    • 5.2 关键配置参数说明
    • 5.3 配置示例
  • 6. API接口
    • 6.1 接口概述
    • 6.2 API调用序列
    • 6.3 错误处理
  • 7. 总结

1. 概述

1.1 功能简介

CAN收发器驱动(CanTrcv)是AUTOSAR标准中的一个基础软件模块,负责控制CAN总线收发器硬件。该驱动位于ECU抽象层,为上层CAN接口(CanIf)提供了硬件独立的接口,使上层软件可以控制CAN收发器的操作模式。CanTrcv主要功能包括:

  • 控制CAN收发器的操作模式(正常/待机/休眠)
  • 处理总线唤醒事件
  • 提供收发器状态信息
  • 管理功耗模式转换
  • 支持部分网络唤醒

CAN收发器驱动遵循AUTOSAR软件分层架构,它处于ECU抽象层,在CAN接口模块之下,并使用微控制器抽象层的驱动来访问硬件。

1.2 相关模块依赖

CAN收发器驱动与多个AUTOSAR模块有交互关系:

  • 向上层提供服务:为CanIf提供收发器控制接口
  • 使用下层服务:使用DIO和SPI模块访问硬件
  • 交互模块
    • ComM:通过CanIf控制收发器通信模式
    • EcuM:接收唤醒事件通知
    • DET:开发错误报告
    • DEM:生产错误报告

每个CAN收发器硬件对应一个CAN收发器驱动实例,有各自独立的控制。


2. 模块架构

2.1 架构总览

CAN收发器驱动在AUTOSAR分层架构中的位置以及与其他模块的关系如下图所示:

在这里插入图片描述

2.2 模块层次结构

从架构图可以清晰看出CanTrcv模块在AUTOSAR分层架构中的位置及其与其他模块的关系:

  1. 通信服务层

    • CAN接口(CanIf):作为上层抽象接口,负责协调CAN控制器和CAN收发器
    • 通信管理器(ComM):负责管理网络通信,通过CanIf控制收发器模式
  2. ECU抽象层

    • CAN收发器驱动(CanTrcv):本模块,提供对CAN收发器硬件的抽象访问
  3. 微控制器抽象层

    • 数字输入输出(DIO):用于访问通过GPIO连接的CAN收发器
    • SPI处理驱动(SPI):用于访问通过SPI总线连接的CAN收发器
  4. 系统服务

    • ECU管理器(EcuM):接收唤醒通知
    • 开发错误追踪器(DET):接收开发错误信息
    • 生产错误管理器(DEM):接收生产错误信息

2.3 组件交互关系

CanTrcv模块与其他模块之间的交互关系:

  1. CanTrcv与CanIf

    • CanIf通过CanTrcv_API调用CanTrcv的函数来控制收发器
    • CanTrcv通过回调函数向CanIf通知状态变化和唤醒事件
  2. CanTrcv与硬件层

    • 对于GPIO连接的收发器,CanTrcv通过DIO驱动访问硬件
    • 对于SPI连接的收发器,CanTrcv通过SPI驱动访问硬件
  3. CanTrcv与系统服务

    • CanTrcv向DET报告开发错误
    • CanTrcv向DEM报告生产错误
    • CanTrcv产生的唤醒事件通过CanIf传递给EcuM

这种分层架构和清晰的接口定义,使得CAN收发器驱动可以独立于具体硬件实现,支持不同类型的CAN收发器,便于系统集成和维护。


3. 状态机模型

3.1 操作模式概述

CAN收发器驱动定义了一个状态机模型,用于管理收发器的不同操作模式。这个模型包含以下几种状态:

  1. 未初始化(UNINIT):驱动初始化前的状态
  2. 正常模式(NORMAL):收发器完全激活,可以发送和接收CAN帧
  3. 待机模式(STANDBY):低功耗模式,但可以监控总线活动用于唤醒
  4. 休眠模式(SLEEP):最低功耗模式,通常需要特定唤醒事件才能退出

3.2 状态转换流程

CAN收发器的状态转换如下图所示:

在这里插入图片描述

3.3 事件与触发条件

从状态图中可以看出以下关键转换点和事件:

  1. 初始化转换

    • 系统启动时,通过调用CanTrcv_Init()将收发器从UNINIT状态转换到STANDBY状态
    • 初始化配置可以指定初始状态(通常为STANDBY)
  2. 运行时转换

    • STANDBY → NORMAL:通过CanTrcv_SetOpMode(CANTRCV_TRCVMODE_NORMAL)激活收发器
    • NORMAL → STANDBY:通过CanTrcv_SetOpMode(CANTRCV_TRCVMODE_STANDBY)进入低功耗模式
    • STANDBY → SLEEP:通过CanTrcv_SetOpMode(CANTRCV_TRCVMODE_SLEEP)进入深度休眠
    • SLEEP → STANDBY:通过CanTrcv_SetOpMode(CANTRCV_TRCVMODE_STANDBY)从睡眠中唤醒
  3. 状态特性

    • STANDBY状态:支持唤醒检测,所有CAN收发器硬件类型都必须支持
    • NORMAL状态:CAN总线通信活动状态,BUS引脚有效
    • SLEEP状态:最低功耗模式,仍然可以通过总线活动唤醒

这种状态机模型的设计保证了CAN收发器在不同操作场景下的有效管理,特别是在需要节能的ECU休眠/唤醒场景中。


4. 唤醒机制

4.1 唤醒模式

CAN收发器驱动支持两种唤醒模式:

  1. 不支持唤醒(CANTRCV_WAKEUP_NOT_SUPPORTED)

    • 在此模式下,CAN收发器不会产生任何唤醒事件
    • 即使有CAN总线活动也不会触发唤醒
  2. 轮询唤醒(CANTRCV_WAKEUP_POLLING)

    • 通过周期性调用CanTrcv_MainFunction()检查唤醒事件
    • 需要软件定期轮询收发器状态
    • 可能导致CAN通道唤醒,但不会触发MCU唤醒

选择哪种唤醒模式通过配置参数CanTrcvWakeupSupport来确定。同时,可以通过CanTrcvWakeupByBusUsed参数为每个CAN收发器单独开启或关闭唤醒支持。

4.2 唤醒序列

CAN收发器驱动的唤醒处理序列如下图所示:

在这里插入图片描述

4.3 唤醒原因分类

唤醒序列图展示了CAN收发器的完整唤醒流程:

  1. 唤醒检测阶段

    • CAN总线活动触发CAN收发器硬件产生唤醒事件
    • CanTrcv_MainFunction()周期性调用检查收发器唤醒状态
    • 检测到唤醒事件后,通过CanIf_TrcvWakeupNotification通知CanIf
    • CanIf调用EcuM_SetWakeupEvent通知ECU管理器
  2. 唤醒验证阶段

    • ECU管理器调用CanIf_CheckWakeup请求验证唤醒源
    • CanIf调用CanTrcv_CheckWakeup验证收发器唤醒事件
    • CanTrcv读取收发器状态并验证唤醒原因
    • 如果唤醒有效,通过CanIf_TrcvWakeupNotification再次通知CanIf
    • CanIf调用EcuM_ValidateWakeupEvent确认唤醒事件

CanTrcv模块定义了多种唤醒原因类型(CanTrcv_TrcvWakeupReasonType):

  • CANTRCV_WU_BY_BUS:由CAN总线通信触发唤醒
  • CANTRCV_WU_BY_PIN:由唤醒引脚触发唤醒
  • CANTRCV_WU_INTERNALLY:内部唤醒
  • CANTRCV_WU_POWER_ON:上电唤醒
  • CANTRCV_WU_RESET:复位唤醒
  • CANTRCV_WU_BY_SYSERR:系统错误唤醒
  • CANTRCV_WU_ERROR:唤醒错误
  • CANTRCV_WU_NOT_SUPPORTED:不支持唤醒

应用程序可以通过CanTrcv_GetBusWuReason函数获取具体的唤醒原因,以便采取相应的处理措施。


5. 配置结构

5.1 配置参数概览

CAN收发器驱动的配置结构如下图所示:

在这里插入图片描述

5.2 关键配置参数说明

配置类图展示了CAN收发器驱动的完整配置结构:

  1. CanTrcvConfigSet:顶层配置容器

    • 包含一个通用配置(CanTrcvGeneral)
    • 包含一个或多个通道配置(CanTrcvChannel)
  2. CanTrcvGeneralType:通用配置参数

    • CanTrcvDevErrorDetect:是否开启开发错误检测功能,类型为boolean
    • CanTrcvIndex:驱动索引,类型为uint8
    • CanTrcvMainFunctionDiagnosticsPeriod:诊断主函数调用周期,单位为秒,类型为float
    • CanTrcvMainFunctionPeriod:主函数调用周期,单位为秒,类型为float
    • CanTrcvVersionInfoApi:是否启用版本信息API,类型为boolean
  3. CanTrcvChannelType:通道配置参数

    • CanTrcvChannelId:通道标识符,类型为uint8
    • CanTrcvWakeupByBusUsed:是否启用总线唤醒功能,类型为boolean
    • CanTrcvWakeupSource:唤醒源标识符,类型为EcuMWakeupSourceType
    • CanTrcvWakeupSupport:唤醒支持模式,类型为CanTrcvWakeupModeType
    • CanTrcvSleepWaitCount:切换到休眠模式的等待计数,类型为uint32
    • CanTrcvIcuChannelRef:ICU通道引用,类型为reference
    • CanTrcvPnSupport:是否支持部分网络,类型为boolean
    • CanTrcvHwPnSupport:硬件是否支持部分网络,类型为boolean
    • CanTrcvChannelUsed:通道是否使用,类型为boolean
    • CanTrcvInitState:初始化状态,类型为CanTrcv_TrcvModeType
  4. 枚举类型

    • CanTrcvWakeupModeType:唤醒模式
      • CANTRCV_WAKEUP_NOT_SUPPORTED:不支持唤醒
      • CANTRCV_WAKEUP_POLLING:轮询唤醒
    • CanTrcv_TrcvModeType:收发器模式
      • CANTRCV_TRCVMODE_NORMAL:正常模式
      • CANTRCV_TRCVMODE_STANDBY:待机模式
      • CANTRCV_TRCVMODE_SLEEP:休眠模式
    • CanTrcv_TrcvWakeupReasonType:唤醒原因
      • 多种不同的唤醒原因类型,如总线唤醒、引脚唤醒等

5.3 配置示例

以下是CAN收发器驱动配置的C语言结构示例:

/* CanTrcv配置结构定义 */
typedef struct {boolean CanTrcvDevErrorDetect;uint8   CanTrcvIndex;float   CanTrcvMainFunctionDiagnosticsPeriod;float   CanTrcvMainFunctionPeriod;boolean CanTrcvVersionInfoApi;
} CanTrcvGeneralType;typedef struct {uint8   CanTrcvChannelId;boolean CanTrcvWakeupByBusUsed;uint32  CanTrcvWakeupSource;  /* EcuM唤醒源ID */uint8   CanTrcvWakeupSupport; /* 枚举CanTrcvWakeupModeType */uint32  CanTrcvSleepWaitCount;void*   CanTrcvIcuChannelRef; /* ICU通道引用 */boolean CanTrcvPnSupport;boolean CanTrcvHwPnSupport;boolean CanTrcvChannelUsed;uint8   CanTrcvInitState;     /* 枚举CanTrcv_TrcvModeType */
} CanTrcvChannelType;typedef struct {CanTrcvGeneralType  CanTrcvGeneral;CanTrcvChannelType  CanTrcvChannel[CANTRCV_CHANNEL_COUNT];
} CanTrcvConfigType;/* 配置实例示例 */
const CanTrcvConfigType CanTrcvConfig = {/* 通用配置 */{TRUE,                     /* CanTrcvDevErrorDetect */0U,                       /* CanTrcvIndex */0.01F,                    /* CanTrcvMainFunctionDiagnosticsPeriod */0.01F,                    /* CanTrcvMainFunctionPeriod */TRUE                      /* CanTrcvVersionInfoApi */},/* 通道配置 */{{0U,                   /* CanTrcvChannelId */TRUE,                 /* CanTrcvWakeupByBusUsed */0x00000001U,          /* CanTrcvWakeupSource */1U,                   /* CANTRCV_WAKEUP_POLLING */100U,                 /* CanTrcvSleepWaitCount */NULL,                 /* CanTrcvIcuChannelRef */FALSE,                /* CanTrcvPnSupport */FALSE,                /* CanTrcvHwPnSupport */TRUE,                 /* CanTrcvChannelUsed */2U                    /* CANTRCV_TRCVMODE_STANDBY */}/* 可添加更多通道 */}
};

通过这些配置参数,可以灵活设置CAN收发器的各种特性和行为,适应不同的应用场景需求。


6. API接口

6.1 接口概述

CAN收发器驱动提供以下主要API接口:

  1. 初始化函数

    • CanTrcv_Init(ConfigPtr):初始化CAN收发器驱动
  2. 模式控制函数

    • CanTrcv_SetOpMode(Transceiver, OpMode):设置收发器操作模式
    • CanTrcv_GetOpMode(Transceiver, OpMode):获取收发器当前操作模式
  3. 唤醒相关函数

    • CanTrcv_GetBusWuReason(Transceiver, Reason):获取唤醒原因
    • CanTrcv_CheckWakeup(Transceiver):检查并验证唤醒事件
    • CanTrcv_MainFunction():周期性检查收发器状态
  4. 版本信息函数

    • CanTrcv_GetVersionInfo(VersionInfo):获取模块版本信息

6.2 API调用序列

CAN收发器驱动的典型API调用序列如下图所示:

在这里插入图片描述

6.3 错误处理

API调用序列图展示了CAN收发器驱动API的典型调用流程:

  1. 初始化流程

    • 上层模块调用CanTrcv_Init进行初始化
    • CanTrcv配置和初始化硬件
    • 初始化后收发器处于配置指定的状态(通常是STANDBY)
  2. 模式切换操作

    • 上层调用CanTrcv_SetOpMode请求切换模式
    • CanTrcv进行参数检查
    • 如有错误则报告给DET
    • 设置硬件到请求的模式
    • 通过CanIf_TrcvModeIndication回调通知上层模式已更改
  3. 状态查询操作

    • 上层调用CanTrcv_GetOpMode获取当前模式
    • CanTrcv读取硬件状态并返回
  4. 唤醒原因查询

    • 上层调用CanTrcv_GetBusWuReason获取唤醒原因
    • CanTrcv从硬件获取唤醒信息并返回
  5. 周期性处理

    • 定时调用CanTrcv_MainFunction
    • 检查硬件状态变化
    • 如有模式变化或唤醒事件则通知上层

CAN收发器驱动支持两类错误处理:

  1. 开发错误(Development Errors)

    • CANTRCV_E_INVALID_TRANSCEIVER:无效的收发器号
    • CANTRCV_E_UNINIT:驱动未初始化
    • CANTRCV_E_PARAM_POINTER:空指针参数
    • CANTRCV_E_TRCV_NOT_STANDBY:收发器不在待机模式
    • CANTRCV_E_TRCV_NOT_NORMAL:收发器不在正常模式
    • CANTRCV_E_PARAM_TRCV_WAKEUP_MODE:无效的唤醒模式
    • CANTRCV_E_PARAM_TRCV_OPMODE:无效的操作模式
    • CANTRCV_E_BAUDRATE_NOT_SUPPORTED:不支持的波特率
    • CANTRCV_E_INIT_FAILED:初始化失败
  2. 运行时错误(Runtime Errors)

    • CANTRCV_E_NO_TRCV_CONTROL:与收发器通信错误

开发错误通过DET报告,运行时错误通过DEM报告,确保系统可以对各种异常情况作出适当响应。


7. 总结

AUTOSAR CAN收发器驱动(CanTrcv)是汽车电子控制单元中重要的基础软件组件,具有以下特点:

  1. 标准化接口

    • 提供符合AUTOSAR规范的标准API
    • 使上层软件可以以统一方式控制不同类型的CAN收发器硬件
  2. 灵活的配置

    • 支持多种操作模式:正常、待机和休眠
    • 提供全面的配置选项以适应不同应用需求
  3. 高效能源管理

    • 通过精细的状态控制实现功耗优化
    • 支持多种唤醒机制,确保系统可以及时响应唤醒事件
  4. 鲁棒性设计

    • 全面的错误检测与处理
    • 状态验证与安全转换逻辑
  5. 可扩展性

    • 支持多个收发器实例
    • 适配不同的硬件接口(GPIO/SPI)

对于汽车电子系统开发人员而言,深入理解CAN收发器驱动的工作原理、配置选项和API使用方法,对于实现高效、可靠的CAN通信系统至关重要。特别是在低功耗场景和网络管理策略中,合理配置和使用CAN收发器驱动可以显著提升系统性能和用户体验。

AUTOSAR规范的标准API

  • 使上层软件可以以统一方式控制不同类型的CAN收发器硬件
  1. 灵活的配置

    • 支持多种操作模式:正常、待机和休眠
    • 提供全面的配置选项以适应不同应用需求
  2. 高效能源管理

    • 通过精细的状态控制实现功耗优化
    • 支持多种唤醒机制,确保系统可以及时响应唤醒事件
  3. 鲁棒性设计

    • 全面的错误检测与处理
    • 状态验证与安全转换逻辑
  4. 可扩展性

    • 支持多个收发器实例
    • 适配不同的硬件接口(GPIO/SPI)

对于汽车电子系统开发人员而言,深入理解CAN收发器驱动的工作原理、配置选项和API使用方法,对于实现高效、可靠的CAN通信系统至关重要。特别是在低功耗场景和网络管理策略中,合理配置和使用CAN收发器驱动可以显著提升系统性能和用户体验。

通过本文对AUTOSAR CAN收发器驱动的全面解析,开发人员可以更好地理解和应用这一关键基础软件组件,为汽车电子系统开发提供坚实基础。

http://www.dtcms.com/a/293317.html

相关文章:

  • 新版Qwen3深夜突袭:性能超越Kimi-K2、DeepSeek-V3
  • 自定义HAProxy 错误界面
  • 微调大语言模型(LLM)有多难?
  • 西门子博图FB引脚解析,与FC的区别
  • Zabbix 6.0+ 使用官方模板监控 Redis 数据库的完整配置指南
  • KIMI K2:开放式的智能体(Agentic)人工智能
  • 基于卷积神经网络与小波变换的医学图像超分辨率算法复现
  • 基础工具安装
  • API: return response as HTML table
  • Redis 八股面试题
  • 软件测试面试避坑
  • 【Unity Shader】Special Effects(十一)RgbOffset RGB偏移(UI)
  • 初识卷积神经网络CNN
  • jupyter使用
  • JAVA_ONE-NINE_ATM机案例
  • 秋招Day17 - Spring - 事务
  • 【JavaEE】认识计算机(二)
  • useOptimistic介绍和使用闭坑
  • 机器学习/归一化
  • MS523NA非接触式读卡器 IC
  • 如何在 Windows 10 下部署多个 PHP 版本7.4,8.2
  • adb的使用
  • Java(Set接口和HashSet的分析)
  • SpringBoot全局异常报错处理和信息返回
  • 米家打印机驱动:Wi-Fi 无线打印丝滑顺畅不卡顿,从此告别对打印机干瞪眼
  • Java基础 7.22
  • 原型模式及优化
  • C++11相关知识点
  • 自动化测试报告生成【Allure】
  • Linux--指令初识