STM32开发实战:SPI接口在W25Q64 Flash存储器中的应用

摘要

本文将深入探讨STM32微控制器如何利用SPI接口与W25Q64 Flash存储器进行通信。W25Q64是一款常用的SPI串行Flash存储器,具有8Mbit的存储容量。本教程将指导读者完成硬件连接、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数据发送引脚(例如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 Flash存储器操作

5.1 W25Q64初始化

在SPI初始化之后,需要初始化W25Q64 Flash存储器。

void W25Q64_Init(void) {SPI_Init(); // 初始化SPI// 发送W25Q64的复位指令(如果需要)
}
5.2 读取W25Q64 ID

读取W25Q64的ID用于验证设备。

uint16_t W25Q64_ReadID(void) {uint16_t id = 0;// 选中W25Q64// 发送读ID指令// 读取并返回IDreturn id;
}
5.3 写入W25Q64

写入W25Q64之前,需要确保数据已经准备好,并且W25Q64处于可写状态。

void W25Q64_WriteByte(uint32_t addr, uint8_t data) {// 选中W25Q64// 发送页编程指令// 发送数据地址// 发送数据// 取消选中W25Q64
}
5.4 从W25Q64读取数据

从W25Q64读取数据是一个直接的过程。

uint8_t W25Q64_ReadByte(uint32_t addr) {uint8_t data = 0;// 选中W25Q64// 发送读数据指令// 发送数据地址// 读取数据// 取消选中W25Q64return data;
}

6. 完整示例代码

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

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

7. 结论

本文详细介绍了STM32 SPI接口在W25Q64 Flash存储器中的应用,包括硬件连接、SPI配置、读写操作和完整的代码实现。通过本教程,读者应能够理解并实现STM32与W25Q64的通信,为嵌入式系统开发提供非易失性存储解决方案。

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

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

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

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

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

点击领取更多详细资料

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

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

相关文章

激光雷达数据处理

激光雷达技术以其高精度、高效率的特点,已经成为地表特征获取、地形建模、环境监测等领域的重要工具。掌握激光雷达数据处理技能,不仅可以提升工作效率,还能够有效提高数据的质量和准确性,为决策提供可靠的数据支持。 第一章、激…

【论文解读】STUDY ON CODING TOOLS BEYOND AV1

论文下载地址:STUDY ON CODING TOOLS BEYOND AV1 摘要 开放媒体联盟最近启动了针对超越AV1的下一代视频编码工具的探索活动。 在这方面,本文介绍了一套在称为libaom的代码库之上经过研究、实施和测试的编码工具包,该代码库用于探索下一代视频压缩工具。 所提出的工具涵盖了…

Spring自带的持久层模板类:JdbcTemplate+Spring框架声明式事务管理实战

模板技术 Spring框架中提供了很多模板类来简化编程,使用模板类编写程序会变的简单 持久层模板JdbcTemplate JdbcTemplate是什么 JDBCTemplate是Spring Framework中的一个核心类,用于简化JDBC(Java数据库连接)代码的编写。它提供…

Gazebo给机器人添加碰撞检测属性bumper

参考:GAZEBO探索——给机器人加上bumper_gazebo bumper-CSDN博客 gazebo的bumper使用_gazebo bumper-CSDN博客使用URDF在Gazebo中搭建碰撞仿真(bumper)_gazebo bumper-CSDN博客 gazebo官网中bumper插件介绍 Gazebo : Tutorial : Gazebo plugins in ROS 添加的到.…

SQLite、MySQL、PostgreSQL 3个关系数据库之间优缺点对比

引言 关系数据模型以行和列的表格形式组织数据,在数据库管理工具中占主导地位。今天还有其他数据模型,包括NoSQL和NewSQL,但是关系数据库管理系统(RDBMS)仍然占主导地位用于存储和管理全球数据。 本文比较了三种实现最…

关于几种熵的计算(MATLAB)

Shannon在1948年定义了信息熵,并用信息熵来衡量一个事件的不确定程度。作为信息论中一个重要的基本概念,信息就是一种客观存在和能动的过程,它可以减少或者消除事件的不确定因素。一切客观事物的属性中都包含着不确定性,人们在没有…

mac菜单栏应用管理软件:Bartender 4 for Mac 中文激活版

Bartender 4 是一款由Bearded Men Games开发的适用于Mac操作系统的应用程序,它被设计用来优化和美化Mac菜单栏的功能。自从macOS Big Sur开始,Mac的菜单栏可以自定义,用户可以添加和移除各种图标。Bartender 4就是在这个背景下应运而生&#…

Redis高可用(主从复制、哨兵模式)详解

Redis高可用(主从复制、哨兵模式)详解 Redis是一种高性能的键值存储系统,能够通过多种机制来实现高可用性,这些机制主要包括主从复制(Replication)和哨兵模式(Sentinel)。 Redis 主…

js,uni 自定义 时间选择器 vue2

<template><view class"reserve-time-box"><view class"title">选择时间</view><view class"date-box"><view class"date-scroll-box" :style"{ width : ${dataTimeWidth}rpx }"><v…

contenteditable——html5新增的一个允许用户直接在页面中编辑文本内容的属性

一、定义与功能 contenteditable是HTML5中的一个属性&#xff0c;它的主要功能是允许用户直接在页面中编辑文本内容。当将contenteditable属性设置为"true"时&#xff0c;用户可以点击、选择、编辑和删除元素中的文本内容。这使得网页成为一个可编辑的区域&#xff…

Node.js下载及安装详细教程

目录 Node.js安装详细教程 下载安装环境变量配置文件结构配置npm在安装全局模块时的路径和缓存cache的路径测试常见命令 Node.js安装详细教程 &#x1f441;官网下载地址:Download | Node.js (nodejs.org) 下载速度慢的话 可以使用网盘下载&#xff1a; https://pan.quark.…

自然语言处理基本知识(1)

一 分词基础 NLP:搭建了计算机语言和人类语言之间的转换 1 精确分词&#xff0c;试图将句子最精确的分开&#xff0c;适合文本分析 >>> import jieba >>> content "工信处女干事每月经过下属科室" >>> jieba.cut(content,cut_all …

TCP、UDP详解

目录 1.区别 1.1 概括 1.2 详解 2.TCP 2.1 内容 2.2 可靠传输 2.2.1 确认应答 2.2.2 超时重传 2.2.3 连接管理 三次握手 四次挥手 2.2.4 滑动窗口 2.2.5 流量控制 2.2.6 拥塞控制 2.2.7 延时应答 2.2.8 捎带应答 2.2.9 面向字节流 2.2.10 异常情况的处理 1.…

力扣322 零钱兑换 Java版本

文章目录 题目描述代码 题目描述 给你一个整数数组 coins &#xff0c;表示不同面额的硬币&#xff1b;以及一个整数 amount &#xff0c;表示总金额。 计算并返回可以凑成总金额所需的 最少的硬币个数 。如果没有任何一种硬币组合能组成总金额&#xff0c;返回 -1 。 你可以…

通达信短线抄底主升浪幅图指标公式源码

通达信短线抄底主升浪幅图指标公式源码&#xff1a; A1:REF(C,1); A2:SMA(MAX(C-A1,0),5,1)/SMA(ABS(C-A1),5,1)*1000; A3:BARSLAST(REF(CROSS("RSI.RSI1"(6,12,24),"RSI.RSI2"(6,12,24)),1)); A4:A2-LLV(A2,10); A5:(MA(A4,2)*3A4*13)/16; A6:IF(A5>1…

最新!AI大模型的研究热点!

引言 在人工智能的浪潮中&#xff0c;大模型研究如日中天&#xff0c;涵盖诸多研究方向&#xff0c;每个方向均承载着独特的研究焦点与挑战。 以下&#xff0c;我们将逐一探讨数个备受瞩目的研究方向&#xff0c;包括检索增强生成RAG、大模型Agent、Mamba、MoE、LoRA等&#…

Linux高并发服务器开发(四)进程间通信

文章目录 1 前言2 无名管道3 有名管道4 管道读写特点5 设置管道为非阻塞6 使用有名管道实现简单版本聊天7 共享存储映射7.1 mmap 存储映射函数7.2 共享映射实现父子进程通信7.3 共享映射实现无亲缘关系进程通信7.4 匿名映射实现父子进程通信 8 信号8.1 概念和特点8.2 信号的编号…

使用 shell 脚本同步 yum 源建立本地私有仓库

文章目录 [toc]事出有因脚本内容前端展示 事出有因 有两方面原因做了这个事情&#xff1a; dockerhub 国内无法访问centos 7 要停止社区支持了 结合两个情况&#xff0c;不久的将来&#xff0c;可能国内也就没有对应的 yum 仓库了&#xff08;现在想找 centos 7 之前的仓库&…

防火墙GRE over IPSec配置

一、基础知识 1、GRE隧道 GRE隧道是一种网络通信协议&#xff0c;使用通用路由封装&#xff08;GRE&#xff09;技术&#xff0c;能够将一种网络协议下的数据报文封装在另一种网络协议中&#xff0c;从而实现在另一个网络层协议中的传输。 GRE隧道的基本概念和工作方式 基本…

CMakeList整理大全

0. CMake应用示例 之前我们也整理过cmake 引入第三方库&#xff08;头文件目录、库目录、库文件&#xff09;。但是这里面整理的内容其实是不全的。所以我们需要进一步将CMake的使用整理好。以供后面的学习的工程师来检索查询。 cmake-template ├── CMakeLists.txt └──…