STM32通过SPI进行W25Q128(外部flash)读写操作

W25Q128:一颗SPI接口的外部NOR Flash储存器

容量128M-bit=16MB

作用特点:

1.储存程序/大容量数据

2.断电不丢失

一,内部结构

W25Q128 内部划分如下:

  • 16MB 总容量

  • 分成 256 个 Block(每个 64KB)

  • 每个 Block 里 16 个 Sector(每个 4KB)

  • Sector 里很多 Page(每个 256B)

结构如下:

复制代码
Chip (16MB)
 └── Block (64KB)
      └── Sector (4KB)
           └── Page (256B)

二,读写机制

1,擦除的最小单位:4KB Sector

2,数据只能从1➡0,不能从0➡1

所以写数据之前要擦除4kb区域(全部变成0XFF)


写Page(256字节)

写入数据的最小单位是Page(256B)

一次最多写256字节,超过会自动翻页


读取数据(不需要擦除)

读写字节很快,可以连续读多个字节;

常见指令:

  • 0x03:普通读(低速)

  • 0x0B:快速读(高速)

  • 0x3B / 6B / EB:双/四线高速读(QSPI)


4.状态寄存器

用于判断:

  • Flash 是否忙(BUSY 位)

  • 是否写使能

  • 安全保护状态

读写状态寄存器的指令也非常常用。

SPI通信协议

SPI:一种高速,全双工,同步的串行通信协议,支持一主多从;

接线:一一对应;通过DATASHEET文件查看结构框图

SPI的结构框图

SPI的工作模式

全双工:可以同时发送和接受

半双工:同一时刻要么发送,要么接收;

单工:单向通信

类型 是否能同时收发? 数据方向 例子
全双工 ✔ 能同时 双向独立 SPI、UART
半双工 ✘ 不能同时(轮流) 双向,共用通道 I²C、RS485
单工 ✘ 永远单向 单向 红外遥控、广播

SPI四根线的作用

引脚 名称 含义 谁驱动?
SCK Serial Clock 时钟信号 主机(Master)输出
MOSI Master Out Slave In 主 → 从 主机输出
MISO Master In Slave Out 从 → 主 从机输出
CS / NSS Chip Select 片选 主机输出

SPI由主机产生时钟,从机只在时钟节拍下接受或输出数据


SPI的数据流:

/CS 拉低(选中从机)之后:

  • 在 SCK 的每个跳变沿,从机和主机都会交换 1 bit 数据

  • MOSI 上的数据先写给从机

  • MISO 上的数据从从机返回主机

  • 一次时钟 = 数据同时双向飞一次

SPI = 每个时钟都同时读 + 写。

SPI的四种工作模式

模式 CPOL CPHA 官方名字
Mode 0 0 0 低电平空闲,上升沿采样
Mode 1 0 1 低电平空闲,下降沿采样
Mode 2 1 0 高电平空闲,下降沿采样
Mode 3 1 1 高电平空闲,上升沿采样

最常见的:Mode 0(W25Q128 也是)


SPI怎么使用?

1,拉低片选CS

2,发送命令/地址/数据

3,接受数据

4,拉高片选CS

SPI使用注意事项

1,时序模式必须对其

2,片选CS必须手动控制

SPI是全双工的,一定会收到东西

4,速度不要太快:

  • 最大频率 80MHz

  • 写操作推荐 < 20MHz

5,上电前几个ms不要操作SPI,避免外设未初始化好

STM32F407ZGT6的SPI软件思路:1,用的是SPI的哪个接口?2,是主机还是从机?3,发送一次数据的大小是多少?4,SPI的工作模式?5,CS由软件控制还是硬件控制?6,时钟的配置?7,数据传输是MSB还是LSB?8,主关闭TI,从打开TI.9,crc校验打开了吗?

引脚模式为什么要用复用推挽输出

复用:把IO口的控制权交给SPI

推挽输出:强驱动、明确的高低电平、抗干扰

CS推挽输出,其余三个复用推挽输出

数组复习知识

如果定义一个数组长度20,但是我赋值abc,只有三个字节,那后面的20个字节会是什么数据呢?

  • 第 3 字节:'\0'(确定,strcpy自动加);
数组定义方式 未赋值部分(第 4~19 字节) 是否推荐写入 Flash?
未初始化的局部数组 随机垃圾数据 不推荐(数据混乱)
全局数组(未手动初始化) 全 0x00 可选(但 0x00 后续修改需擦除)
手动用 memset 初始化为 0xFF 全 0xFF 强烈推荐(适配 Flash "先擦后写" 规则)

是否留 1 字节存\0,只看你后续是否用「字符串函数(如strcpyprintfstrlen)操作数据」------ 用字符串函数才需要留

相关推荐
Xueqian E11 小时前
驱动策略和效率的整理
stm32·单片机·嵌入式硬件
电子工程师成长日记-C5113 小时前
51单片机气压检测仪
单片机·嵌入式硬件·51单片机
嵌入式老菜鸟qq12524277313 小时前
nRF54H20 + Zephyr 开发环境(二):烧录与踩坑实录
stm32·单片机·嵌入式硬件
-Try hard-13 小时前
ARM | 点亮LED灯!
arm开发·单片机·嵌入式硬件
llilian_1613 小时前
卫星时钟 时钟同步解决方案——基于高精度卫星时钟同步授时装置 卫星同步时钟 授时同步装置
功能测试·单片机·测试工具
日更嵌入式的打工仔14 小时前
电机三环控制
单片机·嵌入式硬件
weixin_6695452014 小时前
JT8166A/B电容式六按键触摸控制芯片,JT8166B具备IIC通信接口
人工智能·单片机·嵌入式硬件·硬件工程
RFID舜识物联网14 小时前
RFID耐高温标签在汽车喷涂工艺中的创新应用
大数据·人工智能·科技·嵌入式硬件·物联网·汽车
CODE_RabbitV14 小时前
STM32F103C8T6 理论部分学习笔记
笔记·stm32·学习
泛凡(Linyongui)14 小时前
一款基于LP4057芯片的单节 4.2V 锂电池线性充电管理电路,带电源路径自动切换功能
arm开发·单片机·py32