G233 SoC 硬件手册(教学版)¶
免责声明
本手册描述的是用于 QEMU 训练营的 教学用虚拟 SoC/板卡(G233) 的规格与编程模型,并不对应任何实体芯片。 训练营可能在不另行通知的情况下调整实现细节;若手册与实际实现不一致,以测题/参考实现为准。
主要贡献者
- 维护:@zevorn
| 项目 | 值 |
|---|---|
| 目标读者 | 训练营学员、平台建模/驱动开发人员 |
| 适用范围 | docs/exercise/2026/stage1/soc/(SoC 方向) |
| 文档状态 | Draft |
| 最后更新 | 2026-03-11 |
1. 概述¶
G233 是为 QEMU 训练营定制的虚拟 SoC/板卡。其设计目标是提供一个足够小但覆盖关键子系统的硬件抽象,用于:
- 板级/SoC 设备建模(MMIO、IRQ、总线、设备实例化与连接)
- 通用外设建模(GPIO、PWM、WDT)
- SPI 外设建模与存储器件互联(SSI、Flash、片选、中断)
本手册重点描述 内存映射、外设寄存器定义、中断互联以及编程模型。
2. 文档约定¶
2.1 数值与端序¶
- 除非特别说明,所有数值均为十六进制,形如
0x1001_8000(下划线仅用于分组)。 - 地址均为 字节地址(byte addressable)。
- 所有多字节寄存器访问均按 小端序(little-endian) 解释。
2.2 术语:未定义 / 实现定义¶
- 未定义(undefined):实现可以产生任意结果(包括但不限于异常/死循环/数据破坏);软件不得依赖其行为。
- 实现定义(implementation-defined):实现必须在某处(手册或实现文档)给出选择;若未给出,软件仍不得依赖。
本手册对一些非关键细节会采用"实现定义/未定义"以避免与训练营实现细节冲突。
3. 系统架构¶
3.1 顶层框图(示意)¶
+------------------------------------------------------------------------------+
| G233 Board Architecture Diagram |
| |
| +-----------------+ +--------------------+ +-----------------+ |
| | DRAM | <---> | riscv.g233.cpu | <---> | MROM | |
| | 0x8000_0000 | | - RVA23 | | 0x0000_1000 | |
| | 0xBFFF_FFFF | | - Xg233ai | | 0x0000_2FFF | |
| +-----------------+ +----------+---------+ +-----------------+ |
| | |
| +-----------+-----------+-----------+-----------+ |
| | | | | | |
| +-------v---+ +----v----+ +---v-----+ +-v-------+ +v----------+ |
| | PLIC | | ACLINT | | PL011 | | WDT | | GPIO | |
| | 0x0C00_.. | | 0x0200_ | | 0x1000_ | | 0x1001_ | | 0x1001_ | |
| | 0x0FFF_.. | | 0x0200_ | | 0x1000_ | | 0x1001_ | | 0x1001_ | |
| +-----+-----+ +---------+ +---------+ +---------+ +-----------+ |
| | |
| +-----+-----+-----+-----+ |
| | | | |
| +---v---+ +---v---+ +--v----+ +---v----+ +---v----+ |
| | PWM | | SPI | | Flash | | Flash | | Flash | |
| | 0x..5 | | 0x..8 | | CS0 | | CS1 | | (opt) | |
| +-------+ +---+---+ +-------+ +--------+ +--------+ |
| | | | |
| +------SSI Bus-----------+ |
| |
| Bus Fabric / AXI |
+------------------------------------------------------------------------------+
3.2 外设互联概要¶
| 外设 | 连接关系 | PLIC IRQ |
|---|---|---|
| PL011 UART | CPU ↔ MMIO | 1 |
| GPIO | CPU ↔ MMIO,32 路引脚 | 2 |
| PWM | CPU ↔ MMIO,4 通道输出 | 3 |
| WDT | CPU ↔ MMIO,超时产生中断/复位 | 4 |
| SPI | CPU ↔ MMIO ↔ SSI 总线 ↔ Flash | 5 |
4. 地址空间与存储器映射¶
4.1 地址映射总览¶
下表给出 G233 低地址空间(低 32 位)内的主要映射。未列出的地址范围为 实现定义(可能返回 0、产生总线错误或触发访存异常)。
| 区域 | Base | End | Size | 访问属性 | 说明 |
|---|---|---|---|---|---|
| MROM | 0x0000_1000 |
0x0000_2FFF |
8 KiB | R-X | 启动只读存储区(Boot ROM) |
| ACLINT (MSWI) | 0x0200_0000 |
0x0200_3FFF |
16 KiB | R/W | 软件中断(Machine SW Interrupt) |
| ACLINT (MTIME/MTIMECMP) | 0x0200_4000 |
0x0200_BFFF |
32 KiB | R/W | 机器定时器(Machine Timer) |
| PLIC | 0x0C00_0000 |
0x0FFF_FFFF |
64 MiB | R/W | 外部中断控制器(PLIC) |
| PL011 UART | 0x1000_0000 |
0x1000_0FFF |
4 KiB | R/W | 串口控制器(PL011 兼容) |
| WDT | 0x1001_0000 |
0x1001_0FFF |
4 KiB | R/W | 看门狗定时器(见第 6 章) |
| GPIO | 0x1001_2000 |
0x1001_20FF |
256 B | R/W | 通用 GPIO(见第 7 章) |
| PWM | 0x1001_5000 |
0x1001_5FFF |
4 KiB | R/W | PWM 控制器(见第 8 章) |
| SPI | 0x1001_8000 |
0x1001_8FFF |
4 KiB | R/W | SPI 控制器(见第 9 章) |
| DRAM | 0x8000_0000 |
0xBFFF_FFFF |
1 GiB | R/W/X | 主内存 |
4.2 MMIO 访问规则(通用)¶
- 除非章节另行说明,MMIO 寄存器按 32-bit 对齐访问;非对齐访问的行为为 实现定义。
- 对寄存器中标记为 保留(Reserved) 的位:软件 必须写 0,读出值为 实现定义。
- 同一寄存器的并发访问、以及设备内部状态机的精确定序为 实现定义(建议驱动使用轮询/中断配合,并做好超时保护)。
5. 处理器与中断子系统¶
5.1 CPU 概览¶
| 项目 | 值 |
|---|---|
| 处理器核名称 | riscv.g233.cpu |
| ISA | RV64GC (RVA23) + Xg233ai |
Note
RVA23 的完整扩展集合与 CSR 行为,以训练营给出的 QEMU 配置与实现为准。自定义指令扩展 Xg233ai 见 G233 CPU 指令扩展手册。
5.2 启动与复位¶
- 复位后 CPU 从 MROM 区域取指执行(具体入口地址由平台配置/固件决定)。
- MROM 内容通常用于最小初始化并跳转到 DRAM 中的后续代码。
5.3 中断控制器¶
ACLINT:提供软件中断(MSWI)与机器定时器(MTIME/MTIMECMP),用于 M-mode 的 MSIP/MTIP 等本地中断源。
PLIC:聚合板级外设的外部中断源,并向 CPU 递交外部中断(MEIP)。
5.4 PLIC 中断源编号¶
| IRQ | 来源 | 触发方式 | 说明 |
|---|---|---|---|
| 1 | PL011 UART | 电平 | 串口收发中断 |
| 2 | GPIO | 电平 | 引脚中断(由 GPIO_IS 汇聚) |
| 3 | PWM | 电平 | 周期完成中断 |
| 4 | WDT | 电平 | 看门狗超时中断 |
| 5 | SPI | 电平 | SPI TXE/RXNE/错误中断 |
Note
IRQ 0 保留不使用。各中断的优先级与使能配置通过 PLIC 寄存器完成(PLIC 编程模型遵循 RISC-V PLIC 规范,本手册不再重复)。
6. 看门狗定时器(WDT)¶
WDT (Watchdog Timer) 提供系统级超时保护,软件需在倒计时归零前周期性"喂狗"以防止系统复位或触发中断。
6.1 功能特性¶
- 32 位递减计数器
- 可配置超时时间(通过装载值)
- 超时可产生中断或系统复位(由控制位选择)
- 喂狗操作需写入特定密钥值
- 锁定机制:写入锁定密钥后,控制寄存器变为只读
6.2 寄存器映射¶
WDT 基地址:0x1001_0000。
| Offset | 寄存器 | 访问 | 复位值 | 描述 |
|---|---|---|---|---|
0x00 |
WDT_CTRL |
R/W | 0x0000_0000 |
控制寄存器 |
0x04 |
WDT_LOAD |
R/W | 0x0000_FFFF |
装载值寄存器 |
0x08 |
WDT_VAL |
R | 0x0000_FFFF |
当前计数值(只读) |
0x0C |
WDT_SR |
R/W | 0x0000_0000 |
状态寄存器 |
0x10 |
WDT_KEY |
W | — | 密钥寄存器(只写) |
6.3 寄存器定义¶
6.3.1 WDT_CTRL(Offset 0x00)— Control Register¶
| Bit | 名称 | 访问 | 复位 | 描述 |
|---|---|---|---|---|
31:4 |
Reserved | - | 0 |
保留位,必须保持为 0 |
3 |
LOCK |
R | 0 |
锁定状态:1 表示已锁定(只读) |
2 |
RSTEN |
R/W | 0 |
超时复位使能:0 禁用;1 超时时产生系统复位 |
1 |
INTEN |
R/W | 0 |
超时中断使能:0 禁用;1 超时时向 PLIC 发起中断 |
0 |
EN |
R/W | 0 |
WDT 使能:0 停止计数;1 开始倒计时 |
6.3.2 WDT_LOAD(Offset 0x04)— Load Value Register¶
| Bit | 名称 | 访问 | 复位 | 描述 |
|---|---|---|---|---|
31:0 |
LOAD |
R/W | 0x0000_FFFF |
装载值:喂狗时计数器重置为此值 |
6.3.3 WDT_VAL(Offset 0x08)— Current Value Register¶
| Bit | 名称 | 访问 | 复位 | 描述 |
|---|---|---|---|---|
31:0 |
VAL |
R | 0x0000_FFFF |
当前倒计时值(只读) |
6.3.4 WDT_SR(Offset 0x0C)— Status Register¶
| Bit | 名称 | 访问 | 复位 | 描述 |
|---|---|---|---|---|
31:1 |
Reserved | R | 0 |
保留位 |
0 |
TIMEOUT |
R/W | 0 |
超时标志:1 表示计数器已归零;写 1 清除 |
6.3.5 WDT_KEY(Offset 0x10)— Key Register¶
| Bit | 名称 | 访问 | 复位 | 描述 |
|---|---|---|---|---|
31:0 |
KEY |
W | — | 密钥值(只写,读返回 0) |
密钥值定义:
| 密钥值 | 操作 |
|---|---|
0x5A5A_5A5A |
喂狗:将 WDT_LOAD 的值重新装载到计数器,同时清除 TIMEOUT 标志 |
0x1ACC_E551 |
锁定:将 WDT_CTRL 锁定为只读(LOCK 位置 1),直到下次复位 |
Note
写入其他值到 WDT_KEY 的行为为 未定义。
6.4 编程模型¶
- 配置
WDT_LOAD设定超时装载值。 - 配置
WDT_CTRL:设置INTEN(中断)或RSTEN(复位),置位EN启动计数。 - 软件周期性向
WDT_KEY写入0x5A5A_5A5A喂狗。 - 若需锁定配置(防止误改),向
WDT_KEY写入0x1ACC_E551。 - 超时检测:轮询
WDT_SR.TIMEOUT或通过 PLIC 中断响应。
7. GPIO 控制器¶
GPIO (General-Purpose Input/Output) 提供 32 路通用数字引脚,每路可独立配置方向、输出电平、以及中断触发条件。
7.1 功能特性¶
- 32 路独立引脚(GPIO[31:0])
- 每路可配置为输入或输出
- 输出电平可独立控制
- 每路引脚可独立使能中断
- 中断触发方式可配置:电平触发或边沿触发
- 中断极性可配置:高电平/上升沿 或 低电平/下降沿
7.2 寄存器映射¶
GPIO 基地址:0x1001_2000。
| Offset | 寄存器 | 访问 | 复位值 | 描述 |
|---|---|---|---|---|
0x00 |
GPIO_DIR |
R/W | 0x0000_0000 |
方向寄存器 |
0x04 |
GPIO_OUT |
R/W | 0x0000_0000 |
输出数据寄存器 |
0x08 |
GPIO_IN |
R | 0x0000_0000 |
输入数据寄存器 |
0x0C |
GPIO_IE |
R/W | 0x0000_0000 |
中断使能寄存器 |
0x10 |
GPIO_IS |
R/W | 0x0000_0000 |
中断状态寄存器 |
0x14 |
GPIO_ITP |
R/W | 0x0000_0000 |
中断类型寄存器 |
0x18 |
GPIO_IPL |
R/W | 0x0000_0000 |
中断极性寄存器 |
7.3 寄存器定义¶
以下寄存器均为 32 位宽,每一位对应一路 GPIO 引脚(bit N 对应 GPIO[N])。
7.3.1 GPIO_DIR(Offset 0x00)— Direction Register¶
| Bit | 描述 |
|---|---|
N |
GPIO[N] 方向:0 输入;1 输出 |
7.3.2 GPIO_OUT(Offset 0x04)— Output Data Register¶
| Bit | 描述 |
|---|---|
N |
GPIO[N] 输出电平:0 低电平;1 高电平。仅当 GPIO_DIR[N] = 1 时有效 |
7.3.3 GPIO_IN(Offset 0x08)— Input Data Register¶
| Bit | 描述 |
|---|---|
N |
GPIO[N] 当前引脚电平(只读)。输出模式下读回输出锁存值 |
7.3.4 GPIO_IE(Offset 0x0C)— Interrupt Enable Register¶
| Bit | 描述 |
|---|---|
N |
GPIO[N] 中断使能:0 禁用;1 使能 |
7.3.5 GPIO_IS(Offset 0x10)— Interrupt Status Register¶
| Bit | 描述 |
|---|---|
N |
GPIO[N] 中断挂起:1 表示触发条件成立;写 1 清除 |
Note
所有引脚的中断状态通过按位 OR 汇聚为一个 PLIC 中断源(IRQ 2)。软件需读 GPIO_IS 判断具体是哪些引脚触发。
7.3.6 GPIO_ITP(Offset 0x14)— Interrupt Type Register¶
| Bit | 描述 |
|---|---|
N |
GPIO[N] 中断类型:0 电平触发;1 边沿触发 |
7.3.7 GPIO_IPL(Offset 0x18)— Interrupt Polarity Register¶
| Bit | 描述 |
|---|---|
N |
GPIO[N] 中断极性:0 低电平/下降沿;1 高电平/上升沿 |
7.4 编程模型¶
输出控制:
- 设置
GPIO_DIR[N] = 1(输出模式)。 - 写
GPIO_OUT[N]控制引脚电平。
输入读取:
- 设置
GPIO_DIR[N] = 0(输入模式)。 - 读
GPIO_IN[N]获取当前引脚电平。
中断配置:
- 配置
GPIO_ITP[N]选择电平/边沿触发。 - 配置
GPIO_IPL[N]选择触发极性。 - 置位
GPIO_IE[N]使能中断。 - 中断发生后,读
GPIO_IS确认触发引脚,向对应位写1清除。
8. PWM 控制器¶
PWM (Pulse Width Modulation) 控制器提供 4 路独立 PWM 输出通道,每路可独立配置周期、占空比和极性。
8.1 功能特性¶
- 4 路独立通道(CH0~CH3)
- 32 位周期计数器
- 32 位占空比计数器
- 每通道可独立使能/禁用
- 输出极性可配置
- 周期完成中断
8.2 寄存器映射¶
PWM 基地址:0x1001_5000。每通道占用 0x10 字节(4 个寄存器),通道 N 基偏移为 N * 0x10。全局寄存器位于 0x40 起始。
通道寄存器(通道 N,偏移基址 = N * 0x10):
| Offset | 寄存器 | 访问 | 复位值 | 描述 |
|---|---|---|---|---|
N*0x10 + 0x00 |
PWM_CHn_CTRL |
R/W | 0x0000_0000 |
通道控制寄存器 |
N*0x10 + 0x04 |
PWM_CHn_PERIOD |
R/W | 0x0000_0000 |
周期值寄存器 |
N*0x10 + 0x08 |
PWM_CHn_DUTY |
R/W | 0x0000_0000 |
占空比值寄存器 |
N*0x10 + 0x0C |
PWM_CHn_CNT |
R | 0x0000_0000 |
当前计数值(只读) |
全局寄存器:
| Offset | 寄存器 | 访问 | 复位值 | 描述 |
|---|---|---|---|---|
0x40 |
PWM_GLB |
R/W | 0x0000_0000 |
全局控制/状态寄存器 |
8.3 寄存器定义¶
8.3.1 PWM_CHn_CTRL(Offset N*0x10 + 0x00)— Channel Control¶
| Bit | 名称 | 访问 | 复位 | 描述 |
|---|---|---|---|---|
31:3 |
Reserved | - | 0 |
保留位,必须保持为 0 |
2 |
INTIE |
R/W | 0 |
周期完成中断使能:0 禁用;1 使能 |
1 |
POL |
R/W | 0 |
输出极性:0 默认高电平有效;1 反相 |
0 |
EN |
R/W | 0 |
通道使能:0 停止;1 启动 |
8.3.2 PWM_CHn_PERIOD(Offset N*0x10 + 0x04)— Period Value¶
| Bit | 名称 | 访问 | 复位 | 描述 |
|---|---|---|---|---|
31:0 |
PERIOD |
R/W | 0 |
周期值:计数器从 0 计数到 PERIOD 后归零重载 |
8.3.3 PWM_CHn_DUTY(Offset N*0x10 + 0x08)— Duty Cycle Value¶
| Bit | 名称 | 访问 | 复位 | 描述 |
|---|---|---|---|---|
31:0 |
DUTY |
R/W | 0 |
占空比值:计数器 < DUTY 时输出高电平,>= DUTY 时输出低电平 |
Note
DUTY 必须 <= PERIOD。当 DUTY > PERIOD 时,输出行为为 实现定义。
8.3.4 PWM_CHn_CNT(Offset N*0x10 + 0x0C)— Current Counter¶
| Bit | 名称 | 访问 | 复位 | 描述 |
|---|---|---|---|---|
31:0 |
CNT |
R | 0 |
当前计数值(只读) |
8.3.5 PWM_GLB(Offset 0x40)— Global Control/Status¶
| Bit | 名称 | 访问 | 复位 | 描述 |
|---|---|---|---|---|
31:8 |
Reserved | - | 0 |
保留位 |
7 |
CH3_DONE |
R/W | 0 |
CH3 周期完成标志;写 1 清除 |
6 |
CH2_DONE |
R/W | 0 |
CH2 周期完成标志;写 1 清除 |
5 |
CH1_DONE |
R/W | 0 |
CH1 周期完成标志;写 1 清除 |
4 |
CH0_DONE |
R/W | 0 |
CH0 周期完成标志;写 1 清除 |
3 |
CH3_EN |
R | 0 |
CH3 运行状态(只读镜像) |
2 |
CH2_EN |
R | 0 |
CH2 运行状态(只读镜像) |
1 |
CH1_EN |
R | 0 |
CH1 运行状态(只读镜像) |
0 |
CH0_EN |
R | 0 |
CH0 运行状态(只读镜像) |
Note
各通道的 DONE 标志通过按位 OR 汇聚为一个 PLIC 中断源(IRQ 3)。软件需读 PWM_GLB 判断具体是哪些通道完成。
8.4 编程模型¶
- 配置通道周期:写
PWM_CHn_PERIOD。 - 配置占空比:写
PWM_CHn_DUTY(值须 <= PERIOD)。 - 按需配置极性与中断:写
PWM_CHn_CTRL(POL、INTIE)。 - 启动通道:置位
PWM_CHn_CTRL.EN。 - 周期完成中断处理:读
PWM_GLB确认哪些通道完成,向对应 DONE 位写1清除。
9. SPI 控制器¶
SPI (Serial Peripheral Interface) 控制器提供全双工同步串行通信能力,可用于连接外部传感器、存储器件(Flash)等。
9.1 功能特性¶
- 主/从模式(通过寄存器选择,具体互联由平台决定)
- 全双工同步传输
- 8-bit 数据位宽
- 4 路片选信号(CS0~CS3)
- 中断:TXE、RXNE、错误(溢出/下溢)
9.2 寄存器映射¶
SPI 基地址:0x1001_8000。
| Offset | 寄存器 | 访问 | 复位值 | 描述 |
|---|---|---|---|---|
0x00 |
SPI_CR1 |
R/W | 0x0000_0000 |
控制寄存器 1 |
0x04 |
SPI_CR2 |
R/W | 0x0000_0000 |
控制寄存器 2 |
0x08 |
SPI_SR |
R/W | 0x0000_0002 |
状态寄存器 |
0x0C |
SPI_DR |
R/W | 0x0000_000C |
数据寄存器 |
0x10 |
SPI_CSCTRL |
R/W | 0x0000_0000 |
CS 控制寄存器 |
9.3 寄存器定义¶
9.3.1 SPI_CR1(Offset 0x00)— Control Register 1¶
| Bit | 名称 | 访问 | 复位 | 描述 |
|---|---|---|---|---|
31:7 |
Reserved | - | 0 |
保留位,必须保持为 0 |
6 |
SPE |
R/W | 0 |
SPI 使能:0 禁用;1 使能 |
5:3 |
Reserved | - | 0 |
保留位,必须保持为 0 |
2 |
MSTR |
R/W | 0 |
主从选择:0 从模式;1 主模式 |
1:0 |
Reserved | - | 0 |
保留位,必须保持为 0 |
9.3.2 SPI_CR2(Offset 0x04)— Control Register 2¶
| Bit | 名称 | 访问 | 复位 | 描述 |
|---|---|---|---|---|
31:8 |
Reserved | - | 0 |
保留位,必须保持为 0 |
7 |
TXEIE |
R/W | 0 |
TXE 中断使能:0 禁用;1 使能 |
6 |
RXNEIE |
R/W | 0 |
RXNE 中断使能:0 禁用;1 使能 |
5 |
ERRIE |
R/W | 0 |
错误中断使能(溢出/下溢):0 禁用;1 使能 |
4 |
SSOE |
R/W | 0 |
软件片选输出使能:0 禁用;1 使能 |
3:0 |
Reserved | - | 0 |
保留位,必须保持为 0 |
9.3.3 SPI_SR(Offset 0x08)— Status Register¶
| Bit | 名称 | 访问 | 复位 | 描述 |
|---|---|---|---|---|
31:8 |
Reserved | R | 0 |
保留位 |
7 |
BSY |
R | 0 |
忙标志:0 空闲;1 忙 |
6:4 |
Reserved | R | 0 |
保留位 |
3 |
OVERRUN |
R/W | 0 |
溢出错误:1 表示发生;写 1 清除 |
2 |
UNDERRUN |
R/W | 0 |
下溢错误:1 表示发生;写 1 清除 |
1 |
TXE |
R | 1 |
发送缓冲区空:1 空;0 满 |
0 |
RXNE |
R | 0 |
接收缓冲区非空:1 非空;0 为空 |
9.3.4 SPI_DR(Offset 0x0C)— Data Register¶
| Bit | 名称 | 访问 | 复位 | 描述 |
|---|---|---|---|---|
31:8 |
Reserved | - | 0 |
保留位,必须保持为 0 |
7:0 |
DATA |
R/W | 0x0C |
写入:发送数据;读取:接收数据 |
9.3.5 SPI_CSCTRL(Offset 0x10)— Chip Select Control¶
| Bit | 名称 | 访问 | 复位 | 描述 |
|---|---|---|---|---|
31:8 |
Reserved | - | 0 |
保留位,必须保持为 0 |
7 |
CS3_ACT |
R/W | 0 |
CS3 激活:0 未激活;1 激活 |
6 |
CS2_ACT |
R/W | 0 |
CS2 激活:0 未激活;1 激活 |
5 |
CS1_ACT |
R/W | 0 |
CS1 激活:0 未激活;1 激活 |
4 |
CS0_ACT |
R/W | 0 |
CS0 激活:0 未激活;1 激活 |
3 |
CS3_EN |
R/W | 0 |
CS3 使能:0 禁用;1 使能 |
2 |
CS2_EN |
R/W | 0 |
CS2 使能:0 禁用;1 使能 |
1 |
CS1_EN |
R/W | 0 |
CS1 使能:0 禁用;1 使能 |
0 |
CS0_EN |
R/W | 0 |
CS0 使能:0 禁用;1 使能 |
9.4 编程模型¶
- 初始化:配置
SPI_CR1.MSTR(主/从)与SPI_CR1.SPE(使能),按需配置SPI_CR2中断位。 - 片选:通过
SPI_CSCTRL使能并激活目标 CS(CS 具体有效电平与互联时序为实现定义)。 - 传输:
- 轮询
SPI_SR.TXE == 1后写SPI_DR.DATA发起发送; - 轮询
SPI_SR.RXNE == 1后读SPI_DR.DATA获取接收数据。
- 轮询
- 错误处理:若
SPI_SR.OVERRUN/UNDERRUN == 1,向SPI_SR对应位写 1 清除,并重新初始化传输状态。 - 结束:取消激活 CS,必要时关闭
SPI_CR1.SPE。
10. SPI Flash 互联¶
G233 开发板的 SPI 总线(SSI)上挂载了两片 Winbond SPI NOR Flash,通过片选信号区分。
10.1 Flash 配置¶
| 片选 | 型号 | 容量 | JEDEC ID | 说明 |
|---|---|---|---|---|
| CS0 | W25X16 | 2 MB | 0xEF 0x30 0x15 |
默认 Flash |
| CS1 | W25X32 | 4 MB | 0xEF 0x30 0x16 |
扩展 Flash |
10.2 支持的 Flash 命令¶
以下列出 G233 平台要求支持的 Flash 命令子集:
| 命令码 | 助记符 | 描述 | 地址字节 | 数据字节 |
|---|---|---|---|---|
0x9F |
JEDEC ID | 读取制造商/设备 ID | 0 | 3 (读) |
0x05 |
RDSR | 读状态寄存器 | 0 | 1 (读) |
0x06 |
WREN | 写使能 | 0 | 0 |
0x04 |
WRDI | 写禁止 | 0 | 0 |
0x20 |
SE | 扇区擦除 (4 KB) | 3 | 0 |
0x02 |
PP | 页编程 (最多 256 B) | 3 | 1-256 (写) |
0x03 |
READ | 读数据 | 3 | N (读) |
10.3 Flash 状态寄存器¶
| Bit | 名称 | 描述 |
|---|---|---|
0 |
BUSY |
1 表示擦除/编程操作正在进行 |
1 |
WEL |
1 表示写使能已激活 |
7:2 |
Reserved | 保留 |
10.4 典型操作流程¶
读取 JEDEC ID:激活 CS → 发送 0x9F → 读取 3 字节 → 取消 CS。
扇区擦除:激活 CS → 发送 0x06 (WREN) → 取消 CS → 激活 CS → 发送 0x20 + 3 字节地址 → 取消 CS → 轮询 BUSY 直到完成。
页编程:激活 CS → 发送 0x06 (WREN) → 取消 CS → 激活 CS → 发送 0x02 + 3 字节地址 + 数据(最多 256 字节)→ 取消 CS → 轮询 BUSY 直到完成。
数据读取:激活 CS → 发送 0x03 + 3 字节地址 → 连续读取 N 字节 → 取消 CS。