# 实现W25QXX Flash支持计划

## 1. 概述

本计划旨在为项目添加对W25QXX系列SPI Flash的支持。W25QXX是一款常用的SPI接口Flash芯片，支持多种容量（从4MB到128MB），具有高速读写、擦除功能。

## 2. 实现架构

按照项目现有的分层架构，实现将分为以下几个层次：

- **HAL层**：实现SPI硬件抽象层，提供统一的SPI接口
- **Module层**：实现W25QXX Flash的驱动逻辑

## 3. 实现步骤

### 3.1 实现SPI HAL抽象层

#### 3.1.1 创建SPI HAL头文件

创建`HAL/Inc/hal_spi.h`，定义SPI的统一接口：

- SPI实例枚举
- SPI配置结构体（模式、波特率、极性、相位等）
- SPI操作函数声明（初始化、发送、接收、传输等）

#### 3.1.2 实现SPI HAL通用层

创建`HAL/Src/hal_spi.c`，实现通用的SPI接口，通过条件编译调用不同架构的具体实现。

#### 3.1.3 实现STM32F4的SPI特定实现

创建`HAL/Src/arch/stm32f4/hal_stm32f4_spi.c`和`HAL/Inc/arch/stm32f4/hal_stm32f4_spi.h`，实现STM32F4系列的SPI具体驱动。

### 3.2 实现W25QXX Flash驱动

#### 3.2.1 创建W25QXX头文件

创建`Modules/w25qxx/inc/w25qxx.h`，定义：

- W25QXX配置结构体
- W25QXX命令定义
- W25QXX操作函数声明（初始化、读取ID、读写数据、擦除等）

#### 3.2.2 实现W25QXX驱动

创建`Modules/w25qxx/src/w25qxx.c`，实现W25QXX的具体驱动逻辑：

- 初始化函数
- 读取设备ID
- 读取数据
- 写入数据
- 扇区擦除
- 块擦除
- 芯片擦除
- 等待操作完成

### 3.3 更新CMake配置

- 更新`HAL/CMakeLists.txt`，添加SPI HAL的编译配置
- 更新`Modules/CMakeLists.txt`，添加W25QXX模块的编译配置

## 4. 详细设计

### 4.1 SPI HAL接口设计

```c
// SPI实例枚举
typedef enum {
    HAL_SPI_INSTANCE_1 = 0,
    HAL_SPI_INSTANCE_2,
    HAL_SPI_INSTANCE_3,
    HAL_SPI_INSTANCE_4,
    HAL_SPI_INSTANCE_5,
    HAL_SPI_INSTANCE_6,
    HAL_SPI_INSTANCE_MAX
} hal_spi_instance_t;

// SPI模式枚举
typedef enum {
    HAL_SPI_MODE_MASTER = 0,
    HAL_SPI_MODE_SLAVE
} hal_spi_mode_t;

// SPI时钟极性枚举
typedef enum {
    HAL_SPI_POLARITY_LOW = 0,
    HAL_SPI_POLARITY_HIGH
} hal_spi_polarity_t;

// SPI时钟相位枚举
typedef enum {
    HAL_SPI_PHASE_1EDGE = 0,
    HAL_SPI_PHASE_2EDGE
} hal_spi_phase_t;

// SPI数据大小枚举
typedef enum {
    HAL_SPI_DATABITS_8 = 0,
    HAL_SPI_DATABITS_16
} hal_spi_databits_t;

// SPI配置结构体
typedef struct {
    hal_spi_instance_t instance;
    hal_spi_mode_t mode;
    uint32_t baudrate;
    hal_spi_polarity_t polarity;
    hal_spi_phase_t phase;
    hal_spi_databits_t databits;
} hal_spi_config_t;

// SPI操作函数
typedef void (*hal_spi_init_func_t)(void);
typedef void (*hal_spi_config_func_t)(const hal_spi_config_t *config);
typedef void (*hal_spi_send_func_t)(hal_spi_instance_t instance, const uint8_t *data, size_t length);
typedef size_t (*hal_spi_receive_func_t)(hal_spi_instance_t instance, uint8_t *data, size_t length);
typedef void (*hal_spi_transmit_func_t)(hal_spi_instance_t instance, const uint8_t *tx_data, uint8_t *rx_data, size_t length);
```

### 4.2 W25QXX驱动接口设计

```c
// W25QXX设备ID结构体
typedef struct {
    uint8_t manufacturer_id;
    uint8_t device_id;
    uint32_t capacity;
} w25qxx_id_t;

// W25QXX配置结构体
typedef struct {
    hal_spi_instance_t spi_instance;
    hal_gpio_port_t cs_port;
    hal_gpio_pin_t cs_pin;
} w25qxx_config_t;

// W25QXX实例结构体
typedef struct {
    w25qxx_config_t config;
    w25qxx_id_t id;
    uint8_t initialized;
} w25qxx_t;

// W25QXX操作函数
void w25qxx_init(w25qxx_t *instance, const w25qxx_config_t *config);
void w25qxx_read_id(w25qxx_t *instance, w25qxx_id_t *id);
void w25qxx_read_data(w25qxx_t *instance, uint32_t addr, uint8_t *data, size_t length);
void w25qxx_write_data(w25qxx_t *instance, uint32_t addr, const uint8_t *data, size_t length);
void w25qxx_erase_sector(w25qxx_t *instance, uint32_t sector_addr);
void w25qxx_erase_block(w25qxx_t *instance, uint32_t block_addr);
void w25qxx_erase_chip(w25qxx_t *instance);
void w25qxx_wait_busy(w25qxx_t *instance);
```

## 5. 实现顺序

1. 实现SPI HAL抽象层（通用接口）
2. 实现STM32F4的SPI具体实现
3. 实现W25QXX Flash驱动模块
4. 更新CMake配置
5. 编写测试代码验证功能

## 6. 预期成果

- 项目支持SPI接口的硬件抽象
- 实现W25QXX Flash的完整驱动
- 支持W25QXX的读写、擦除等功能
- 提供易用的API接口，方便上层应用调用

## 7. 注意事项

- 确保SPI HAL接口与现有GPIO、UART接口风格保持一致
- W25QXX驱动应支持不同容量的芯片自动检测
- 实现应考虑错误处理和边界情况
- 测试时应覆盖各种操作场景，确保稳定性

## 8. 资源需求

- 参考W25QXX的数据手册
- 参考STM32F4的SPI硬件手册
- 现有项目的GPIO、UART驱动代码作为参考