深入探索STM32的SPI功能:W25Q64 Flash存储器全攻略

摘要

随着嵌入式系统对存储需求的增长,选择合适的存储设备变得尤为重要。W25Q64 Flash存储器以其8Mbit的存储容量和SPI接口的便捷性,成为STM32微控制器项目中的优选存储方案。本文将深入探索STM32的SPI功能,提供W25Q64 Flash存储器的全面集成指南,包括硬件配置、SPI接口编程和实际代码示例。

1. SPI通信基础

SPI是一种同步串行通信协议,广泛应用于微控制器与外设间的通信。主要特性包括:

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

2. W25Q64 Flash存储器特性

W25Q64是一款串行Flash存储器,具备以下特性:

  • 容量:8Mbit,即1M字节。
  • 组织:分为128个扇区,每扇区含16页,每页256字节。
  • 擦写次数:高达100万次。
  • 工作电压:2.7V至3.6V。

3. 硬件连接

W25Q64与STM32的硬件连接包括:

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

4. SPI接口配置

4.1 硬件SPI初始化

硬件SPI初始化代码示例:

void SPI_Hardware_Init(void) {GPIO_InitTypeDef GPIO_InitStructure;SPI_InitTypeDef SPI_InitStructure;RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA | 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);
}
4.2 W25Q64初始化

W25Q64初始化涉及SPI初始化和芯片特定设置。

void W25Q64_Init(void) {SPI_Hardware_Init();// 发送W25Q64的复位指令(如果需要)
}

5. W25Q64 Flash存储器操作

5.1 读取W25Q64 ID

读取ID用于验证W25Q64芯片。

uint16_t W25Q64_ReadID(void) {uint16_t id = 0;SPI_CS_Low();SPI_SendByte(0x90); // READ ID COMMANDid = SPI_ReceiveByte() << 8;id |= SPI_ReceiveByte();SPI_CS_High();return id;
}
5.2 写入W25Q64

页编程是W25Q64写入数据的基本操作。

void W25Q64_WriteByte(uint32_t addr, uint8_t data) {SPI_CS_Low();SPI_SendByte(0x02); // PAGE PROGRAM COMMANDSPI_SendByte(addr >> 16);SPI_SendByte(addr >> 8);SPI_SendByte(addr);SPI_SendByte(data);SPI_CS_High();// 等待写入完成...
}
5.3 从W25Q64读取数据

读取数据操作允许从指定地址读取信息。

uint8_t W25Q64_ReadByte(uint32_t addr) {uint8_t data;SPI_CS_Low();SPI_SendByte(0x03); // READ DATA COMMANDSPI_SendByte(addr >> 16);SPI_SendByte(addr >> 8);SPI_SendByte(addr);data = SPI_ReceiveByte();SPI_CS_High();return data;
}

6. 完整示例代码

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

