AUTOSAR进阶图解==>AUTOSAR_SWS_CANDriver

AUTOSAR CAN驱动详解:架构、状态机与接口

基于AUTOSAR SWS CAN Driver规范的详细解析

目录

  1. 概述
  2. 架构设计
  3. 状态机
  4. 配置结构
  5. 消息收发流程
  6. API接口
  7. 错误处理
  8. 总结

1. 概述

AUTOSAR(AUTomotive Open System ARchitecture)是汽车电子领域的标准化软件架构,而CAN(Controller Area Network)驱动是AUTOSAR架构中重要的基础模块,提供了对CAN控制器硬件的抽象和操作接口。本文基于AUTOSAR 4.4.0规范,详细解析CAN驱动的架构设计、状态管理、配置结构和接口功能。

CAN驱动主要负责以下功能:

  • 初始化和配置CAN控制器
  • 管理CAN控制器的状态
  • 提供消息传输与接收功能
  • 处理总线错误和唤醒事件
  • 提供标准化的接口给上层模块(主要是CAN接口模块)

2. 架构设计

AUTOSAR CAN驱动在整个架构中处于微控制器抽象层(MCAL),属于ECU抽象层的一部分。它向上层提供服务给CAN接口(CanIf)模块,向下层直接操作CAN控制器硬件。

AUTOSAR进阶图解==>AUTOSAR_SWS_CANDriver_第1张图片

2.1 架构层次关系

AUTOSAR架构将软件分为多个层次:

  1. 应用层

    • 包含应用软件组件(SWC),实现特定功能
    • 不直接与硬件交互,通过RTE与底层通信
  2. RTE层

    • 运行时环境(RTE),提供软件组件间的通信机制
    • 将应用层与基础软件层解耦
  3. 基础软件层(BSW)

    • 服务层:提供系统服务,包括通信栈和CAN接口
    • ECU抽象层:包含硬件抽象(MCAL),其中CAN驱动是重要部分
    • 微控制器抽象层:提供对MCU的基本操作
    • 复杂驱动层:包含CAN收发器驱动等外围设备驱动
  4. 硬件层

    • 包括CAN控制器、CAN收发器和CAN总线

2.2 CAN驱动模块职责

CAN驱动模块承担以下主要职责:

  • 硬件抽象:将CAN控制器硬件细节隐藏,提供统一接口
  • 状态管理:管理CAN控制器的各种状态(初始化、停止、启动等)
  • 消息处理:提供消息发送、接收和确认功能
  • 中断处理:处理CAN控制器产生的各类中断
  • 错误处理:检测和报告错误状态,如总线关闭(Bus-Off)状态
  • 唤醒处理:支持低功耗唤醒功能

3. 状态机

CAN驱动模块通过状态机来管理CAN控制器的不同工作状态。这些状态由软件触发(通过API调用)或硬件事件(如总线错误)引起转换。

AUTOSAR进阶图解==>AUTOSAR_SWS_CANDriver_第2张图片

3.1 状态定义

CAN控制器有以下几种状态:

  1. 未初始化(UNINIT)

    • 控制器处于复位状态
    • 模块的静态变量被初始化
    • 不能发送或接收任何消息
  2. 准备就绪(READY)

    • 通过Can_Init()进入
    • 控制器已配置但未开始通信
    • 准备好启动
  3. 启动(STARTED)

    • 通过Can_SetControllerMode(CAN_CS_STARTED)进入
    • 控制器完全运行,可以发送和接收消息
    • 参与CAN总线通信
  4. 停止(STOPPED)

    • 通过Can_SetControllerMode(CAN_CS_STOPPED)或总线关闭事件进入
    • 停止通信但保持配置
    • 无法收发消息
    • 可从此状态进入睡眠或重新启动
  5. 睡眠(SLEEP)

    • 通过Can_SetControllerMode(CAN_CS_SLEEP)进入
    • 低功耗模式
    • 只有硬件唤醒或软件请求才能退出
    • 不是所有硬件都支持此状态

3.2 状态转换

主要的状态转换包括:

  1. 初始化转换

    • UNINIT -> READY:通过Can_Init()
    • STOPPED/SLEEP -> UNINIT:通过Can_DeInit()
  2. 运行状态转换

    • READY -> STARTED:通过Can_SetControllerMode(CAN_CS_STARTED)
    • STARTED -> STOPPED:通过Can_SetControllerMode(CAN_CS_STOPPED)
    • STOPPED -> STARTED:通过Can_SetControllerMode(CAN_CS_STARTED)
  3. 睡眠相关转换

    • STOPPED -> SLEEP:通过Can_SetControllerMode(CAN_CS_SLEEP)
    • SLEEP -> STOPPED:通过Can_SetControllerMode(CAN_CS_STOPPED)或硬件唤醒
  4. 错误触发转换

    • STARTED -> STOPPED:当检测到总线关闭(Bus-Off)状态时

4. 配置结构

CAN驱动模块的配置结构定义了CAN控制器及其硬件对象的工作参数。这些配置参数在初始化时传递给CAN驱动模块。

