从零开始:STM32与W25Q64 Flash存储器的SPI接口全解析

摘要

本文将从基础出发,全面解析STM32微控制器与W25Q64 Flash存储器通过SPI接口的通信。内容包括SPI基础知识、W25Q64特性、硬件连接、SPI接口配置、读写操作及实际代码示例。

1. SPI通信基础

SPI是一种串行通信协议,主要特点包括:

  • 同步通信:数据传输由时钟信号同步。
  • 主从模式:一个主设备控制多个从设备。
  • 全双工:同时发送和接收数据。

2. W25Q64 Flash存储器特性

W25Q64是一款串行Flash存储器,主要特性包括:

  • 容量:8Mbit(1M字节)。
  • 组织:128个扇区,每个扇区包含16页,每页256字节。
  • 速度:最高时钟频率104MHz。
  • 擦写次数:100万次。

3. 硬件连接

W25Q64与STM32的硬件连接如下:

  • CS(片选)连接到STM32 GPIO(如PA4)。
  • SCK(时钟)连接到STM32 SPI时钟引脚(如PA5)。
  • MOSI(主设备数据输出)连接到STM32 SPI数据发送引脚(如PA7)。
  • MISO(主设备数据输入)连接到STM32 SPI数据接收引脚(如PA6)。
  • VCC连接到3.3V。
  • GND连接到地。

4. SPI接口配置

4.1 SPI初始化

初始化STM32的SPI接口,配置如下:

  • 使能SPI和GPIO时钟。
  • 配置SPI的MOSI、MISO、SCK引脚。
  • 设置SPI的工作模式、数据大小、时钟极性、时钟相位等。
void SPI_Init(void) {GPIO_InitTypeDef GPIO_InitStructure;SPI_InitTypeDef SPI_InitStructure;RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA, ENABLE);RCC_APB1PeriphClockCmd(RCC_APB1Periph_SPI1, ENABLE);GPIO_InitStructure.GPIO_Pin = GPIO_Pin_5 | GPIO_Pin_6 | GPIO_Pin_7;GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF_PP;GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;GPIO_Init(GPIOA, &GPIO_InitStructure);GPIO_InitStructure.GPIO_Pin = GPIO_Pin_4;GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP;GPIO_Init(GPIOA, &GPIO_InitStructure);SPI_InitStructure.SPI_Direction = SPI_Direction_2Lines_FullDuplex;SPI_InitStructure.SPI_Mode = SPI_Mode_Master;SPI_InitStructure.SPI_DataSize = SPI_DataSize_8b;SPI_InitStructure.SPI_CPOL = SPI_CPOL_High;SPI_InitStructure.SPI_CPHA = SPI_CPHA_2Edge;SPI_InitStructure.SPI_NSS = SPI_NSS_Soft;SPI_InitStructure.SPI_BaudRatePrescaler = SPI_BaudRatePrescaler_16;SPI_InitStructure.SPI_FirstBit = SPI_FirstBit_MSB;SPI_Init(SPI1, &SPI_InitStructure);SPI_Cmd(SPI1, ENABLE);
}

5. W25Q64读写操作

5.1 W25Q64初始化
void W25Q64_Init(void) {SPI_Init(); // 初始化SPI接口// 其他W25Q64初始化代码...
}
5.2 读取W25Q64 ID
uint16_t W25Q64_ReadID(void) {uint16_t id = 0;SPI_CS_Low(); // 选中W25Q64SPI_SendByte(0x90); // 发送读ID指令id = SPI_ReceiveByte() << 8; // 接收高字节id |= SPI_ReceiveByte(); // 接收低字节SPI_CS_High(); // 取消选中W25Q64return id;
}
5.3 写入W25Q64
void W25Q64_WriteByte(uint32_t addr, uint8_t data) {SPI_CS_Low(); // 选中W25Q64SPI_SendByte(0x02); // 发送页编程指令SPI_SendByte(addr >> 16); // 发送地址高字节SPI_SendByte(addr >> 8);  // 发送地址中字节SPI_SendByte(addr);       // 发送地址低字节SPI_SendByte(data);       // 发送数据SPI_CS_High(); // 取消选中W25Q64// 等待写入完成...
}
5.4 从W25Q64读取数据
uint8_t W25Q64_ReadByte(uint32_t addr) {uint8_t data;SPI_CS_Low(); // 选中W25Q64SPI_SendByte(0x03); // 发送读数据指令SPI_SendByte(addr >> 16); // 发送地址高字节SPI_SendByte(addr >> 8);  // 发送地址中字节SPI_SendByte(addr);       // 发送地址低字节data = SPI_ReceiveByte(); // 接收数据SPI_CS_High(); // 取消选中W25Q64return data;
}

6. 完整示例代码

以下是STM32与W25Q64 Flash存储器通信的完整示例代码。

