AUTOSAR EEPROM驱动程序详解
目录
1. EEPROM驱动程序概述
EEPROM(Electrically Erasable Programmable Read-Only Memory,电可擦除可编程只读存储器)驱动程序是AUTOSAR微控制器抽象层(MCAL)中的标准模块,提供对EEPROM硬件的标准化访问接口。
1.1 功能范围
EEPROM驱动程序提供以下主要功能:
- 初始化EEPROM硬件
- 提供标准化的读写操作接口
- 支持非阻塞式操作模型
- 提供作业状态查询和管理
- 提供错误检测和报告机制
- 支持不同操作模式(正常模式和快速模式)
1.2 在AUTOSAR架构中的位置
EEPROM驱动程序位于AUTOSAR架构的微控制器抽象层(MCAL),为上层软件提供硬件无关的接口,实现对底层EEPROM硬件的访问。
图1. EEPROM驱动程序架构图
图1解释:
模块 EEPROM驱动程序:
- 功能:提供标准化的API用于访问EEPROM硬件,实现读写操作,并处理硬件相关的时序和协议
- 位置:位于微控制器抽象层(MCAL),直接与EEPROM控制器硬件交互
层次关系:
- 应用层软件组件通过RTE请求存储服务
- 服务层的存储管理器协调多种存储设备的访问
- ECU抽象层的EEPROM抽象层提供硬件无关的标准化接口
- MCAL层的EEPROM驱动程序实现特定硬件的访问操作
- 微控制器层的EEPROM控制器是实际的硬件组件
/* EEPROM驱动程序的初始化示例代码 */
void Ecu_Init(void)
{
/* 创建EEPROM驱动程序配置 */
Eep_ConfigType eepConfig;
/* 配置EEPROM驱动程序参数 */
eepConfig.Eep_DefaultMode = EEP_NORMAL_MODE;
eepConfig.Eep_JobEndNotification = &Eep_JobEndNotificationCallback;
eepConfig.Eep_JobErrorNotification = &Eep_JobErrorNotificationCallback;
/* 初始化EEPROM驱动程序 */
Eep_Init(&eepConfig);
/* 初始化其他相关模块 */
MemIf_Init();
}
2. EEPROM驱动程序架构
2.1 模块架构
EEPROM驱动程序作为MCAL层的一部分,实现了对EEPROM硬件的直接访问。它向上层提供标准化的接口,向下与硬件交互。
2.2 组件结构
EEPROM驱动程序内部由几个主要功能模块组成,包括初始化模块、作业处理模块、状态管理模块和硬件抽象模块。
图2. EEPROM驱动程序组件图
图2解释:
组件 EEPROM驱动程序:
- 功能:提供标准化接口用于访问EEPROM硬件
- 主要接口:
Init
:初始化驱动程序Read
:读取EEPROM数据Write
:写入EEPROM数据Cancel
:取消当前作业GetStatus
:获取驱动程序状态GetJobResult
:获取作业执行结果SetMode
:设置驱动程序模式GetVersionInfo
:获取版本信息
内部组件:
- 初始化模块:负责驱动程序和硬件的初始化
- 作业处理模块:负责处理读写作业、作业队列管理、硬件操作协调
- 状态管理模块:负责维护驱动程序状态、处理作业结果、模式管理
- 硬件抽象模块:负责实际的硬件交互操作
外部依赖:
- 上层模块通过标准接口调用EEPROM驱动程序
- EEPROM驱动程序使用MCU驱动程序获取系统信息
- EEPROM驱动程序向DEM报告错误状态
/* EEPROM驱动程序接口定义示例 */
/* 初始化函数 */
void Eep_Init(const Eep_ConfigType* ConfigPtr);
/* 读取函数 */
Std_ReturnType Eep_Read(Eep_AddressType TargetAddress,
uint8* DataBufferPtr,
Eep_LengthType Length);
/* 写入函数 */
Std_ReturnType Eep_Write(Eep_AddressType TargetAddress,
const uint8* DataBufferPtr,
Eep_LengthType Length);
/* 取消函数 */
void Eep_Cancel(void);
/* 获取状态函数 */
MemIf_StatusType Eep_GetStatus(void);
/* 获取作业结果函数 */
MemIf_JobResultType Eep_GetJobResult(void);
/* 设置模式函数 */
void Eep_SetMode(MemIf_ModeType Mode);
/* 获取版本信息函数 */
void Eep_GetVersionInfo(Std_VersionInfoType* VersionInfoPtr);
/* 主函数 */
void Eep_MainFunction(void);
3. EEPROM驱动程序配置
3.1 配置类结构
EEPROM驱动程序的配置结构定义了驱动程序的行为和参数。这些配置参数在初始化时提供给驱动程序。
图3. EEPROM驱动程序配置类图
图3解释:
类 Eep_ConfigType:
- 功能:EEPROM驱动程序的主配置结构,包含所有必要的配置参数和回调函数
- 关键属性:
Eep_JobEndNotification
:作业完成通知回调函数Eep_JobErrorNotification
:作业错误通知回调函数Eep_DefaultMode
:默认操作模式Eep_ConfigSet
:指向配置集的指针
类 Eep_ConfigSetType:
- 功能:配置集合,包含EEPROM操作相关配置
- 关键属性:
Eep_JobEndNotificationEnable
:是否启用作业完成通知Eep_JobErrorNotificationEnable
:是否启用作业错误通知Eep_NormalReadBlockSize
:正常模式读取块大小Eep_NormalWriteBlockSize
:正常模式写入块大小Eep_FastReadBlockSize
:快速模式读取块大小Eep_FastWriteBlockSize
:快速模式写入块大小Eep_SectorList
:扇区列表
类 Eep_SectorType:
- 功能:描述EEPROM存储器中一个扇区的特性
- 关键属性:
Eep_SectorStartAddress
:扇区起始地址Eep_SectorSize
:扇区大小Eep_PageSize
:页大小Eep_NumberOfPages
:页数量
/* EEPROM驱动程序配置结构定义示例 */
typedef struct {
/* 回调函数 */
Eep_JobEndNotificationType Eep_JobEndNotification;
Eep_JobErrorNotificationType Eep_JobErrorNotification;
/* 基本配置 */
uint8 Eep_DeviceIndex;
Eep_ModeType Eep_DefaultMode;
uint8 Eep_NumOfHwUnits;
/* 配置集 */
Eep_ConfigSetType* Eep_ConfigSet;
} Eep_ConfigType;
typedef struct {
/* 通知配置 */
boolean Eep_JobEndNotificationEnable;
boolean Eep_JobErrorNotificationEnable;
/* 块大小配置 */
uint16 Eep_NormalReadBlockSize;
uint16 Eep_NormalWriteBlockSize;
uint16 Eep_FastReadBlockSize;
uint16 Eep_FastWriteBlockSize;
/* 扇区配置 */
uint8 Eep_NumberOfSectors;
Eep_SectorType* Eep_SectorList;
} Eep_ConfigSetType;
typedef struct {
Eep_AddressType Eep_SectorStartAddress;
Eep_LengthType Eep_SectorSize;
uint8 Eep_SectorNumber;
uint16 Eep_PageSize;
uint16 Eep_NumberOfPages;
} Eep_SectorType;
/* 配置初始化示例 */
void ConfigureEEPROM(void)
{
static Eep_SectorType sectorList[EEP_NUM_SECTORS];
static Eep_ConfigSetType configSet;
static Eep_ConfigType eepConfig;
/* 配置扇区 */
sectorList[0].Eep_SectorStartAddress = 0x00000000;
sectorList[0].Eep_SectorSize = 0x1000; /* 4KB */
sectorList[0].Eep_SectorNumber = 0;
sectorList[0].Eep_PageSize = 64; /* 64字节 */
sectorList[0].Eep_NumberOfPages = 64; /* 64页 */
/* 配置配置集 */
configSet.Eep_JobEndNotificationEnable = TRUE;
configSet.Eep_JobErrorNotificationEnable = TRUE;
configSet.Eep_NormalReadBlockSize = 8;
configSet.Eep_NormalWriteBlockSize = 8;
configSet.Eep_FastReadBlockSize = 16;
configSet.Eep_FastWriteBlockSize = 16;
configSet.Eep_NumberOfSectors = EEP_NUM_SECTORS;
configSet.Eep_SectorList = sectorList;
/* 配置驱动程序 */
eepConfig.Eep_JobEndNotification = &Eep_JobEndNotificationCallback;
eepConfig.Eep_JobErrorNotification = &Eep_JobErrorNotificationCallback;
eepConfig.Eep_DeviceIndex = 0;
eepConfig.Eep_DefaultMode = EEP_NORMAL_MODE;
eepConfig.Eep_NumOfHwUnits = 1;
eepConfig.Eep_ConfigSet = &configSet;
/* 初始化EEPROM驱动程序 */
Eep_Init(&eepConfig);
}
3.2 配置参数
EEPROM驱动程序的主要配置参数包括:
-
通知回调函数:
Eep_JobEndNotification
:作业成功完成时的回调函数Eep_JobErrorNotification
:作业失败时的回调函数
-
操作模式参数:
Eep_DefaultMode
:默认操作模式(正常模式或快速模式)- 正常模式下的读写块大小
- 快速模式下的读写块大小
-
扇区配置:
- 扇区数量
- 每个扇区的起始地址
- 每个扇区的大小
- 页大小和页数量
4. EEPROM驱动程序状态机
4.1 状态描述
EEPROM驱动程序实现了一个状态机,用于管理驱动程序的不同状态和作业处理。
图4. EEPROM驱动程序状态图
图4解释:
状态 未初始化(EEP_UNINIT):
- 描述:驱动程序未初始化状态
- 特点:
- 驱动程序未初始化
- 禁止所有读写操作
- 仅接受
Eep_Init()
调用
状态 空闲(EEP_IDLE):
- 描述:驱动程序空闲状态
- 特点:
- 驱动程序已初始化
- 没有正在进行的作业
- 可以开始新的读写操作
- 可以设置驱动程序模式
状态 忙碌(EEP_BUSY):
- 描述:驱动程序忙碌状态
- 特点:
- 有作业正在处理中
- 新的读写请求将被拒绝
- 可以调用
Eep_Cancel()
取消作业 Eep_MainFunction()
处理作业执行
子状态:
- 读取操作:从EEPROM读取数据到RAM
- 写入操作:将RAM数据写入EEPROM
- 比较操作:比较EEPROM和RAM数据
- 擦除操作:擦除EEPROM数据
/* EEPROM驱动程序状态管理示例代码 */
MemIf_StatusType Eep_CurrentStatus = EEP_UNINIT;
MemIf_JobResultType Eep_JobResult = MEMIF_JOB_OK;
/* 状态转换函数示例 */
void Eep_SetState(MemIf_StatusType NewState)
{
Eep_CurrentStatus = NewState;
}
/* 读取操作示例 */
Std_ReturnType Eep_Read(Eep_AddressType TargetAddress,
uint8* DataBufferPtr,
Eep_LengthType Length)
{
/* 检查驱动程序状态 */
if (Eep_CurrentStatus == EEP_UNINIT) {
/* 驱动程序未初始化,返回错误 */
return E_NOT_OK;
}
if (Eep_CurrentStatus == EEP_BUSY) {
/* 驱动程序忙碌,返回错误 */
return E_NOT_OK;
}
/* 准备读取作业 */
/* ... 读取作业准备代码 ... */
/* 设置状态为忙碌 */
Eep_SetState(EEP_BUSY);
/* 设置作业结果为挂起 */
Eep_JobResult = MEMIF_JOB_PENDING;
return E_OK;
}
4.2 状态转换
EEPROM驱动程序的状态转换包括:
-
初始化转换:
- 上电或复位时进入未初始化状态
- 调用
Eep_Init()
后从未初始化状态转为空闲状态
-
作业启动转换:
- 调用读/写/比较/擦除函数时从空闲状态转为忙碌状态
-
作业完成转换:
- 作业完成时从忙碌状态转回空闲状态
- 调用
Eep_Cancel()
取消作业时从忙碌状态转回空闲状态 - 作业超时时从忙碌状态转回空闲状态
-
模式切换:
- 在空闲状态下可以通过
Eep_SetMode()
切换操作模式
- 在空闲状态下可以通过
5. EEPROM驱动程序操作流程
5.1 初始化流程
EEPROM驱动程序的初始化流程包括配置驱动程序参数、初始化硬件和设置初始状态。
5.2 读写操作流程
EEPROM驱动程序采用非阻塞式操作模型,读写操作通过作业队列和状态管理机制实现。
图5. EEPROM驱动程序读写操作序列图
图5解释:
序列 初始化:
- 应用层调用
Eep_Init(ConfigPtr)
初始化EEPROM驱动程序 - EEPROM驱动程序获取系统时钟频率,配置EEPROM参数
- 驱动程序状态设置为EEP_IDLE
序列 读取操作:
- 应用层通过存储管理器请求读取操作
- 请求传递到EEPROM驱动程序的
Eep_Read()
函数 - 驱动程序检查状态:
- 如果为EEP_IDLE,准备读取作业,状态设置为EEP_BUSY
- 如果为EEP_BUSY或EEP_UNINIT,返回错误
序列 作业处理:
- 调度器调用
Eep_MainFunction()
- 驱动程序处理当前作业(读取/写入)
- 根据操作结果设置作业结果:
- 成功时设置为MEMIF_JOB_OK,并可能调用作业完成通知
- 失败时设置为MEMIF_JOB_FAILED,报告错误,并可能调用作业错误通知
- 处理完成后状态设置回EEP_IDLE
序列 状态和结果检查:
- 应用层可以通过
Eep_GetStatus()
查询驱动程序当前状态 - 应用层可以通过
Eep_GetJobResult()
查询作业执行结果
/* EEPROM驱动程序操作流程示例代码 */
/* 应用层代码 */
void Application_WriteData(void)
{
uint8 data[8] = {1, 2, 3, 4, 5, 6, 7, 8};
Std_ReturnType result;
/* 写入请求 */
result = Eep_Write(0x1000, data, 8);
if (result == E_OK) {
/* 写入请求已接受 */
/* 可以通过轮询或通知获知完成状态 */
} else {
/* 写入请求被拒绝 */
/* 可能是驱动程序忙或未初始化 */
}
}
/* 轮询检查示例 */
void Application_PollJobStatus(void)
{
MemIf_StatusType status;
MemIf_JobResultType jobResult;
/* 获取当前状态 */
status = Eep_GetStatus();
if (status == EEP_IDLE) {
/* 驱动程序空闲,检查作业结果 */
jobResult = Eep_GetJobResult();
switch (jobResult) {
case MEMIF_JOB_OK:
/* 作业成功完成 */
break;
case MEMIF_JOB_FAILED:
/* 作业失败 */
break;
case MEMIF_JOB_CANCELED:
/* 作业被取消 */
break;
default:
/* 其他结果 */
break;
}
}
}
/* 通知回调示例 */
void Eep_JobEndNotificationCallback(void)
{
/* 作业成功完成的处理 */
/* 可以触发应用层的后续操作 */
}
void Eep_JobErrorNotificationCallback(void)
{
/* 作业失败的处理 */
/* 可以触发错误恢复操作 */
}
6. 总结
AUTOSAR EEPROM驱动程序作为MCAL层的标准模块,提供了对EEPROM硬件的标准化访问接口。其主要特点包括:
- 标准化接口:符合AUTOSAR规范的标准接口,确保软件兼容性
- 非阻塞操作:采用非阻塞式操作模型,提高系统响应性
- 状态管理:完善的状态管理机制,确保操作安全性
- 配置灵活:丰富的配置选项,适应不同硬件平台
- 错误处理:完善的错误检测和报告机制
EEPROM驱动程序在汽车电子系统中扮演着重要角色,用于存储配置数据、校准参数和诊断信息等非易失性数据,确保关键数据在系统断电后仍能保存。