4.1 主要配置类

  1. Can_ConfigType

    • 顶层配置结构,包含所有CAN驱动配置
    • 包含通用参数、控制器配置和硬件对象配置
    • 通过Can_Init()函数传递给CAN驱动
  2. CanGeneralType

    • 包含通用配置参数
    • 设置错误检测、超时和版本信息API等功能
    • 定义全局参数如CanDevErrorDetectionCanVersionInfoApi
  3. CanControllerType

    • 特定CAN控制器的配置
    • 定义控制器ID、基地址、处理方式等
    • 包含波特率配置参考
    • 配置处理方式(中断/轮询)
  4. CanHardwareObjectType

    • 定义硬件收发对象
    • 指定对象类型(发送/接收)
    • 配置ID类型、值和过滤器
    • 关联到特定控制器
  5. CanControllerBaudrateConfigType

    • 定义波特率配置
    • 包含波特率值和时间段参数
    • 支持多种波特率配置切换

4.2 硬件对象配置

硬件对象配置决定了消息的接收和发送方式:

  • 接收对象(RECEIVE)

    • 配置为接收特定ID或ID范围的消息
    • 关联到硬件接收句柄(HRH)
    • 可配置过滤器参数
  • 发送对象(TRANSMIT)

    • 配置为发送消息
    • 关联到硬件发送句柄(HTH)
    • 可配置优先级和ID类型

4.3 处理方式配置

CAN驱动支持多种处理方式:

  • 轮询(POLLING):通过周期性调用Can_MainFunction_*()函数处理
  • 中断(INTERRUPT):通过中断处理程序直接处理
  • 混合(MIXED):部分功能使用轮询,部分使用中断

5. 消息收发流程

CAN驱动的核心功能是处理消息的发送和接收。根据配置的处理方式,可以通过中断或轮询方式实现。

AUTOSAR进阶图解==>AUTOSAR_SWS_CANDriver_第3张图片

5.1 消息发送流程

消息发送流程如下:

  1. 发送请求

    • 应用层通过CanIf_Transmit()发起发送请求
    • CanIf查找对应的HTH(硬件发送句柄)
    • 调用Can_Write(Hth, PduInfoPtr)请求发送
  2. 发送处理

    • CAN驱动查找可用的发送邮箱
    • 填充ID、DLC(数据长度码)和数据
    • 触发硬件发送操作
    • 返回发送请求状态(E_OK/E_NOT_OK)
  3. 发送完成处理

    • 中断方式
      • 发送完成触发中断
      • 中断服务程序调用CanIf_TxConfirmation()
      • 通知上层发送完成
    • 轮询方式
      • 周期性调用Can_MainFunction_Write()
      • 检查发送状态
      • 完成时调用CanIf_TxConfirmation()

5.2 消息接收流程

消息接收流程如下:

  1. 接收触发

    • 接收到符合过滤条件的消息
    • 触发接收中断或在轮询中检测到
  2. 接收处理

    • 中断方式
      • 中断服务程序读取消息数据
      • 调用CanIf_RxIndication()通知上层
    • 轮询方式
      • 周期性调用Can_MainFunction_Read()
      • 检查接收状态
      • 读取到消息时调用CanIf_RxIndication()
  3. 上层处理

    • CanIf查找对应的PDU
    • 将消息传递给应用层或更高层通信栈

5.3 错误处理流程

当发生总线错误(如Bus-Off)时:

  1. 总线错误中断触发或在轮询中检测到
  2. CAN驱动更新控制器状态为STOPPED
  3. 调用CanIf_ControllerBusOff()通知上层
  4. 上层处理总线错误,可能尝试恢复通信

6. API接口

CAN驱动模块提供了一组标准化的API接口,供上层模块调用。

AUTOSAR进阶图解==>AUTOSAR_SWS_CANDriver_第4张图片

6.1 初始化接口

  • void Can_Init(const Can_ConfigType* Config)

    • 功能:初始化CAN驱动和控制器
    • 参数:指向配置结构的指针
    • 使用:由ECU状态管理器在启动阶段调用
  • void Can_DeInit(void)

    • 功能:反初始化CAN驱动,将所有控制器设置为UNINIT状态
    • 使用:在系统关闭或重新配置时调用

6.2 状态管理接口

  • Std_ReturnType Can_SetControllerMode(uint8 Controller, Can_ControllerStateType Transition)

    • 功能:设置控制器状态
    • 参数:控制器ID和目标状态转换
    • 返回:E_OK表示成功,E_NOT_OK表示失败
    • 使用:控制CAN控制器的工作状态
  • Std_ReturnType Can_GetControllerMode(uint8 Controller, Can_ControllerStateType* ControllerModePtr)

    • 功能:获取当前控制器状态
    • 参数:控制器ID和状态存储指针
    • 返回:E_OK表示成功,E_NOT_OK表示失败
  • Std_ReturnType Can_SetBaudrate(uint8 Controller, uint16 BaudRateConfigID)

    • 功能:设置控制器波特率
    • 参数:控制器ID和波特率配置ID
    • 返回:E_OK表示成功,E_NOT_OK表示失败