int main(void) {// 系统初始化SystemInit();// 初始化W25Q64W25Q64_Init();// 读取W25Q64 IDuint16_t id = W25Q64_ReadID();printf("W25Q64 ID: 0x%X\r\n", id);// 测试写入和读取uint8_t testAddr = 0x000000; // 测试地址uint8_t testData = 0xAA;      // 测试数据W25Q64_WriteByte(testAddr, testData); // 写入数据uint8_t readData = W25Q64_ReadByte(testAddr); // 读取数据if (readData == testData) {printf("Write and read test passed.\r\n");} else {printf("Write and read test failed.\r\n");}while(1) {// 其他应用代码}
}

7. 结论

本文从零开始,全面解析了STM32与W25Q64 Flash存储器的SPI接口通信。通过详细的硬件连接、SPI配置、读写操作和示例代码,读者可以快速掌握SPI通信的实现方法。在实际开发中,根据具体的硬件配置和需求进行适当的调整和优化。

✅作者简介:热爱科研的嵌入式开发者,修心和技术同步精进

❤欢迎关注我的知乎:对error视而不见

代码获取、问题探讨及文章转载可私信。

☁ 愿你的生命中有够多的云翳,来造就一个美丽的黄昏。

🍎获取更多嵌入式资料可点击链接进群领取,谢谢支持!👇

点击领取更多详细资料

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/pingmian/36048.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

2008-2022年 上市公司-环境绩效数据(EP)

环境绩效&#xff08;Environmental Performance&#xff0c;简称EP&#xff09;是衡量组织在环境管理方面成效的重要指标&#xff0c;它体现了组织如何通过有效的环境管理体系来控制环境因素&#xff0c;实现环境方针和目标。以下是对上市公司环境绩效数据的详细介绍&#xff…

图的拓扑排序

图的拓扑排序&#xff08;Topological Sorting&#xff09;是一种线性排序&#xff0c;用于有向无环图&#xff08;Directed Acyclic Graph&#xff0c;DAG&#xff09;。拓扑排序将图中的顶点排成一个线性序列&#xff0c;使得对于每一条有向边 (u, v)&#xff0c;顶点 u 都排…

安全继电器的使用和工作原理

安全继电器的使用和工作原理 安全继电器是一种用于保护人员和设备安全的电气装置&#xff0c;通常用于监控和控制危险或紧急情况下的电气系统。它的主要作用是在检测到故障或危险情况时迅速切断电路&#xff0c;以防止潜在的伤害或损坏。使用 安全继电器通常用于以下情况&…

[AI开发配环境]VSCode远程连接ssh服务器

文章目录 总览&#xff1a;ssh连接远程服务器连接免密登录&#xff1a;Docker&#xff1a;ssh连接远程宿主机后&#xff0c;进一步连接并使用其中的docker容器reload window 配置解释器&#xff1a;CtrlP&#xff0c;在上面输入“>python”, 然后选selecet interpreter运行命…

Ubuntu磁盘分区和挂载 虚拟机扩容 逻辑卷的创建和扩容保姆及教程

目录 1、VMware虚拟机Ubuntu20.04系统磁盘扩容 2、Linux的磁盘分区和挂载 3、创建逻辑卷和逻辑卷的扩容 1、VMware虚拟机Ubuntu20.04系统磁盘扩容 通过下图可以看出我们的根磁盘一共有20G的大小&#xff0c;现在我们把它扩容为30G 注&#xff1a;如果你的虚拟机有快照是无…

Python高级编程:自然语言处理基础

Python高级编程:自然语言处理基础 在前几篇文章中,我们探讨了Python的基础语法、面向对象编程、标准库、第三方库、并发编程、异步编程、网络编程与网络爬虫、数据库操作与ORM、数据分析与数据可视化、机器学习基础以及深度学习基础。在这篇文章中,我们将深入探讨Python在自…

使用不同环境的配置文件active profile

在 IntelliJ IDEA 的 Run/Debug Configurations 中&#xff0c;Active profiles 选项通常用于与 Spring Boot 应用程序相关的配置。这是 Spring Boot 特有的一个用来管理不同环境配置的特性&#xff0c;通常用来在开发&#xff08;dev&#xff09;、测试&#xff08;test&#…

Springboot基于Redis的高性能分布式缓存数据库的实现与实例

一、引言 在现代的分布式系统和高并发应用中&#xff0c;缓存机制显得尤为重要。Redis作为一种开源&#xff08;BSD许可&#xff09;的内存键值存储&#xff0c;因其高性能、丰富的数据结构和多样化的应用场景&#xff0c;成为开发者们的首选。在这篇博客中&#xff0c;我们将…

CV每日论文--2024.6.26

1、StableNormal: Reducing Diffusion Variance for Stable and Sharp Normal 中文标题&#xff1a;StableNormal&#xff1a;减少扩散方差以实现稳定且锐利的法线 简介&#xff1a;本文介绍了一种创新解决方案&#xff0c;旨在优化单目彩色输入&#xff08;包括静态图片与动态…