int main(void) {SystemInit();W25Q64_Init();uint16_t id = W25Q64_ReadID();printf("W25Q64 ID: 0x%X\r\n", id);uint32_t testAddr = 0x000000; // 测试地址uint8_t testData = 0xAA; // 测试数据W25Q64_WriteByte(testAddr, testData); // 写入数据// 延迟一段时间,等待数据写入完成for (volatile int i = 0; i < 0x100000; i++);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的SPI功能,并提供了W25Q64 Flash存储器的全攻略。从SPI通信的基础到W25Q64的特性,再到具体的硬件连接和SPI接口编程,本文为读者提供了全面的集成方案。示例代码进一步演示了如何在实际项目中应用这些知识,帮助读者深入理解和掌握SPI通信技术。

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

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

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

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

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

点击领取更多详细资料

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

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

相关文章

如何成为-10x工程师:反向教学大数据开发实际工作中应如何做

10x 工程师可能是神话&#xff0c;但 -10x 工程师确实存在。要成为 -10x 工程师&#xff0c;只需每周浪费 400 小时的工程时间。结合以下策略&#xff1a; 目录 如何使 10 名工程师的输出无效化改变需求大数据开发示例 创建 400 小时的繁忙工作任务示例大数据开发示例 创建 400…

WPF UI交互专题 界面结构化处理 查看分析工具Snoopy 逻辑树与视觉树 平面图像 平面图形 几何图形 弧线 01

1、开发学习环境 2、XAML界面结构化处理 3、逻辑树与视觉树 4、基于XAML的标签扩展方式 5、基础控件应用分析 6、控件常用属性与事件总结 7、常用控件特别属性说明 8、平面图形控件与属性 9、平面几何图形 10、弧线的处理过程 WPF项目-XAML 项目表现形式 项目结…

threadX netX 创建/删除 IP实例,使能 ARP地址解析

创建IP实例 函数原型 UINT nx_ip_create( NX_IP *ip_ptr, CHAR *name, ULONG ip_address, ULONG network_mask,NX_PACKET_POOL *default_pool,VOID (*ip_network_driver)(NX_IP_DRIVER *), VOID *memory_ptr,ULONG memory_size,UINT priority);参数&#xff1a; ip_ptr&…

Sectigo或RapidSSL DV通配符SSL证书哪个性价比更高?

在当前的网络安全领域&#xff0c;选择一款合适的SSL证书对于保护网站和用户数据至关重要。Sectigo和RapidSSL作为市场上知名的SSL证书提供商&#xff0c;以其高性价比和快速的服务响应而受到市场的青睐。本文将对Sectigo和RapidSSL DV通配符证书进行深入对比&#xff0c;帮助用…

C#给SqlSugar封装一个单例类

.NET兼职社区 可以直接用&#xff0c;轻量方便&#xff0c;无需重复造轮子。 这里只对CRUD进行封装&#xff0c;我的应用比较简单。 using SqlSugar; using System.Collections.Generic;namespace MusicApp.Assist {internal class SqlSugarAssist{private static readonly ob…

Scrapy框架与其他Python爬虫库的对比分析

在当今互联网高速发展的时代&#xff0c;数据的价值也越来越凸显&#xff0c;因此爬虫技术也越来越受到关注和重视。python 爬虫库是爬虫开发中最常用的工具之一&#xff0c;而 scrapy 框架就是其中比较流行的一个。本文将会对 scrapy 框架和其他 python 爬虫库进行对比分析。 …

Firefox 编译指南2024 Windows10- 定制化您的Firefox(四)

1. 引言 定制化您的Firefox浏览器是一个充满乐趣且富有成就感的过程。在2024年&#xff0c;Mozilla进一步增强了Firefox的灵活性和可定制性&#xff0c;使得开发者和高级用户能够更深入地改造和优化浏览器以满足个人需求。从界面的微调到功能的增强&#xff0c;甚至是核心代码…

我在高职教STM32——GPIO入门之按键输入(2)

大家好&#xff0c;我是老耿&#xff0c;高职青椒一枚&#xff0c;一直从事单片机、嵌入式、物联网等课程的教学。对于高职的学生层次&#xff0c;同行应该都懂的&#xff0c;老师在课堂上教学几乎是没什么成就感的。正因如此&#xff0c;才有了借助 CSDN 平台寻求认同感和成就…

【前端】Web操作文件的可能性——浅谈一下File System Api

Web操作文件的可能性——浅谈一下File System Api 随着Web技术的发展&#xff0c;现代Web应用程序越来越多地需要与用户的本地文件系统交互。文件系统API&#xff08;File System API&#xff09;为开发者提供了一组标准和接口&#xff0c;使得Web应用程序可以像本地应用程序一…

240628_昇思学习打卡-Day10-SSD目标检测

240628_昇思学习打卡-Day10-SSD目标检测 今天我们来看SSD&#xff08;Single Shot MultiBox Detector&#xff09;算法&#xff0c;SSD是发布于2016年的一种目标检测算法&#xff0c;使用的是one-stage目标检测网络&#xff0c;意思就是说它只需要一步&#xff0c;就能把目标检…

【C++题解】1466. 等差数

问题&#xff1a;1466. 等差数 类型&#xff1a;简单循环 题目描述&#xff1a; Peter 同学刚刚在学校学习了等差数列的概念。 等差数列&#xff0c;指的是一组数&#xff0c;这些数连续 2 个数的差值是相等的&#xff0c;比如&#xff1a;123&#xff0c;135&#xff0c;852…

SerDes介绍以及原语使用介绍(2)OSERDESE2原语仿真

文章目录 前言一、SDR模式1.1、设计代码1.2、testbench代码1.3、仿真分析 二、DDR模式下2.1、设计代码2.2、testbench代码2.3、仿真分析 三、OSERDES2级联3.1、设计代码3.2、testbench代码3.3、代码分析 前言 上文通过xilinx ug471手册对OSERDESE有了简单的了解&#xff0c;接…

Spring Batch批量处理数据

Spring Batch 是一个由 Pivotal Software&#xff08;原 SpringSource&#xff0c;现属于 VMware&#xff09;开发的批处理框架&#xff0c;它是 Spring 框架的一部分&#xff0c;主要用于创建高效、健壮的批量数据处理应用。Spring Batch 设计用于处理大量的记录&#xff0c;例…

PreparedStatement 与Statement 的区别,以及为什么推荐使用 PreparedStatement ?

在Java中&#xff0c;PreparedStatement和Statement都是用于执行SQL语句的重要接口&#xff0c;但它们在功能、安全性和性能上有着显著的差异。理解这些差异对于编写高效且安全的数据库应用程序至关重要。 Statement&#xff1a;基本的SQL执行者 首先&#xff0c;让我们从Sta…

[物联网专题] - 螺钉式接线端子的选择和辨识

工业设备上大量使用各式各样的端子来连接外部设备和电缆电线&#xff0c;其中用得最多的就是标准的螺钉式端子&#xff0c;其外形如下&#xff1a; 标准端子一般是2位&#xff08;2个接线端子&#xff09;&#xff0c;端子与端子之间可以级联&#xff0c;组成任意数量的位数。…

【前端】简易化看板

【前端】简易化看板 项目简介 看板分为三个模块&#xff0c;分别是待办&#xff0c;正在做&#xff0c;已做完三个部分。每个事件采取"卡片"式设计&#xff0c;支持任务间拖拽&#xff0c;删除等操作。 代码 import React, { useState } from react; import { Car…

【图论 树 深度优先搜索】2246. 相邻字符不同的最长路径

本文涉及知识点 图论 树 图论知识汇总 深度优先搜索汇总 LeetCode 2246. 相邻字符不同的最长路径 给你一棵 树&#xff08;即一个连通、无向、无环图&#xff09;&#xff0c;根节点是节点 0 &#xff0c;这棵树由编号从 0 到 n - 1 的 n 个节点组成。用下标从 0 开始、长度…

如何正视AI创造音乐

音乐作为一种艺术形式&#xff0c;一直被认为是人类情感和创造力的表达。然而&#xff0c;随着人工智能技术的快速发展&#xff0c;AI在音乐领域的应用也日益广泛。最近一个月&#xff0c;音乐大模型的轮番上线&#xff0c;将素人生产音乐的门槛降到了最低&#xff0c;引发了音…

【漏洞复现】SolarWinds——任意文件读取

声明&#xff1a;本文档或演示材料仅供教育和教学目的使用&#xff0c;任何个人或组织使用本文档中的信息进行非法活动&#xff0c;均与本文档的作者或发布者无关。 文章目录 漏洞描述漏洞复现测试工具 漏洞描述 SolarWinds其Serv-UFTP服务存在目录遍历导致任意文件读取漏洞&a…

数据访问层如何提取数据到其他层,其他类中

当然可以&#xff0c;以下是一些具体的例子&#xff0c;展示了如何将数据库访问逻辑封装在一个单独的类中&#xff0c;并在其他类中使用这个类来获取数据。 数据库访问类&#xff08;DatabaseAccess.java&#xff09;&#xff1a; java复制代码 import java.sql.*; import ja…