AUTOSAR进阶图解==>AUTOSAR_SRS_EEPROMDriver

AUTOSAR EEPROM驱动程序详解

AUTOSAR标准微控制器抽象层模块解析

目录


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驱动程序的主要配置参数包括:

  1. 通知回调函数

    • Eep_JobEndNotification:作业成功完成时的回调函数
    • Eep_JobErrorNotification:作业失败时的回调函数
  2. 操作模式参数

    • Eep_DefaultMode:默认操作模式(正常模式或快速模式)
    • 正常模式下的读写块大小
    • 快速模式下的读写块大小
  3. 扇区配置

    • 扇区数量
    • 每个扇区的起始地址
    • 每个扇区的大小
    • 页大小和页数量

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驱动程序的状态转换包括:

  1. 初始化转换

    • 上电或复位时进入未初始化状态
    • 调用Eep_Init()后从未初始化状态转为空闲状态
  2. 作业启动转换

    • 调用读/写/比较/擦除函数时从空闲状态转为忙碌状态
  3. 作业完成转换

    • 作业完成时从忙碌状态转回空闲状态
    • 调用Eep_Cancel()取消作业时从忙碌状态转回空闲状态
    • 作业超时时从忙碌状态转回空闲状态
  4. 模式切换

    • 在空闲状态下可以通过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驱动程序在汽车电子系统中扮演着重要角色,用于存储配置数据、校准参数和诊断信息等非易失性数据,确保关键数据在系统断电后仍能保存。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

打赏作者

KaiGer666

慧眼~施主!!!

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

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

打赏作者

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

抵扣说明:

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

余额充值