Keyboard shortcuts

Press or to navigate between chapters

Press S or / to search in the book

Press ? to show this help

Press Esc to hide this help

7.3 Flash驱动

Flash 设备原理

Flash 存储器是一种非易失性半导体存储技术,能够在断电后保留数据,广泛用于嵌入式系统中的固件存储和数据持久化。Flash 原理基于浮栅晶体管(Floating Gate Transistor),通过隧道效应(Fowler-Nordheim Tunneling)或热电子注入在浮栅上存储电荷,表示 0/1 状态。Flash 分两种类型:NOR Flash 支持随机访问和执行代码(XIP),适用于固件启动;NAND Flash 支持块访问,高密度低成本,适用于数据存储,但需错误纠正(ECC)和坏块管理。Flash 操作包括读、写(编程)和擦除:读操作直接访问单元;写操作注入电荷到浮栅,通常以页(2K~16K 字节)为单位;擦除操作移除电荷,以块(64K~512K 字节)为单位,必须先擦除再写。Flash 寿命有限(10K~100K 次擦除),使用磨损均衡算法延长使用。接口包括 SPI(串行外围接口)用于低速小容量 Flash 和 Parallel 接口用于高速大容量。

  • 关键特性:
    • 读速度:NOR Flash ~100 MB/s,NAND Flash ~200 MB/s。
    • 写/擦除时间:写页 200µs~2ms,擦除块 1~5ms。
    • 电压:1.8V~3.3V,支持低功耗模式。
    • 错误处理:内置 CRC 或 ECC,坏块标记。

Flash 与 EEPROM 的区别在于块擦除而非字节擦除,适用于飞腾派等嵌入式板卡的 boot loader 和文件系统。


飞腾派 Flash 设备

飞腾派(Phytium Pi)开发板的 Flash 设备使用 SPI NOR Flash(如 W25Q128JV),容量 16MB,支持 SPI 模式,用于存储固件和启动代码。设备控制器集成在 SPI 模块中,基址 0x2803A000,支持主模式、四种时序模式(CPOL/CPHA 组合)和最大 104 MHz 时钟速率,带宽 52 MB/s。飞腾派 Flash 设备通过 Mini-SPI 接口连接,支持 Quad SPI (4 位数据线) 提升性能,适用于 U-Boot 和 ArceOS 镜像存储。设备树(phytium_pi.dts)定义 spi-flash 节点,配置文件(aarch64-phytium-pi.toml)包含 MMIO 区域 [0x2803A000, 0x1000]。驱动在 ArceOS 中通过 axdriver_spi 模块实现,支持命令如读 ID (0x90)、页编程 (0x02) 和块擦除 (0xD8),适用于 boot 和数据持久化。

  • 硬件特性:
    • 容量:16MB (128Mb),页大小 256 字节,块大小 64KB。
    • 接口:SPI,支持 Single/Dual/Quad 模式,引脚 MISO/MOSI/SCK/CS 通过 PAD (0x32B30000) 配置。
    • 中断:IRQ 通过 GIC 路由(SPI 模式下可选)。
    • 扩展:支持外部 SD 卡扩展,但内置 Flash 用于固件。

飞腾派的 Flash 设备与 eMMC 不同,前者用于固件存储,后者用于大容量数据,驱动支持轮询和中断模式。


飞腾派 Flash 设备时序图

飞腾派 Flash 设备时序以页读操作(CMD 0x03)为例,涉及 SPI 控制器(基址 0x2803A000)、Flash 芯片和 SPI 总线(MISO/MOSI/SCK/CS)。主机发送 CMD 0x03 和地址,Flash 返回数据字节,完成后 CS 高电平结束传输。总延迟约 10~100 µs(104 MHz 时钟),依赖模式(Single SPI 1 位,Quad SPI 4 位)。

sequenceDiagram
    participant Host as SPI 控制器 (0x2803A000)
    participant Flash as Flash 芯片
    participant Bus as SPI 总线 (MOSI/MISO/SCK/CS)

    Host->>Bus: CS 低电平 (选中芯片)
    Host->>Flash: 发送 CMD 0x03 (读命令)
    Host->>Flash: 发送 24 位地址
    Flash->>Bus: 返回数据字节 (MISO)
    Bus->>Host: 数据到达 FIFO
    Host->>Host: 触发中断 (可选, IRQ)
    Host->>Bus: CS 高电平 (结束传输)

时序分析

命令阶段:MOSI 发送 8 位命令 + 24 位地址(32 位总),响应延迟 <1 µs。数据阶段:MISO 返回字节数据,4 位模式下速率 52 MB/s,CRC 校验完整性。中断阶段:传输完成后控制器触发 IRQ,通过 GIC 路由到 CPU 0。


相关寄存器信息、位域及基地址

飞腾派 Flash 设备寄存器基于 SPI 控制器(基址 0x2803A000),支持命令、数据和中断配置。以下是关键寄存器、位域和基地址信息。

  • 基址:SPI 控制器基址 0x2803A000。

  • 寄存器表:

    寄存器偏移功能关键位域
    SPICTRL00x000控制寄存器 0DATA_WIDTH (bit 0-3: 8/16 位), CPOL (bit 6), CPHA (bit 7)
    SPIEN0x008使能寄存器SPI_EN (bit 0: 1=使能)
    SPIBAUDR0x014波特率寄存器BAUDR (bit 0-31: 分频值, 104 MHz / BAUDR)
    SPITXFTLR0x018发送 FIFO 阈值TX_THR (bit 0-7: 阈值 0~255)
    SPIRXFTLR0x01C接收 FIFO 阈值RX_THR (bit 0-7: 阈值 0~255)
    SPITXFLR0x020发送 FIFO 等级TX_LVL (bit 0-7: 当前等级)
    SPIRXFLR0x024接收 FIFO 等级RX_LVL (bit 0-7: 当前等级)
    SPISR0x028状态寄存器BUSY (bit 0: 1=忙), TFNF (bit 1: TX FIFO 非满)
    SPIIMR0x02C中断屏蔽寄存器TXEI (bit 2: TX 阈值中断), RXFI (bit 4: RX 阈值中断)
    SPIISR0x030中断状态寄存器TXEI (bit 2), RXFI (bit 4)
    SPIRISR0x034原始中断状态寄存器TXEI (bit 2), RXFI (bit 4)
    SPIICR0x048中断清除寄存器CLR_ALL (bit 0: 写 1 清所有中断)
    SPIDMACR0x04CDMA 控制寄存器DMA_EN (bit 0: 1=使能 DMA)
    SPIDR0x060数据寄存器DR (bit 0-7/15: 数据字节)
    SPIRXSAMPLEDLY0x0FC接收采样延迟DELAY (bit 0-7: 采样延迟周期)
    SPICS0x100片选寄存器CS (bit 0: 0=选中,1=释放)

SPICTRL0 寄存器位域:

  • DATA_WIDTH (bit 0-3):数据位宽,3=8 位, 4=16 位。
  • CPOL (bit 6):时钟极性,0=空闲低电平, 1=空闲高电平。
  • CPHA (bit 7):时钟相位,0=第一个边沿采样, 1=第二个边沿采样。

SPIEN 寄存器位域:

  • SPI_EN (bit 0):1=使能 SPI 控制器。

SPIBAUDR 寄存器位域:

  • BAUDR (bit 0-31):分频值,速率 = 时钟 / BAUDR (104 MHz / BAUDR)。

SPIIMR 寄存器位域:

  • TXEI (bit 2):发送阈值中断使能。
  • RXFI (bit 4):接收阈值中断使能。