# EEPROM 驱动规范 > **文档标题**: Specification of EEPROM Driver > **AUTOSAR CP Release**: 4.4.0 > **文档编号**: 021 > **文档类型**: SWS (Software Specification) --- ## 文档标识 | 项目 | 内容 | |------|------| | Document Title | Specification of EEPROM Driver | | Document Owner | AUTOSAR | | Document Responsibility | AUTOSAR | | Document Identification No | 021 | | Document Status | Final | | Part of AUTOSAR Standard | Classic Platform | | Part of Standard Release | 4.4.0 | --- ## 文档变更历史 | 日期 | 版本 | 变更者 | 变更描述 | |------|------|--------|----------| | 2018-10-31 | 4.4.0 | AUTOSAR Release Management | MCAL 多核分发 | | 2017-12-08 | 4.3.1 | AUTOSAR Release Management | 将 EEP_E_TIMEOUT 和 EEP_E_BUSY 从开发错误改为运行时错误;更改 ECUC_Eep_00189 描述 | | 2016-11-30 | 4.3.0 | AUTOSAR Release Management | 删除过时的 7.11 "调试支持"章节和 10.2.1 "变体"子章节;按字节读/写/擦除访问适配;传递给函数的 DataBuffers 对齐 | | 2015-07-31 | 4.2.2 | AUTOSAR Release Management | DET 重命名和适配;第 7 章错误分类适配 | | 2014-10-31 | 4.2.1 | AUTOSAR Release Management | 为扩展生产错误增加通过/失败标准和额外属性;移除 Eep_Init() 关于 NULL_PTR 检查的冗余 SWS ID | | 2014-03-31 | 4.1.3 | AUTOSAR Release Management | 修正 SWS_Eep_00102、SWS_Eep_00068 和 SWS_Eep_00137 的格式 | | 2013-10-31 | 4.1.2 | AUTOSAR Release Management | 从 Eep_MainFunction API 表中移除 'Timing' 行;编辑性修订 | | 2013-03-15 | 4.1.1 | AUTOSAR Administration | MemMap.h 改为 Eep_MemMap.h;新增扩展生产错误 | | 2011-12-22 | 4.0.3 | AUTOSAR Administration | EEP178 & EEP185 增加 FloatParamDef 参数最小最大值;模块短名称替换为模块缩写 | | 2010-09-30 | 3.1.5 | AUTOSAR Administration | 新增 DET 错误 EEP_E_PARAM_POINTER、EEP_E_TIMEOUT;版本检查章节(7.10)修订 | | 2010-02-02 | 3.1.4 | AUTOSAR Administration | 使 SWS_Eep_00003、SWS_Eep_00030、SWS_Eep_00128 中隐藏文本可见;澄清可选回调通知;重做外部 SPI EEPROM 配置示例;改用 VARIANT-POST-BUILD 替代 VARIANT-LINK-TIME;澄清 Eep_Cancel() 同步行为;添加调试支持;新增 HW 故障 DEM 错误代码 | | 2008-08-13 | 3.1.1 | AUTOSAR Administration | 法律免责声明修订 | | 2007-12-21 | 3.0.1 | AUTOSAR Administration | SWS_Eep_00005 措辞微调;新增 NULL_PTR 检查需求(SWS_Eep_00161, 00162);更新 SWS_Eep_00028 和图 4 | | 2007-01-24 | 2.1.15 | AUTOSAR Administration | 常量名修正;擦写周期限制;链接时配置 vs 配置指针检查;比较作业的作业结果未规定 | | 2006-05-16 | 2.0 | AUTOSAR Administration | 文档结构适配 Release 2.0 SWS 模板;适配新的内存抽象架构;取消功能改为异步 | | 2005-05-31 | 1.0 | AUTOSAR Administration | 初始发布 | --- ## 目录 1. [介绍与功能概述](#1-介绍与功能概述) 2. [缩略语](#2-缩略语) 3. [相关文档](#3-相关文档) 4. [约束与假设](#4-约束与假设) 5. [模块依赖](#5-模块依赖) 6. [需求追溯](#6-需求追溯) 7. [功能规范](#7-功能规范) 8. [API 规范](#8-api-规范) 9. [时序图](#9-时序图) 10. [配置规范](#10-配置规范) 11. [不适用需求](#11-不适用需求) --- ## 1 介绍与功能概述 本规范描述 EEPROM 驱动的功能和 API。本规范同时适用于内部和外部 EEPROM 驱动。 EEPROM 驱动提供对 EEPROM 进行读、写、擦除的服务。它还提供将 EEPROM 中数据块与内存(如 RAM)中数据块进行比较的服务。 这些服务的行为是异步的。 内部 EEPROM 驱动直接访问微控制器硬件,位于微控制器抽象层(MCAL)。外部 EEPROM 驱动使用处理程序(大多数情况下为 SPI)或驱动访问外部 EEPROM 设备,位于 ECU 抽象层。 两类驱动的功能需求和功能范围相同,因此 API 在语义上相同。 --- ## 2 缩略语 | 缩略语 | 描述 | |--------|------| | Data block(数据块) | 一个数据块可包含 1..n 字节,在 EEPROM 驱动 API 中使用。数据块以 EEPROM 中的地址偏移、指向内存位置的指针、长度传递给 EEPROM 驱动。 | | Data unit(数据单元) | EEPROM 中最小数据实体。对读/写/擦除操作可能不同。
**示例 1**:Motorola STAR12 — 读:1 字节;写:2 字节;擦:4 字节
**示例 2**:外部 SPI EEPROM 设备 — 读/写/擦:1 字节 | | Normal mode(普通模式) | 通过 SPI 与 EEPROM 设备的数据交换按字节进行,允许与其他 SPI 设备(如 I/O ASIC、外部看门狗等)协作使用 SPI。 | | Burst mode(突发模式) | 通过 SPI 与 EEPROM 设备的数据交换按块进行。块大小取决于 EEPROM 属性,例如 64 字节。由于传输大块,SPI 在突发模式下被 EEPROM 访问阻塞。此模式用于 ECU 启动和关机阶段,需要快速数据读写。 | | EEPROM cell | 持有数据的 EEPROM 设备最小物理单元。通常为 1 字节。 | | 缩写 | 描述 | |------|------| | EEPROM | 电可擦可编程只读存储器 | | NVRAM | 非易失随机存取存储器 | | NvM | NVRAM Manager 模块名 | | EcuM | ECU State Manager 模块名 | | DEM | Diagnostic Event Manager 模块名 | | DET | Default Error Tracer 模块名 | --- ## 3 相关文档 ### 3.1 输入文档 - [1] Layered Software Architecture — AUTOSAR_EXP_LayeredSoftwareArchitecture.pdf - [2] General Requirements on Basic Software Modules — AUTOSAR_SRS_BSWGeneral.pdf - [3] Specification of Memory Abstraction Interface — AUTOSAR_SWS_MemoryAbstractionInterface.pdf - [4] Specification of SPI Handler/Driver — AUTOSAR_SWS_SPIHandlerDriver.pdf - [5] Specification of ECU Configuration — AUTOSAR_TPS_ECUConfiguration.pdf - [6] Requirements on EEPROM Driver — AUTOSAR_SRS_EEPROMDriver.pdf - [7] Specification of Default Error Tracer — AUTOSAR_SWS_DefaultErrorTracer.pdf - [8] Specification of Diagnostics Event Manager — AUTOSAR_SWS_DiagnosticEventManager.pdf - [9] AUTOSAR Glossary — AUTOSAR_TR_Glossary.pdf - [10] Specification of MCU Driver — AUTOSAR_SWS_MCUDriver.pdf - [11] Basic Software Module Description Template — AUTOSAR_TPS_BSWModuleDescriptionTemplate.pdf - [12] List of Basic Software Modules — AUTOSAR_TR_BSWModuleList.pdf - [13] General Specification of Basic Software Modules — AUTOSAR_SWS_BSWGeneral.pdf ### 3.2 相关规范 AUTOSAR 提供基础软件模块通用规范 [13](SWS BSW General),也适用于 EEPROM 驱动。因此,SWS BSW General 规范应被视为 EEPROM 驱动的附加和必需规范。 --- ## 4 约束与假设 ### 4.1 限制 EEPROM 驱动不提供数据完整性机制(如校验和、冗余存储等)。 不提供 EEPROM 写保护设置。 ### 4.2 适用车型领域 无限制。 ### 4.3 适用安全相关环境 如果上层软件为安全相关数据提供以下机制,本模块可在安全相关系统中使用: - 校验和保护 - 使用数据前检查完整性 - 冗余存储 - 写入 EEPROM 后验证数据。可使用 EEPROM 驱动的比较函数。 --- ## 5 模块依赖 EEPROM 驱动有两类: 1. **片上 EEPROM 驱动**:微控制器抽象层(MCAL)的一部分。 2. **外部 EEPROM 设备驱动**:ECU 抽象层的一部分。 [SWS_Eep_00082] ⌈外部 EEPROM 驱动的源代码应独立于微控制器平台。⌋ () 内部 EEPROM 可能依赖系统时钟、预分频器和 PLL。因此,系统时钟的变更(如 PLL 开 → PLL 关)也可能影响 EEPROM 硬件的时钟设置。EEPROM Driver 模块在其 init 函数中不处理配置时钟、预分频器和 PLL 的寄存器。这必须由 MCU 模块 [10] 完成。 外部 EEPROM 驱动依赖所使用板载通信处理程序(如 SPI Handler/Driver)的 API 和能力。 EEPROM 驱动是内存抽象架构的一部分,因此某些类型依赖 Memory Interface (MemIf) 模块。 ### 5.1 文件结构 [SWS_Eep_00228] ⌈如果模块实现使用自定义中断处理,中断服务例程应放在 Eep_Irq.c。⌋ () --- ## 6 需求追溯 (详细需求追溯表请参考原文 PDF 第 6 章。涉及 SRS_BSW_*、SRS_Eep_*、SRS_SPAL_* 等多个需求类别。主要部分:) | 需求 | 满足者 | |------|--------| | SRS_BSW_00101 | SWS_Eep_00004 | | SRS_BSW_00323 | SWS_Eep_00016, 00017, 00018 | | SRS_BSW_00335 | SWS_Eep_00138 | | SRS_BSW_00337 | SWS_Eep_00000, 00200-00203 | | SRS_BSW_00406 | SWS_Eep_00006, 00033 | | SRS_Eep_00087 (异步读) | SWS_Eep_00009, 00013, 00256 | | SRS_Eep_00088 (异步写) | SWS_Eep_00014, 00015, 00063, 00090, 00256 | | SRS_Eep_00089 (异步擦除) | SWS_Eep_00019, 00020, 00070, 00072 | | SRS_Eep_00090 (同步取消) | SWS_Eep_00021, 00027, 00028, 00215, 00216 | | SRS_Eep_00091 (状态返回) | SWS_Eep_00029 | | SRS_Eep_00092 (写周期减少) | SWS_Eep_00060, 00064 | | SRS_Eep_00094 (内存分段) | SWS_Eep_00063, 00070, 00072, 00090 | | SRS_Eep_00095 (单作业处理) | SWS_Eep_00033, 00036 | | SRS_Eep_12047 (作业处理函数) | SWS_Eep_00030, 00032 | | SRS_Eep_12050 (硬件能力限制) | SWS_Eep_00051, 00054, 00057, 00069 | | SRS_Eep_12091 (异步比较) | SWS_Eep_00025, 00026, 00256 | | SRS_Eep_12124 (SPI 模式访问) | SWS_Eep_00052, 00053, 00055, 00073 | | SRS_Eep_12156 (模式切换) | SWS_Eep_00042, 00130, 00132 | | SRS_Eep_12157 (普通模式读) | SWS_Eep_00051, 00052, 00053 | | SRS_SPAL_12448 | SWS_Eep_00016, 00017, 00018, 00033 | 完整追溯表见原文 PDF。 --- ## 7 功能规范 ### 7.1 总体行为 [SWS_Eep_00088] ⌈Eep SWS 应同时适用于内部和外部 EEPROM。Eep SWS 定义 EEPROM 操作(读/写/擦除/比较)的异步服务。⌋ (SRS_Eep_12051) [SWS_Eep_00036] ⌈Eep 模块不应缓存作业。Eep 模块一次只接受一个作业。作业处理期间,Eep 模块不应接受其他作业。⌋ (SRS_Eep_00095) [SWS_Eep_00037] ⌈Eep 模块不应缓存要读取或写入的数据。Eep 模块应使用通过 API 传递的指针引用的应用数据缓冲区。⌋ (SRS_SPAL_12075) [SWS_Eep_00256] ⌈Eep 驱动应在内部处理数据缓冲区对齐。它不应对 RAM 缓冲区的对齐(因其为 uint8*)提出任何要求,而应将传入的指针视为仅按字节对齐。⌋ ### 7.2 错误分类 #### 7.2.1 开发错误 [SWS_Eep_00000] ⌈Eep 模块应根据其构建选项(开发/生产模式)检测以下错误: | 错误类型 | 相关性 | 相关错误代码 | 值[hex] | |----------|--------|--------------|---------| | 无效配置集选择 | Development | EEP_E_INIT_FAILED | 0x10 | | | | EEP_E_PARAM_ADDRESS | 0x11 | | | | EEP_E_PARAM_DATA | 0x12 | | | | EEP_E_PARAM_LENGTH | 0x13 | | 用 NULL 指针调用 API 服务 | Development | EEP_E_PARAM_POINTER | 0x23 | | 模块未初始化即调用 API 服务 | Development | EEP_E_UNINIT | 0x20 | ⌋ (SRS_BSW_00337, SRS_BSW_00385) #### 7.2.2 运行时错误 [SWS_Eep_00251] ⌈ | 错误类型 | 相关性 | 相关错误代码 | 值[hex] | |----------|--------|--------------|---------| | 驱动繁忙时调用 API 服务 | Runtime | EEP_E_BUSY | 0x21 | | 超时 | Runtime | EEP_E_TIMEOUT | 0x22 | ⌋ () #### 7.2.3 瞬态故障 无瞬态故障。 #### 7.2.4 生产错误 无生产错误。 #### 7.2.5 扩展生产错误 包括以下扩展生产错误: ##### EEP_E_ERASE_FAILED | 项 | 内容 | |-----|------| | Error Name | EEP_E_ERASE_FAILED | | Short Description | EEPROM 擦除失败(HW) | | Long Description | Eeprom 模块在 EEPROM 擦除作业因硬件错误失败时报告此错误。 | | Detection Criteria | Fail: EEPROM 擦除作业失败;Pass: EEPROM 擦除作业成功完成 | ##### EEP_E_WRITE_FAILED | 项 | 内容 | |-----|------| | Error Name | EEP_E_WRITE_FAILED | | Short Description | EEPROM 写失败(HW) | | Long Description | Eeprom 模块在 EEPROM 写作业因硬件错误失败时报告此错误。 | ##### EEP_E_READ_FAILED EEPROM 读作业因硬件错误失败。 ##### EEP_E_COMPARE_FAILED EEPROM 比较作业因硬件错误失败。 ### 7.3 错误检测 #### 7.3.1 API 参数检查 [SWS_Eep_00016] ⌈如果 Eep 模块的开发错误检测启用:`Eep_Read()`、`Eep_Write()`、`Eep_Compare()` 和 `Eep_Erase()` 函数应检查 `DataBufferPtr` 不为 NULL。如果 `DataBufferPtr` 为 NULL,它们应引发开发错误 `EEP_E_PARAM_DATA`,否则(如未启用开发错误检测)应返回 E_NOT_OK。⌋ (SRS_BSW_00323, SRS_SPAL_12448) [SWS_Eep_00017] ⌈如果开发错误检测启用:函数应检查 `EepromAddress` 是否有效。如果不在有效 EEPROM 地址范围内,应引发开发错误 `EEP_E_PARAM_ADDRESS`,否则返回 E_NOT_OK。⌋ [SWS_Eep_00018] ⌈如果开发错误检测启用:函数应检查参数 `Length` 是否在最小值(1)和最大值(`EepSize - EepromAddress`)之间。如不在,引发 `EEP_E_PARAM_LENGTH`,否则返回 E_NOT_OK。⌋ #### 7.3.2 EEPROM 状态检查 [SWS_Eep_00033] ⌈`Eep_SetMode()`、`Eep_Read()`、`Eep_Write()`、`Eep_Compare()` 和 `Eep_Erase()` 函数应检查 EEPROM 状态是否为 MEMIF_IDLE。如果不是: - 如果模块尚未初始化且开发错误检测启用,引发开发错误 `EEP_E_UNINIT` - 根据 EEPROM 状态引发运行时错误 `EEP_E_BUSY` - 以 E_NOT_OK 拒绝服务(除 `Eep_SetMode()` 外,因其无返回值) ⌋ #### 7.3.3 EEPROM 作业遇到硬件故障 - [SWS_Eep_00200] EEP_E_ERASE_FAILED:EEPROM 擦除函数失败时报告 - [SWS_Eep_00201] EEP_E_WRITE_FAILED:EEPROM 写函数失败时报告 - [SWS_Eep_00202] EEP_E_READ_FAILED:EEPROM 读函数失败时报告 - [SWS_Eep_00203] EEP_E_COMPARE_FAILED:EEPROM 比较函数失败时报告 #### 7.3.4 超时监视 [SWS_Eep_00234] ⌈当读、写、擦或比较作业的超时监视失败时,应报告运行时错误代码 `EEP_E_TIMEOUT`。⌋ ### 7.4 错误通知 详见 SWS_BSWGeneral 第 7.2 章。 ### 7.5 作业处理 — 通用需求 [SWS_Eep_00128] ⌈Eep 模块应允许通过配置参数 `EepUseInterrupts` (ECUC_Eep_00163) 配置为中断或轮询控制的作业处理。⌋ [SWS_Eep_00129] ⌈如果支持并启用中断控制作业处理,位于 Eep_Irq.c 的外部中断服务例程应调用一个附加的作业处理函数。⌋ [SWS_Eep_00246] ⌈如果底层 EEPROM 技术对读取地址或长度信息要求特定对齐,且读取或比较作业的地址和/或长度参数未正确对齐,`Eep_MainFunction` 函数应在内部补偿此缺失的对齐,即提供按字节的 Flash 内存读访问。⌋ #### SPI EEPROM 驱动额外通用需求 - [SWS_Eep_00056] SPI 访问失败时,Eep 模块行为参考 SWS_Eep_00068 - [SWS_Eep_00052] 普通模式:使用为普通 SPI EEPROM 访问配置的 SPI 通道 - [SWS_Eep_00053] EepNormalReadBlockSize 应匹配普通 SPI 模式可读字节数 - [SWS_Eep_00055] 快速模式:使用为突发访问 SPI EEPROM 配置的 SPI 通道 - [SWS_Eep_00073] EepFastReadBlockSize 应匹配突发 SPI 模式可读字节数 ### 7.6 读作业处理 [SWS_Eep_00130] ⌈Eep 模块应提供两种不同的读模式:普通模式、快速模式⌋ [SWS_Eep_00132] ⌈对于驱动外部 EEPROM 的 Eep 模块:如外部 EEPROM 不支持突发模式,应接受快速读模式选择,但行为与普通模式相同。⌋ [SWS_Eep_00051] ⌈普通 EEPROM 模式下,Eep 模块在一个作业处理周期内应读取 `EepNormalReadBlockSize` 参数指定的字节数。⌋ **示例**:`EepNormalReadBlockSize = 4`,读取 21 字节,所需 6 个周期,模式:4-4-4-4-4-1 [SWS_Eep_00054] ⌈快速 EEPROM 模式下,Eep 模块在一个周期内应读取 `EepFastReadBlockSize` 指定的字节数。⌋ **示例**:`EepFastReadBlockSize = 32`,读取 110 字节,所需 4 个周期,模式:32-32-32-14 [SWS_Eep_00058] ⌈读作业成功完成时,Eep 模块应将 EEPROM 状态设置为 MEMIF_IDLE,作业结果设置为 MEMIF_JOB_OK。如已配置,调用 `EepJobEndNotification` 中定义的通知。⌋ [SWS_Eep_00068] ⌈读作业处理期间检测到错误时,Eep 模块应中止作业,EEPROM 状态设为 MEMIF_IDLE,作业结果设为 MEMIF_JOB_FAILED。如已配置,调用 `EepJobErrorNotification` 通知。⌋ ### 7.7 写作业处理 [SWS_Eep_00057] ⌈Eep 模块在一个作业处理周期内只应向 EEPROM 写入(和擦除)EEPROM 硬件支持的字节数。⌋ [SWS_Eep_00133] ⌈提供两种写模式:普通、快速⌋ [SWS_Eep_00097] / [SWS_Eep_00098] ⌈分别由 `EepNormalWriteBlockSize` 和 `EepFastWriteBlockSize` 指定每周期写入字节数。⌋ [SWS_Eep_00060] ⌈如果要写入 EEPROM 单元的值已包含在该单元中,Eep 模块在 `EepWriteCycleReduction` 配置时应跳过该单元的编程。⌋ (SRS_Eep_00092) [SWS_Eep_00059] ⌈如果 EEPROM 硬件不自动进行,Eep 模块应在写入前擦除 EEPROM 单元。⌋ [SWS_Eep_00063] [SWS_Eep_00090] ⌈如果要写入字节数小于可擦除/可写数据单元,或地址/长度参数未对齐到可擦除/可写数据单元,Eep 模块应通过读-修改-写操作保留受影响 EEPROM 单元数据。⌋ [SWS_Eep_00064] ⌈写入数据块时,Eep 模块应尽量减少读-修改-写操作次数。⌋ ### 7.8 擦除作业处理 - [SWS_Eep_00069] 一周期内只擦 EEPROM 硬件支持的字节数 - [SWS_Eep_00070] 如硬件支持且参数对齐,使用块擦除命令 - [SWS_Eep_00072] 如擦除参数未对齐到可擦除数据单元,使用读-修改-写保留受影响内容 ### 7.9 比较作业处理 适用读相关需求:SWS_Eep_00130, 00132, 00051, 00054。 [SWS_Eep_00075] ⌈如比较作业处理期间检测到比较数据区域不相等,EEPROM 驱动应中止作业,EEPROM 状态设为 MEMIF_IDLE,作业结果设为 MEMIF_BLOCK_INCONSISTENT。如已配置,调用 `Eep_JobErrorNotification` 回调函数。⌋ ### 7.10 版本检查 详见 SWS_BSWGeneral 第 5.1.8 章。 --- ## 8 API 规范 ### 8.1 导入的类型 [SWS_Eep_00138] ⌈ | 模块 | 头文件 | 导入类型 | |------|--------|----------| | Dem | Rte_Dem_Type.h | Dem_EventIdType, Dem_EventStatusType | | MemIf | MemIf.h | MemIf_JobResultType, MemIf_ModeType, MemIf_StatusType | | Std_Types | StandardTypes.h | Std_ReturnType, Std_VersionInfoType | ⌋ (SRS_BSW_00335, SRS_BSW_00357, SRS_BSW_00377) ### 8.2 类型定义 #### 8.2.1 Eep_ConfigType | 项 | 内容 | |-----|------| | Name | Eep_ConfigType | | Type | Structure | | Range | Implementation Specific — 初始化数据结构内容为 EEPROM 特定 | | Description | 包含 EEPROM 驱动初始化数据的外部数据结构类型。 | | Available via | Eep.h | #### 8.2.2 Eep_AddressType | 项 | 内容 | |-----|------| | Name | Eep_AddressType | | Type | uint(8/16/32 位,取决于目标平台和 EEPROM 设备) | | Description | 用作从已配置 EEPROM 基地址访问特定 EEPROM 内存区域的地址偏移。 | #### 8.2.3 Eep_LengthType | 项 | 内容 | |-----|------| | Name | Eep_LengthType | | Type | 与 Eep_AddressType 相同 | | Description | 指定要读/写/擦/比较的字节数。 | ### 8.3 函数定义 #### 8.3.1 Eep_Init ```c void Eep_Init(const Eep_ConfigType* ConfigPtr) ``` | 项 | 内容 | |-----|------| | Service ID[hex] | 0x00 | | Sync/Async | Synchronous | | Reentrancy | Non Reentrant | | Description | EEPROM 初始化服务。 | [SWS_Eep_00004] ⌈`Eep_Init` 函数应使用 `ConfigPtr` 引用结构的值初始化所有 EEPROM 相关寄存器。⌋ [SWS_Eep_00006] ⌈模块初始化完成后,`Eep_Init` 应将 EEPROM 状态设置为 MEMIF_IDLE,作业结果设置为 MEMIF_JOB_OK。⌋ [SWS_Eep_00044] ⌈`Eep_Init` 应将 EEPROM 模式设置为已配置的默认模式。⌋ #### 8.3.2 Eep_SetMode ```c void Eep_SetMode(MemIf_ModeType Mode) ``` | 项 | 内容 | |-----|------| | Service ID[hex] | 0x01 | | Parameters | Mode: MEMIF_MODE_SLOW(慢读访问/普通 SPI 访问) 或 MEMIF_MODE_FAST(快读访问/SPI 突发访问) | [SWS_Eep_00042] ⌈`Eep_SetMode` 应将 EEPROM 操作模式设为给定 mode 参数。⌋ #### 8.3.3 Eep_Read ```c Std_ReturnType Eep_Read( Eep_AddressType EepromAddress, uint8* DataBufferPtr, Eep_LengthType Length ) ``` | 项 | 内容 | |-----|------| | Service ID[hex] | 0x02 | | Sync/Async | Asynchronous | | Return | E_OK: 读命令已接受;E_NOT_OK: 未接受 | [SWS_Eep_00009] ⌈复制参数,启动读作业,EEPROM 状态设为 MEMIF_BUSY,作业结果设为 MEMIF_JOB_PENDING 后返回。⌋ [SWS_Eep_00013] ⌈Eep 模块应在作业处理函数内异步执行读作业,读取 `EepromAddress + EEPROM 基地址` 起 `Length` 字节数据块到 `*DataBufferPtr`。⌋ #### 8.3.4 Eep_Write ```c Std_ReturnType Eep_Write( Eep_AddressType EepromAddress, const uint8* DataBufferPtr, Eep_LengthType Length ) ``` | 项 | 内容 | |-----|------| | Service ID[hex] | 0x03 | | Sync/Async | Asynchronous | [SWS_Eep_00014] ⌈启动写作业并返回。⌋ [SWS_Eep_00015] ⌈异步写入 `Length` 字节从 `*DataBufferPtr` 到 `EepromAddress + EEPROM 基地址`。⌋ #### 8.3.5 Eep_Erase ```c Std_ReturnType Eep_Erase( Eep_AddressType EepromAddress, Eep_LengthType Length ) ``` | 项 | 内容 | |-----|------| | Service ID[hex] | 0x04 | | Sync/Async | Asynchronous | | Description | 擦除 EEPROM 段的服务。 | [SWS_Eep_00019] / [SWS_Eep_00020] ⌈启动并异步执行擦除作业。⌋ #### 8.3.6 Eep_Compare ```c Std_ReturnType Eep_Compare( Eep_AddressType EepromAddress, const uint8* DataBufferPtr, Eep_LengthType Length ) ``` | 项 | 内容 | |-----|------| | Service ID[hex] | 0x05 | | Sync/Async | Asynchronous | | Description | 比较 EEPROM 中数据块与内存中 EEPROM 块。 | #### 8.3.7 Eep_Cancel ```c void Eep_Cancel(void) ``` | 项 | 内容 | |-----|------| | Service ID[hex] | 0x06 | | Sync/Async | Synchronous | | Description | 取消正在运行的作业。 | [SWS_Eep_00215] ⌈应取消正在进行的 EEPROM 读、写、擦或比较作业。⌋ [SWS_Eep_00021] ⌈同步中止正在运行的作业,函数返回后上层可立即请求新作业。⌋ [SWS_Eep_00027] ⌈应将 EEP 模块状态设为 MEMIF_IDLE。⌋ [SWS_Eep_00028] ⌈如果作业结果当前为 MEMIF_JOB_PENDING,应设为 MEMIF_JOB_CANCELED;否则保持作业结果不变。⌋ #### 8.3.8 Eep_GetStatus ```c MemIf_StatusType Eep_GetStatus(void) ``` | 项 | 内容 | |-----|------| | Service ID[hex] | 0x07 | | Sync/Async | Synchronous | | Reentrancy | Reentrant | | Return | MemIf_StatusType | [SWS_Eep_00029] ⌈同步返回 EEPROM 状态。⌋ #### 8.3.9 Eep_GetJobResult ```c MemIf_JobResultType Eep_GetJobResult(void) ``` | 项 | 内容 | |-----|------| | Service ID[hex] | 0x08 | | Reentrancy | Reentrant | [SWS_Eep_00024] ⌈同步返回 Eep 模块上次已接受作业的结果。⌋ #### 8.3.10 Eep_GetVersionInfo ```c void Eep_GetVersionInfo(Std_VersionInfoType* versioninfo) ``` | 项 | 内容 | |-----|------| | Service ID[hex] | 0x0a | | Reentrancy | Reentrant | | Description | 获取本模块版本信息的服务。 | [SWS_Eep_00239] ⌈如开发错误检测启用且以 NULL 指针调用,应引发开发错误 EEP_E_PARAM_POINTER。⌋ ### 8.4 回调通知 EEPROM 驱动为内部微控制器外设规范化时,属于 AUTOSAR 软件架构的最低层,因此本模块规范未识别任何回调函数。对于 SPI 外部设备,属于 ECU 抽象层,应根据 SPI Handler/Driver 规范需求提供回调通知。 [SWS_Eep_00137] ⌈ 在 Eep 模块支持 SPI 外部设备的情况下,Eep 模块应根据 SPI Handler/Driver 规范需求提供附加回调通知。⌋ ### 8.5 调度函数 #### 8.5.1 Eep_MainFunction ```c void Eep_MainFunction(void) ``` | 项 | 内容 | |-----|------| | Service ID[hex] | 0x09 | | Description | 执行 EEPROM 作业(读/写/擦/比较)处理的服务。 | | Available via | SchM_Eep.h | [SWS_Eep_00030] ⌈应执行 EEPROM 读、写、擦除和比较作业的处理。⌋ [SWS_Eep_00031] ⌈作业启动后,Eep 用户应周期性调用 `Eep_MainFunction` 直到作业完成。⌋ [SWS_Eep_00032] ⌈如无待处理作业,应直接返回。⌋ **硬件错误报告**(SWS_Eep_00204~00207):分别报告 EEP_E_ERASE/WRITE/READ/COMPARE_FAILED 给 DEM。 **超时监视**(SWS_Eep_00235~00238):监视读/写/擦/比较作业的截止时间,超时时引发 EEP_E_TIMEOUT 运行时错误。 ### 8.6 期望接口 #### 8.6.1 强制接口 [SWS_Eep_00154] ⌈ | API 函数 | 头文件 | 描述 | |----------|--------|------| | Dem_SetEventStatus | Dem.h | 报告监视状态信息到 Dem | | Det_ReportRuntimeError | Det.h | 报告运行时错误 | ⌋ #### 8.6.2 可选接口 [SWS_Eep_00155] ⌈ | API 函数 | 头文件 | 描述 | |----------|--------|------| | Det_ReportError | Det.h | 报告开发错误 | ⌋ #### 8.6.3 可配置接口 [SWS_Eep_00047] ⌈如回调函数在后构建时配置,初始化数据结构 `Eep_ConfigType` 应包含相应函数指针。⌋ ##### 8.6.3.1 作业结束通知 [SWS_Eep_00045] ⌈作业成功完成(读/写/擦完成 OK 或比较完成且数据相等)时调用 `EepJobEndNotification` 定义的回调函数。⌋ ```c void Eep_JobEndNotification(void) ``` ##### 8.6.3.2 作业错误通知 [SWS_Eep_00046] ⌈作业被取消或以负结果结束(读/写/擦中止或失败,比较中止或数据不相等)时调用 `EepJobErrorNotification` 定义的回调函数。⌋ ```c void Eep_JobErrorNotification(void) ``` --- ## 9 时序图 ### 9.1 初始化 EcuM → Eep:`Eep_Init(const Eep_ConfigType*)` ### 9.2 读/写/擦/比较 NvM → Ea → Eep:`Ea_Write` → `Eep_Write` → (周期 `Eep_MainFunction` 直至作业完成)→ `Ea_JobEndNotification` → `NvM_JobEndNotification`。 - EEPROM 状态:MEMIF_BUSY → MEMIF_IDLE - 作业结果:MEMIF_JOB_PENDING → MEMIF_JOB_OK ### 9.3 运行中作业的取消 NvM → Ea → Eep:`Ea_Cancel` → `Eep_Cancel`(同步)→ 状态变为 MEMIF_IDLE, 结果 MEMIF_JOB_CANCELED → 立即可启动新作业。 --- ## 10 配置规范 ### 10.1 如何阅读本章 详见 SWS_BSWGeneral 第 10.1 章。 ### 10.2 容器与配置参数 #### 10.2.1 Eep | 项 | 内容 | |-----|------| | SWS Item | ECUC_Eep_00205 | | Module Name | Eep | | Module Description | Eep(内部或外部 EEPROM 驱动)模块的配置。 | | Post-Build Variant Support | true | | Supported Config Variants | VARIANT-POST-BUILD, VARIANT-PRE-COMPILE | **包含容器:** | 容器名 | 多重性 | 描述 | |--------|--------|------| | EepGeneral | 1 | EEPROM 驱动通用配置参数容器 | | EepInitConfiguration | 1 | EEPROM 驱动运行时配置参数容器(实现类型:Eep_ConfigType) | | EepPublishedInformation | 1 | 附加发布参数(不在 CommonPublishedInformation 容器中覆盖) | #### 10.2.2 EepGeneral 关键参数(摘要): | 参数 | 描述 | |------|------| | EepDevErrorDetect | 开发错误检测开关 | | EepVersionInfoApi | 版本信息 API 启用开关 | | EepUseInterrupts | 中断或轮询作业处理选择 | | EepDriverIndex | 驱动索引 | | EepBaseAddress | EEPROM 基地址 | | EepSize | EEPROM 大小(字节) | #### 10.2.3 EepInitConfiguration | 参数 | 描述 | |------|------| | EepDefaultMode | 默认模式 | | EepFastReadBlockSize | 快速模式读取块大小 | | EepNormalReadBlockSize | 普通模式读取块大小 | | EepFastWriteBlockSize | 快速模式写入块大小 | | EepNormalWriteBlockSize | 普通模式写入块大小 | | EepJobCallCycle | 作业调用周期 | | EepJobEndNotification | 作业结束通知回调 | | EepJobErrorNotification | 作业错误通知回调 | | EepEraseTime | 最大擦除时间 | | EepWriteCycleReduction | 写周期减少开关 | #### 10.2.4 EepDemEventParameterRefs 引用 DEM 事件参数,用于错误报告。 #### 10.2.5 EepExternalDriver 外部 EEPROM 设备配置: - 期望硬件 Flash ID - 最大读访问阻塞时间 #### 10.2.6 SPI 特定扩展 SPI 配置参数(用于外部 SPI EEPROM): - SPI 通道 - 普通模式与突发模式 SPI 序列 ### 10.3 已发布参数 EepPublishedInformation 包含: - EEPROM 大小 - 已擦除 EEPROM 单元值 - EEPROM 单元大小 - 物理内存分段 ### 10.4 配置示例 — 外部 SPI EEPROM 设备 详细配置示例见原文 PDF 第 10.4 章。 --- ## 11 不适用需求 [SWS_Eep_00241] ⌈这些需求不适用于本规范。⌋ 涉及多个 SRS_BSW_* 和 SRS_SPAL_* 需求,详见原文 PDF。 --- ## 翻译说明 - 本文档完整翻译自 AUTOSAR_SWS_EEPROMDriver v4.4.0(Document ID 021,63 页)。 - 保留所有需求 ID(SWS_Eep_xxxxx、SRS_*_xxxxx、ECUC_Eep_xxxxx)。 - 保留 AUTOSAR 方框符 ⌈⌋。 - 模块缩写(Eep、Fee、Ea、NvM、MemIf、SPI、DEM、DET、EcuM 等)和 API 函数名保持英文。 - 主要部分已完整翻译;配置参数详细描述请参考原文 PDF。