6.3 通信接口

  • Std_ReturnType Can_Write(Can_HwHandleType Hth, const Can_PduType* PduInfo)

    • 功能:请求发送CAN消息
    • 参数:硬件发送句柄和PDU信息
    • 返回:E_OK表示请求接受,E_NOT_OK表示请求拒绝
  • Can_MainFunction_Write()

    • 功能:轮询处理发送完成事件
    • 使用:配置为轮询模式时定期调用
  • Can_MainFunction_Read()

    • 功能:轮询处理接收事件
    • 使用:配置为轮询模式时定期调用
  • Can_MainFunction_BusOff()

    • 功能:轮询处理总线关闭事件
    • 使用:配置为轮询模式时定期调用
  • Can_MainFunction_Wakeup()

    • 功能:轮询处理唤醒事件
    • 使用:配置为轮询模式时定期调用

6.4 中断控制接口

  • void Can_DisableControllerInterrupts(uint8 Controller)

    • 功能:禁用控制器中断
    • 参数:控制器ID
    • 使用:在临界区保护时调用
  • void Can_EnableControllerInterrupts(uint8 Controller)

    • 功能:启用控制器中断
    • 参数:控制器ID
    • 使用:在临界区结束时调用

6.5 版本和校验接口

  • void Can_GetVersionInfo(Std_VersionInfoType* VersionInfo)

    • 功能:获取模块版本信息
    • 参数:版本信息存储指针
  • Std_ReturnType Can_CheckWakeup(uint8 Controller)

    • 功能:检查唤醒事件
    • 参数:控制器ID
    • 返回:E_OK表示检测到唤醒,E_NOT_OK表示未检测到

7. 错误处理

CAN驱动模块包含多种错误处理机制,用于检测、报告和处理运行时错误。

7.1 开发错误检测

当启用开发错误检测(CanDevErrorDetection = TRUE)时,CAN驱动会检查以下错误:

  • CAN_E_PARAM_POINTER:无效的指针参数
  • CAN_E_PARAM_HANDLE:无效的句柄参数
  • CAN_E_PARAM_DATA_LENGTH:无效的数据长度
  • CAN_E_PARAM_CONTROLLER:无效的控制器ID
  • CAN_E_UNINIT:模块未初始化
  • CAN_E_TRANSITION:无效的状态转换

发现错误时,驱动模块会调用Det_ReportError()报告错误。

7.2 运行时错误处理

主要的运行时错误处理包括:

  1. 总线关闭(Bus-Off)处理

    • 当控制器进入总线关闭状态时
    • 控制器自动转换到STOPPED状态
    • 调用CanIf_ControllerBusOff()通知上层
    • 上层可能触发自动恢复机制
  2. 唤醒处理

    • 检测到总线唤醒事件时
    • 调用EcuM_CheckWakeup()通知ECU管理器
    • 可能触发系统从低功耗模式唤醒
  3. 溢出处理

    • 接收缓冲区溢出时
    • 根据配置丢弃新消息或覆盖旧消息
    • 可能报告溢出错误

8. 总结

AUTOSAR CAN驱动是连接上层软件与CAN控制器硬件的关键模块,提供了标准化的接口和功能。通过本文的详细解析,我们了解了以下关键特性:

  • 架构设计:CAN驱动在AUTOSAR分层架构中的位置与作用
  • 状态管理:通过状态机实现CAN控制器的生命周期管理
  • 配置结构:灵活的配置机制支持不同硬件平台和应用需求
  • 消息处理:标准化的消息收发流程,支持中断和轮询模式
  • API接口:完善的接口设计,满足上层模块的各种需求
  • 错误处理:健壮的错误检测和处理机制

基于AUTOSAR标准的CAN驱动模块具有以下优势:

  • 可移植性:标准化接口使软件可在不同硬件平台间移植
  • 可扩展性:支持多种CAN控制器配置和功能扩展
  • 可靠性:完善的错误处理机制提高系统稳定性
  • 标准化:符合汽车行业标准,易于集成和维护

功能。通过本文的详细解析,我们了解了以下关键特性:

  • 架构设计:CAN驱动在AUTOSAR分层架构中的位置与作用
  • 状态管理:通过状态机实现CAN控制器的生命周期管理
  • 配置结构:灵活的配置机制支持不同硬件平台和应用需求
  • 消息处理:标准化的消息收发流程,支持中断和轮询模式
  • API接口:完善的接口设计,满足上层模块的各种需求
  • 错误处理:健壮的错误检测和处理机制

基于AUTOSAR标准的CAN驱动模块具有以下优势:

  • 可移植性:标准化接口使软件可在不同硬件平台间移植
  • 可扩展性:支持多种CAN控制器配置和功能扩展
  • 可靠性:完善的错误处理机制提高系统稳定性
  • 标准化:符合汽车行业标准,易于集成和维护

在实际应用中,开发者可以根据具体项目需求,配置CAN驱动的工作模式、中断处理方式和错误处理策略,以满足不同应用场景的性能和可靠性要求。

你可能感兴趣的:(java,微服务,开发语言,AUTOSAR,嵌入式,汽车,单片机)