AUTOSAR进阶图解==>AUTOSAR_SWS_CANTransceiverDriver
AUTOSAR CAN收发器驱动(CanTrcv)详解
目录
- 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分层架构中的位置及其与其他模块的关系:
-
通信服务层:
- CAN接口(CanIf):作为上层抽象接口,负责协调CAN控制器和CAN收发器
- 通信管理器(ComM):负责管理网络通信,通过CanIf控制收发器模式
-
ECU抽象层:
- CAN收发器驱动(CanTrcv):本模块,提供对CAN收发器硬件的抽象访问
-
微控制器抽象层:
- 数字输入输出(DIO):用于访问通过GPIO连接的CAN收发器
- SPI处理驱动(SPI):用于访问通过SPI总线连接的CAN收发器
-
系统服务:
- ECU管理器(EcuM):接收唤醒通知
- 开发错误追踪器(DET):接收开发错误信息
- 生产错误管理器(DEM):接收生产错误信息
2.3 组件交互关系
CanTrcv模块与其他模块之间的交互关系:
-
CanTrcv与CanIf:
- CanIf通过CanTrcv_API调用CanTrcv的函数来控制收发器
- CanTrcv通过回调函数向CanIf通知状态变化和唤醒事件
-
CanTrcv与硬件层:
- 对于GPIO连接的收发器,CanTrcv通过DIO驱动访问硬件
- 对于SPI连接的收发器,CanTrcv通过SPI驱动访问硬件
-
CanTrcv与系统服务:
- CanTrcv向DET报告开发错误
- CanTrcv向DEM报告生产错误
- CanTrcv产生的唤醒事件通过CanIf传递给EcuM
这种分层架构和清晰的接口定义,使得CAN收发器驱动可以独立于具体硬件实现,支持不同类型的CAN收发器,便于系统集成和维护。
3. 状态机模型
3.1 操作模式概述
CAN收发器驱动定义了一个状态机模型,用于管理收发器的不同操作模式。这个模型包含以下几种状态:
- 未初始化(UNINIT):驱动初始化前的状态
- 正常模式(NORMAL):收发器完全激活,可以发送和接收CAN帧
- 待机模式(STANDBY):低功耗模式,但可以监控总线活动用于唤醒
- 休眠模式(SLEEP):最低功耗模式,通常需要特定唤醒事件才能退出
3.2 状态转换流程
CAN收发器的状态转换如下图所示:
3.3 事件与触发条件
从状态图中可以看出以下关键转换点和事件:
-
初始化转换:
- 系统启动时,通过调用
CanTrcv_Init()
将收发器从UNINIT状态转换到STANDBY状态 - 初始化配置可以指定初始状态(通常为STANDBY)
- 系统启动时,通过调用
-
运行时转换:
- 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)
从睡眠中唤醒
- STANDBY → NORMAL:通过
-
状态特性:
- STANDBY状态:支持唤醒检测,所有CAN收发器硬件类型都必须支持
- NORMAL状态:CAN总线通信活动状态,BUS引脚有效
- SLEEP状态:最低功耗模式,仍然可以通过总线活动唤醒
这种状态机模型的设计保证了CAN收发器在不同操作场景下的有效管理,特别是在需要节能的ECU休眠/唤醒场景中。
4. 唤醒机制
4.1 唤醒模式
CAN收发器驱动支持两种唤醒模式:
-
不支持唤醒(CANTRCV_WAKEUP_NOT_SUPPORTED):
- 在此模式下,CAN收发器不会产生任何唤醒事件
- 即使有CAN总线活动也不会触发唤醒
-
轮询唤醒(CANTRCV_WAKEUP_POLLING):
- 通过周期性调用
CanTrcv_MainFunction()
检查唤醒事件 - 需要软件定期轮询收发器状态
- 可能导致CAN通道唤醒,但不会触发MCU唤醒
- 通过周期性调用
选择哪种唤醒模式通过配置参数CanTrcvWakeupSupport
来确定。同时,可以通过CanTrcvWakeupByBusUsed
参数为每个CAN收发器单独开启或关闭唤醒支持。
4.2 唤醒序列
CAN收发器驱动的唤醒处理序列如下图所示:
4.3 唤醒原因分类
唤醒序列图展示了CAN收发器的完整唤醒流程:
-
唤醒检测阶段:
- CAN总线活动触发CAN收发器硬件产生唤醒事件
CanTrcv_MainFunction()
周期性调用检查收发器唤醒状态- 检测到唤醒事件后,通过
CanIf_TrcvWakeupNotification
通知CanIf - CanIf调用
EcuM_SetWakeupEvent
通知ECU管理器
-
唤醒验证阶段:
- ECU管理器调用
CanIf_CheckWakeup
请求验证唤醒源 - CanIf调用
CanTrcv_CheckWakeup
验证收发器唤醒事件 - CanTrcv读取收发器状态并验证唤醒原因
- 如果唤醒有效,通过
CanIf_TrcvWakeupNotification
再次通知CanIf - CanIf调用
EcuM_ValidateWakeupEvent
确认唤醒事件
- ECU管理器调用
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收发器驱动的完整配置结构:
-
CanTrcvConfigSet:顶层配置容器
- 包含一个通用配置(CanTrcvGeneral)
- 包含一个或多个通道配置(CanTrcvChannel)
-
CanTrcvGeneralType:通用配置参数
- CanTrcvDevErrorDetect:是否开启开发错误检测功能,类型为boolean
- CanTrcvIndex:驱动索引,类型为uint8
- CanTrcvMainFunctionDiagnosticsPeriod:诊断主函数调用周期,单位为秒,类型为float
- CanTrcvMainFunctionPeriod:主函数调用周期,单位为秒,类型为float
- CanTrcvVersionInfoApi:是否启用版本信息API,类型为boolean
-
CanTrcvChannelType:通道配置参数
- CanTrcvChannelId:通道标识符,类型为uint8
- CanTrcvWakeupByBusUsed:是否启用总线唤醒功能,类型为boolean
- CanTrcvWakeupSource:唤醒源标识符,类型为EcuMWakeupSourceType
- CanTrcvWakeupSupport:唤醒支持模式,类型为CanTrcvWakeupModeType
- CanTrcvSleepWaitCount:切换到休眠模式的等待计数,类型为uint32
- CanTrcvIcuChannelRef:ICU通道引用,类型为reference
- CanTrcvPnSupport:是否支持部分网络,类型为boolean
- CanTrcvHwPnSupport:硬件是否支持部分网络,类型为boolean
- CanTrcvChannelUsed:通道是否使用,类型为boolean
- CanTrcvInitState:初始化状态,类型为CanTrcv_TrcvModeType
-
枚举类型:
- CanTrcvWakeupModeType:唤醒模式
- CANTRCV_WAKEUP_NOT_SUPPORTED:不支持唤醒
- CANTRCV_WAKEUP_POLLING:轮询唤醒
- CanTrcv_TrcvModeType:收发器模式
- CANTRCV_TRCVMODE_NORMAL:正常模式
- CANTRCV_TRCVMODE_STANDBY:待机模式
- CANTRCV_TRCVMODE_SLEEP:休眠模式
- CanTrcv_TrcvWakeupReasonType:唤醒原因
- 多种不同的唤醒原因类型,如总线唤醒、引脚唤醒等
- CanTrcvWakeupModeType:唤醒模式
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接口:
-
初始化函数:
CanTrcv_Init(ConfigPtr)
:初始化CAN收发器驱动
-
模式控制函数:
CanTrcv_SetOpMode(Transceiver, OpMode)
:设置收发器操作模式CanTrcv_GetOpMode(Transceiver, OpMode)
:获取收发器当前操作模式
-
唤醒相关函数:
CanTrcv_GetBusWuReason(Transceiver, Reason)
:获取唤醒原因CanTrcv_CheckWakeup(Transceiver)
:检查并验证唤醒事件CanTrcv_MainFunction()
:周期性检查收发器状态
-
版本信息函数:
CanTrcv_GetVersionInfo(VersionInfo)
:获取模块版本信息
6.2 API调用序列
CAN收发器驱动的典型API调用序列如下图所示:
6.3 错误处理
API调用序列图展示了CAN收发器驱动API的典型调用流程:
-
初始化流程:
- 上层模块调用
CanTrcv_Init
进行初始化 - CanTrcv配置和初始化硬件
- 初始化后收发器处于配置指定的状态(通常是STANDBY)
- 上层模块调用
-
模式切换操作:
- 上层调用
CanTrcv_SetOpMode
请求切换模式 - CanTrcv进行参数检查
- 如有错误则报告给DET
- 设置硬件到请求的模式
- 通过
CanIf_TrcvModeIndication
回调通知上层模式已更改
- 上层调用
-
状态查询操作:
- 上层调用
CanTrcv_GetOpMode
获取当前模式 - CanTrcv读取硬件状态并返回
- 上层调用
-
唤醒原因查询:
- 上层调用
CanTrcv_GetBusWuReason
获取唤醒原因 - CanTrcv从硬件获取唤醒信息并返回
- 上层调用
-
周期性处理:
- 定时调用
CanTrcv_MainFunction
- 检查硬件状态变化
- 如有模式变化或唤醒事件则通知上层
- 定时调用
CAN收发器驱动支持两类错误处理:
-
开发错误(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:初始化失败
-
运行时错误(Runtime Errors):
- CANTRCV_E_NO_TRCV_CONTROL:与收发器通信错误
开发错误通过DET报告,运行时错误通过DEM报告,确保系统可以对各种异常情况作出适当响应。
7. 总结
AUTOSAR CAN收发器驱动(CanTrcv)是汽车电子控制单元中重要的基础软件组件,具有以下特点:
-
标准化接口:
- 提供符合AUTOSAR规范的标准API
- 使上层软件可以以统一方式控制不同类型的CAN收发器硬件
-
灵活的配置:
- 支持多种操作模式:正常、待机和休眠
- 提供全面的配置选项以适应不同应用需求
-
高效能源管理:
- 通过精细的状态控制实现功耗优化
- 支持多种唤醒机制,确保系统可以及时响应唤醒事件
-
鲁棒性设计:
- 全面的错误检测与处理
- 状态验证与安全转换逻辑
-
可扩展性:
- 支持多个收发器实例
- 适配不同的硬件接口(GPIO/SPI)
对于汽车电子系统开发人员而言,深入理解CAN收发器驱动的工作原理、配置选项和API使用方法,对于实现高效、可靠的CAN通信系统至关重要。特别是在低功耗场景和网络管理策略中,合理配置和使用CAN收发器驱动可以显著提升系统性能和用户体验。
AUTOSAR规范的标准API
- 使上层软件可以以统一方式控制不同类型的CAN收发器硬件
-
灵活的配置:
- 支持多种操作模式:正常、待机和休眠
- 提供全面的配置选项以适应不同应用需求
-
高效能源管理:
- 通过精细的状态控制实现功耗优化
- 支持多种唤醒机制,确保系统可以及时响应唤醒事件
-
鲁棒性设计:
- 全面的错误检测与处理
- 状态验证与安全转换逻辑
-
可扩展性:
- 支持多个收发器实例
- 适配不同的硬件接口(GPIO/SPI)
对于汽车电子系统开发人员而言,深入理解CAN收发器驱动的工作原理、配置选项和API使用方法,对于实现高效、可靠的CAN通信系统至关重要。特别是在低功耗场景和网络管理策略中,合理配置和使用CAN收发器驱动可以显著提升系统性能和用户体验。
通过本文对AUTOSAR CAN收发器驱动的全面解析,开发人员可以更好地理解和应用这一关键基础软件组件,为汽车电子系统开发提供坚实基础。