最新自助下单彩虹云商城系统源码,含小储云商城模板免授权

最新彩虹商城源码,含小储云商城模板免授权&#xff0c;试用了一下还行&#xff0c;具体的大家可以看看 源码下载&#xff1a;https://download.csdn.net/download/m0_66047725/89405387 更多资源下载&#xff1a;关注我。

通过混合栅极技术改善p-GaN功率HEMTs的ESD性能

来源&#xff1a;Improved Gate ESD Behaviors of p-GaN PowerHEMTs by Hybrid Gate Technology&#xff08;ISPSD 24年&#xff09; 摘要 本工作中&#xff0c;首次证明了混合栅极技术在不增加额外面积和寄生效应的前提下&#xff0c;能有效提升p-GaN HEMTs的栅极静电放电(E…

2024广东省职业技能大赛云计算赛项实战——构建CICD

构建CI/CD 前言 题目如下&#xff1a; 构建CI/CD 编写流水线脚本.gitlab-ci.yml触发自动构建&#xff0c;具体要求如下&#xff1a; &#xff08;1&#xff09;基于镜像maven:3.6-jdk-8构建项目的drone分支&#xff1b; &#xff08;2&#xff09;构建镜像的名称&#xff1a…

浅浅谈谈如何利用Javase+多线程+计算机网络的知识做一个爬CSDN阅读量总访问量的程序

目录 我们发现csdn的文章 首先为了印证我们的想法 我们用postman往csdn我们任意一篇文章发起post请求 发送请求 ​编辑获得响应结果 我们发现我们的阅读量上涨 PostRequestSender类 但是我们经过测试发现 定义一个字符串数组 把URL放进去 然后延迟启动 在线程池里面…

SaaS架构Client/Server应用的实验室LIS系统源码,服务可拆分,功能易扩展

LIS系统&#xff0c;即实验室&#xff08;检验科&#xff09;信息系统&#xff0c;它是医院信息管理的重要组成部分之一&#xff0c;LIS系统采用了智能辅助功能来处理大信息量的检验工作&#xff0c;即LIS系统不仅是自动接收检验数据&#xff0c;打印检验报告&#xff0c;系统保…

Jboss通过未授权/弱口令进入后台上传webshell

目录 Jboss介绍 CVE-2007-1036 漏洞产生的原因 利用原理 访问页面 写入webshell 未授权访问后上传webshell 这一篇学习通过参考大佬的好文章学习Jboss的弱口令/未授权漏洞进入后台Getshell Jboss介绍 JBoss是一个基于J2EE的开放源代码应用服务器&#xff0c;代码遵循L…

python使用Pybind11扩展c++

Pybind11 是一个轻量级的C 库&#xff0c;旨在无缝地将C代码绑定到Python。它简化了C 函数、类和数据结构在Python中使用的过程&#xff0c;使得开发人员可以方便地在Python中调用C 代码&#xff0c;同时保留两者的性能优势下面将详细介绍Pybind11的基本概念、安装方法、用法以…

《梦醒蝶飞:释放Excel函数与公式的力量》6.2 TIME函数

6.2 TIME函数 1&#xff09; TIME函数概述 TIME函数是Excel中用于根据指定的小时、分钟和秒返回时间值的内置函数。这个时间值是一个从0&#xff08;12:00 AM&#xff09;开始的序列数&#xff0c;其中一天的每个小时等于1/24&#xff0c;每分钟等于1/(24*60)&#xff0c;每秒…

MySQL中的TRUNCATE命令是否直接删除文件

1. TRUNCATE命令的基本原理 命令格式&#xff1a;TRUNCATE TABLE table_name;功能&#xff1a;TRUNCATE命令用于删除表中的所有数据&#xff0c;但保留表结构和定义&#xff08;如列、索引、约束等&#xff09;。 2. TRUNCATE命令的实现机制 数据删除&#xff1a;TRUNCATE命…

【系统架构设计师】六、信息系统基础知识(电子政务|企业信息化|电子商务|信息化战略体系)

目录 一、电子政务EG 1.1 电子政务的内容 1.2 电子政务的主要特征 二、企业信息化EI 2.1 企业信息化实现 2.2 企业信息化方法 三、电子商务EC 四、信息化战略体系 五、客户关系CRM 5.1 CRM的功能 5.2 CRM解决方案具备的要素 5.3 CRM的实现过程 六、供应链管理SCM 七…

tensorflow神经网络

训练一个图像识别模型&#xff0c;使用TensorFlow&#xff0c;需要以下步骤。 1. 安装所需的库 首先&#xff0c;确保安装了TensorFlow和其他所需的库。 pip install tensorflow numpy matplotlib2. 数据准备 需要收集和准备训练数据。每个类别应有足够多的样本图像。假设有…