📖 第 27 章:SPI实验(SPI)

🔧 正点原子《DMF407 开发指南》V1.0 · Chapter 27
🗨️ 「四根线高速通信:SPI 是板内高速总线之王。」
这一章在干嘛? SPI 实验:SPI 四线制协议、W25Q64 NOR Flash、模式 0/1/2/3、HAL_SPI_TransmitReceive。从此 Flash / SD 卡 / 屏幕一通百通。
27.1 SPI 及 NOR Flash 介绍27.2 硬件设计27.3 程序设计27.4 下载验证

27.1 SPI 及 NOR Flash 介绍

27.1.1 SPI 协议

SPI(Serial Peripheral Interface):四线制同步串行总线。

信号方向作用
SCK主机→从机时钟
MOSI主机→从机主机发从机收
MISO从机→主机从机发主机收
NSS主机→从机片选(低有效)

原书图 27.1.1.1:SPI 总线拓扑
原书图 27.1.1.1:SPI 总线拓扑

四种模式(CPOL × CPHA):

模式CPOLCPHA空闲 SCL采样边沿
000上升沿
101下降沿
210下降沿
311上升沿

W25Q64 / 多数 Flash 用模式 0 或 3,SD 卡用模式 0。

27.1.2 W25Q64

W25Q64 是 64 Mbit(8 MB)SPI NOR Flash:

原书图 27.1.2.1:W25Q64 框图
原书图 27.1.2.1:W25Q64 框图

常用命令:

命令作用
读 ID0x9F读 JEDEC ID
读数据0x03低速读
页编程0x02写一页
扇区擦除0x20擦 4 KB
块擦除0xD8擦 64 KB
读状态寄存器0x05检查 BUSY 位

27.2 硬件设计

SPI2 复用引脚:PB13=SCK, PB14=MISO, PB15=MOSI, PB12=NSS。

原书图 27.2.1:SPI Flash 硬件连接
原书图 27.2.1:SPI Flash 硬件连接

27.3 程序设计

27.3.1 CubeMX 配置

27.3.2 关键代码

uint8_t cmd = 0x9F;
uint8_t id[3];
HAL_GPIO_WritePin(GPIOB, GPIO_PIN_12, GPIO_PIN_RESET);
HAL_SPI_Transmit(&hspi2, &cmd, 1, 100);
HAL_SPI_Receive(&hspi2, id, 3, 100);
HAL_GPIO_WritePin(GPIOB, GPIO_PIN_12, GPIO_PIN_SET);
// id 应为 0xEF, 0x40, 0x17

读写流程:

原书图 27.3.2.1:SPI Flash 读写流程图
原书图 27.3.2.1:SPI Flash 读写流程图

27.3.3 DMA 加速

大数据量用 DMA:

HAL_SPI_Transmit_DMA(&hspi2, tx, len);
HAL_SPI_Receive_DMA(&hspi2, rx, len);

27.4 下载验证

读 ID → 0xEF4017;写入字符串 → 复位后读出对比一致。

写之前必须擦除:Flash 只能把 1 写成 0,不能反过来,所以必须先擦除(1)再写。

🧠 小测验
SPI 至少需要几根线?
4 根(SCK / MOSI / MISO / NSS)。
W25Q64 容量多大?
64 Mbit = 8 MB。
SPI Flash 写之前为什么必须先擦?
Flash 只能把 1 写成 0,不能反向。
← 上一篇🏠 顶层目录下一篇 →