STM32学习笔记(11_2)- W25Q64简介和工作原理

本文介绍了作者在学习STM32过程中对SPI通信协议的学习,包括其与I2C的对比,以及如何使用SPI与W25Q64Flash存储器进行数据交换,涉及硬件电路、驱动和Flash操作注意事项。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

无人问津也好,技不如人也罢,都应静下心来,去做该做的事。

最近在学STM32,所以也开贴记录一下主要内容,省的过目即忘。视频教程为江科大(改名江协科技),网站jiangxiekeji.com

本期学习另一个通信协议SPI,和I2C差不多,都是实现主控芯片和各种外挂芯片之间的数据交流。学习流程也是一样,先学习SPI协议的软硬件规定。先用软件模拟的SPl,实现读写这个W25Q64 Flash存储器,之后再学习STM32中的SPI外设,再用硬件SPI实现一样的功能。

W25Q64是一个flash存储器芯片,内部可存8M,并且掉电不丢失。

I2C可以在消耗最低硬件资源的情况下,实现最多的功能,但是时序复杂,通信速度慢(标准模式下100KHz)。高位先行,只有在SCL高电平时才会读取SDA的电平。

SPI传输速度快,最大传输速率取决于芯片厂商的设计,比如W25Q64,手册里写的SPI时钟频率,最大可达80MHz;其次设计简单,没有I2C那么复杂;最后,硬件开销比较大,占用的通信线多。高位先行,数据位的输入和输出都是在SCK的上升沿或下降沿进行的。

在SPI中通常采用指令码加读写数据的模型,即SPI的通信流程是起始后+第一个字节(指令码里面的指令)+读/写指令。在SPI从机的芯片手册上,都会定义好对应的指令集。

本期主要介绍W25Q64

W25Q64简介

W25Qxx的硬件电路和底层驱动文件都是一样,只是容量大小区别。

W25Q64硬件电路

3.3V供电,CS左边有/或上面有个横线表示低电平有效,

WP接低电平会保护住芯片,不让写。

括号里的IO0、IO1表示SPI双重模式下这两个引脚的作用。

原理图上把HOLD和WP引脚直接接到VCC,表示不用这两个引脚的功能。

 W25Q64框图

因为内部有8M的空间,为了易于管理,就进行分区。整个地址空间从0x00 00 00到0x7F FF FF,在整个地址空间里以64KB为一个基本单元,划分为若干块Block,并从前往后分为块0、块1、块2....块127。然后对每一块进行以4KB为一个基本单元的划分Sector(扇区),每一块里又分为扇区0、1...直到扇区15。当然我们写程序时,会对扇区再进行一个划分,也就是页(Page),页的大小是256个字节,所以一个扇区又可分为16页。右边的框图中每一行就是一页,在一页中的地址的变化范围是0x xx xx 00到0x xx xx FF。

 Flash操作注意事项

读取一般会比较快;写入的步骤多,所以速度会慢一点。

因为Flash数据位只能1改写为0,所以在写入前必须擦除(即把数据位都变为1).

在Flash中,0xFF代表空白,而不是0x00。

擦除时可选择整个Flash擦除或按块擦除或按扇区擦除,最小的擦除单元是一个扇区(4KB或4096个字节)。比如想改动一个字节的数据,只能先把同一个扇区的其他数据都读出去,然后整个扇区擦除,再把改动的一个字节和同个扇区的其他数据写进去。

一个写入时序,最多只能写一页的数据,即256字节。

 

### 关于江科大 STM32 W25Q64 的资料、项目及示例代码 #### 使用STM32操作W25Q64闪存芯片的方法 对于STM32平台而言,无论是采用软件SPI还是硬件SPI接口与W25Q64通信,都能发挥各自特点[^1]。具体来说: - **硬件SPI方式**:利用STM32内置的SPI模块可以更高效地完成数据传输任务,减少CPU占用率并提高整体性能。 - **软件SPI方式**:通过编程控制GPIO引脚模拟SPI协议,在灵活性方面表现突出。 为了更好地理解如何基于STM32开发板连接驱动W25Q64存储器,下面给出一段简单的初始化配置以及读写测试程序作为参考实例。 ```c #include "stm32f1xx_hal.h" // 定义 SPI 接口使用的 GPIO 引脚 #define SPI_CS_PIN GPIO_PIN_4 #define SPI_CS_PORT GPIOA void W25Q64_Init(void){ // 初始化 CS 引脚为输出模式 __HAL_RCC_GPIOA_CLK_ENABLE(); GPIO_InitTypeDef GPIO_InitStruct = {0}; GPIO_InitStruct.Pin = SPI_CS_PIN; GPIO_InitStruct.Mode = GPIO_MODE_OUTPUT_PP; GPIO_InitStruct.Pull = GPIO_NOPULL; GPIO_InitStruct.Speed = GPIO_SPEED_FREQ_HIGH; HAL_GPIO_Init(SPI_CS_PORT, &GPIO_InitStruct); } uint8_t W25Q64_ReadStatusRegister(void){ uint8_t status_register_value; // 设置片选信号有效 (低电平) HAL_GPIO_WritePin(SPI_CS_PORT,SPI_CS_PIN,GPIO_PIN_RESET); // 发送命令字节给设备... // 这里省略实际发送过程... // 获取状态寄存器返回值... // ... // 取消片选信号 (高电平) HAL_GPIO_WritePin(SPI_CS_PORT,SPI_CS_PIN,GPIO_PIN_SET); return status_register_value; } ``` 上述代码片段展示了基本框架下的初始化函数`W25Q64_Init()`用于设置CS线;另一个辅助功能`W25Q64_ReadStatusRegister()`则示范了怎样向W25Q64发出指令获取其当前工作状态的信息。需要注意的是,真正的SPI通讯细节已被简化处理以便聚焦核心逻辑。 此外,针对想要深入了解该主题的学习者,建议查阅由江苏科技大学提供的《STM32自学笔记》系列文档[^2],其中包含了更多关于嵌入式系统的理论基础技术实践指导材料。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值