STM32CubeMx开发之路—13使用SPI读写W25Q64

article/2025/8/22 1:45:22

!!! 本文已同步到码云 - 点击此链接获取最新 - 可进入码云提交修改 !!!


附件

源码已放到码云 ! ! ! ( 请点击文首链接进入仓库 )


运行环境

  • Windows10
  • STM32CubeMX Version 5.2.0
  • Keil5(MDK5) Version 5.28.0.0

简介

本例程主要讲解如何使用硬件IIC读写24C02


STM32CubeMx基本配置

基础配置过程请参考 STM32CubeMx开发之路—配置第一个项目


使用printf功能

重定向printf的过程请参考 STM32CubeMx开发之路—3发送USART数据和printf重定向


CubeMX配置

  • SPI配置

  • 根据原理图可知需要的配置的是SPI2

  • 同时配置CS引脚, 本例CS引脚是PG13

代码修改

  • 查看W25Q64的手册(后面配置时需要用的命令都在里面)

  • 封装功能函数的代码(讲解写在代码里面)
/* W25Q64的指令 */
uint8_t w25x_read_id = 0x90;                    // 读ID
uint8_t m_addr[3]    = {0,0,0};                 // 测试地址0x000000
uint8_t check_addr   = 0x05;                    // 检查线路是否繁忙
uint8_t enable_write = 0x06;                    // 使能了才能改变芯片数据
uint8_t erase_addr   = 0x20;                    // 擦除命令
uint8_t write_addr   = 0x02;                    // 写数据命令
uint8_t read_addr    = 0x03;                    // 读数据命令/* 读ID */
void ReadID(void)
{uint8_t temp_ID[5] = {0,0,0,0,0};                        // 接收缓存HAL_GPIO_WritePin(GPIOG, GPIO_PIN_13, GPIO_PIN_RESET);    // 使能CSHAL_SPI_Transmit(&hspi2, &w25x_read_id, 1, 100);        // 读ID发送指令HAL_SPI_Receive(&hspi2, temp_ID, 5, 100);                // 读取IDHAL_GPIO_WritePin(GPIOG, GPIO_PIN_13, GPIO_PIN_SET);    // 失能CS/* 测试打印 */printf("readID is %x%x\n",temp_ID[3],temp_ID[4]);
}/* 检查是否繁忙 */
void CheckBusy(void)
{uint8_t status=1;uint32_t timeCount=0;do{timeCount++;if(timeCount > 0xEFFFFFFF) //等待超时{return ;}HAL_GPIO_WritePin(GPIOG, GPIO_PIN_13, GPIO_PIN_RESET);    // 使能CSHAL_SPI_Transmit(&hspi2, &check_addr, 1, 100);            // 发送指令HAL_SPI_Receive(&hspi2, &status, 1, 100);                // 读取HAL_GPIO_WritePin(GPIOG, GPIO_PIN_13, GPIO_PIN_SET);    // 失能CS}while((status&0x01)==0x01);
}/* 写入数据 */
void ReadData(void)
{uint8_t temp_wdata[5] = {0x99,0x88,0x77,0x66,0x55};        // 需要写入的数据/* 检查是否繁忙 */CheckBusy();/* 写使能 */HAL_GPIO_WritePin(GPIOG, GPIO_PIN_13, GPIO_PIN_RESET);    // 使能CSHAL_SPI_Transmit(&hspi2, &enable_write, 1, 100);        // 发送指令HAL_GPIO_WritePin(GPIOG, GPIO_PIN_13, GPIO_PIN_SET);    // 失能CS/* 擦除 */HAL_GPIO_WritePin(GPIOG, GPIO_PIN_13, GPIO_PIN_RESET);    // 使能CSHAL_SPI_Transmit(&hspi2, &erase_addr, 1, 100);            // 发送指令HAL_SPI_Transmit(&hspi2, m_addr, 3, 100);                // 发送地址HAL_GPIO_WritePin(GPIOG, GPIO_PIN_13, GPIO_PIN_SET);    // 失能CS/* 再次检查是否繁忙 */CheckBusy();/* 写使能 */HAL_GPIO_WritePin(GPIOG, GPIO_PIN_13, GPIO_PIN_RESET);    // 使能CSHAL_SPI_Transmit(&hspi2, &enable_write, 1, 100);        // 发送指令HAL_GPIO_WritePin(GPIOG, GPIO_PIN_13, GPIO_PIN_SET);    // 失能CS/* 写数据 */HAL_GPIO_WritePin(GPIOG, GPIO_PIN_13, GPIO_PIN_RESET);    // 使能CSHAL_SPI_Transmit(&hspi2, &write_addr, 1, 100);            // 发送指令HAL_SPI_Transmit(&hspi2, m_addr, 3, 100);                // 地址HAL_SPI_Transmit(&hspi2, temp_wdata, 5, 100);            // 写入数据HAL_GPIO_WritePin(GPIOG, GPIO_PIN_13, GPIO_PIN_SET);    // 失能CS
}/* 读取数据 */
void WriteData(void)
{uint8_t temp_rdata[5] = {0,0,0,0,0};                    // 读出数据保存的buff/* 检查是否繁忙 */CheckBusy();/* 开始读数据 */HAL_GPIO_WritePin(GPIOG, GPIO_PIN_13, GPIO_PIN_RESET);    // 使能CSHAL_SPI_Transmit(&hspi2, &read_addr, 1, 100);            // 读发送指令HAL_SPI_Transmit(&hspi2, m_addr, 3, 100);                // 地址HAL_SPI_Receive(&hspi2, temp_rdata, 5, 100);            // 拿到数据HAL_GPIO_WritePin(GPIOG, GPIO_PIN_13, GPIO_PIN_SET);    // 失能CS/* 测试打印 */printf("Read flash data is:%x %x %x %x %x\n",temp_rdata[0],temp_rdata[1],temp_rdata[2],temp_rdata[3],temp_rdata[4]);
}
  • main函数
int main(void)
{/* USER CODE BEGIN 1 *//* USER CODE END 1 *//* MCU Configuration--------------------------------------------------------*//* Reset of all peripherals, Initializes the Flash interface and the Systick. */HAL_Init();/* USER CODE BEGIN Init *//* USER CODE END Init *//* Configure the system clock */SystemClock_Config();/* USER CODE BEGIN SysInit *//* USER CODE END SysInit *//* Initialize all configured peripherals */MX_GPIO_Init();MX_SPI2_Init();MX_USART1_UART_Init();/* USER CODE BEGIN 2 *//* USER CODE END 2 *//* Infinite loop *//* USER CODE BEGIN WHILE */ReadID();WriteData();ReadData();while (1){/* USER CODE END WHILE *//* USER CODE BEGIN 3 */}/* USER CODE END 3 */
}

运行结果

  • 烧录进去,用串口调试助手
  • 发现输出的就是我们存进的数据,说明测试成功

小结

SPI在实际应用过程非常广泛,而且速度也是比较快的,也是嵌入式需了解的协议之一,所以一定要好好理解!


备注



http://chatgpt.dhexx.cn/article/hE8ahTNw.shtml

相关文章

STM32CubeMX系列08——SPI通信(W25Q64、NRF24L01无线模块)

文章目录 1. 准备工作1.1. 所用硬件1.2. SPI 简介1.3. 生成工程1.3.1. 创建工程选择主控1.3.2. 系统配置1.3.3. 配置工程目录 2. 读写EEPROM实验(W25Q64)2.1. W25Q64 简介2.2. 代码实现 3. NRF24L01无线模块通信3.1. 模块简介3.2. SPI 配置3.2.1. SPI1 配…

STM32驱动W25Q64读写数据

STM32驱动W25Q64读写数据 一.基本参数二.通信协议1、时序:2、代码: 三.引脚定义与接线1、引脚定义2、对应接线 四.主要代码五.操作步骤与现象六.总结 一.基本参数 1.采用…

学习日记——W25Q64 FLASH—QSPI

W25Q64串行FLASH基础知识 大小:8M(Byte)(128块(Block),每块64K字节,每块16个扇区(Sector),每个扇区4K字 节,每个扇区16页&#xff0c…

(STM32)W25Q64存储模块

1bit表示一个二进制位,1Byte表示8个二进制位。 每一个字节需要一个地址,所以24位地址,2^24次方最大寻址范围是16M。 W25Q256是特殊型号,切换4字节寻址模式才能使用后面的16M空间。 HOLD:芯片正常读写数据时&#xff…

SPIW25Q64(精华版)

1. SPI总线 1.1 W25Q64 1.1 W25Q64简介 W25Q64 是一种具有SPI接口的FlASH存储器,具有32768个可编程页(Page256B),2048个可擦除扇区(Sector16*Page),128个可擦除块(Block16*Sector),容量为128*16*16*256B8MB(64bit),…

W25Q64简介(译)

W25Q64是华邦公司推出的大容量SPI FLASH产品,其容量为64Mb。该25Q系列的器件在灵活性和性能方面远远超过普通的串行闪存器件。W25Q64将8M字节的容量分为128个块,每个块大小为64K字节,每个块又分为16个扇区,每个扇区4K个字节。W25Q…

W25Q64Flash芯片

W25Q64Flash芯片STM32操作 通讯方式:SPI通讯 大小:64是bit 换算字节是8M(Byte)(128块(Block),每块16个扇区(Sector),每个扇区4K字节(…

SPI通讯介绍 以及读写W25Q64(块,扇区,页的区别)

附工程百度网盘链接 链接:https://pan.baidu.com/s/1nCgNb5OyGpABAL657-gX0A?pwd6666 提取码:6666 介绍:摩托罗拉开发的一种通用数据总线, 四根通讯线SCK(串行时钟总线),MOSI(主机输出从机输入),MISO(主机输入从机输出),SS(从机选择)而且是同步全双…

W25Q64调试

简介 W25Q系列的器件在灵活性和性能方面远远超过普通的串行闪存器件。W25Q64将8M字节的容量分为128个块,每个块大小为64K字节,每个块又分为16个扇区,每个扇区4K个字节。 引脚介绍 串行数据输入、输出和 IOs(DI、DO 和 IO0、IO1、…

软件SPI读写W25Q64硬件SPI读写W25Q64

目录 软件SPI读写W25Q64 MySPI W25Q64 主函数 硬件SPI读写W25Q64 软件SPI读写W25Q64 程序整体框架: SPI模块包含通信引脚封装,初始化,SPI三个基本时序单元(起始,终止,交换一个字节) W2…

W25Q64Flash芯片STM32操作

1、W25Q64Flash芯片介绍 通讯方式:SPI通讯 大小:8M(Byte) (128块(Block),每块64K字节,每块16个扇区(Sector),每个扇区4K字节&…

STM32学习笔记(十一)丨SPI通信(W25Q64芯片简介,使用SPI读写W25Q64存储器芯片)

本篇文章包含的内容 一、SPI的通信协议及其原理1.1 SPI简介1.2 SPI通信的硬件连接1.3 SPI的时序基本单元1.3.1 起始条件和终止条件1.3.2 交换字节(模式0,先移入,再移出)1.3.3 交换字节(模式1,先移出&#x…

看单片机原理图-外部FLASHW25Q64

系列文章目录 看单片机原理图-最小系统 看单片机原理图-最小系统电源电路 看单片机原理图-输入输出电路LED指示、按键输入 看单片机原理图-红外遥控、EEPROM 看单片机原理图-FLASH 文章目录 系列文章目录前言一、FLASH 前言 硬件:百问网100ASK_STM32F103_MINI开发…

W25Q64 Flash芯片原理与应用方案(含W25Q64中文数据手册)

W25Q64是华邦公司推出的大容量SPI FLASH产品,其容量为64Mb(8MB),应用较为广泛。 W25Q系列的器件在灵活性和性能方面远远超过普通的串行闪存器件。W25Q64将8M字节的容量分为128个块,每个块大小为64K字节,每个…

cortex_m3_stm32嵌入式学习笔记(二十一):SPI实验(通信总线)

SPI 是英语 Serial Peripheral interface 的缩写,顾名思义就是串行外围设备接口。是 Motorola首先在其 MC68HCXX 系列处理器上定义的。 SPI 接口主要应用在 EEPROM, FLASH,实时时钟, AD 转换器,还有数字信号处理器和数…

STM-32:SPI通信协议/W25Q64简介—软件SPI读写W25Q64

目录 一、SPI简介1.1电路模式1.2通信原理1.3SPI时序基本单元1.3.1起始和终止1.3.2交换字节 二、W25Q642.1W25Q64简介2.2W25Q64硬件电路2.3W25Q64框图2.4Flash操作注意事项 三、软件SPI读写W25Q643.1接线图3.2程序代码 一、SPI简介 SPI是串行外设接口(Serial Periph…

STM32CubeMx之硬件SPI驱动W25Q64

STM32CubeMx之硬件SPI驱动W25Q64 1.SPI简介 SPI是串行外设接口(Serial Peripheral Interface)的缩写,是一种高速的,全双工,同步的通信总线,并且在芯片的管脚上只占用四根线,节约了芯片的管脚&a…

SPI读写串行FLASH(W25Q64)

文章目录 1、SPI协议1、硬件连接2、通讯时序3、不同的通信模式 2、W25Q64介绍3、SPI读写驱动编写4、源码 1、SPI协议 SPI 协议是由摩托罗拉公司提出的通讯协议(Serial Peripheral Interface),即串行外围设备接口,是一种高速全双工的通信总线。它被广泛地…

STM32入门开发: 介绍SPI总线、读写W25Q64(FLASH)(硬件+模拟时序)

一、环境介绍 编程软件: keil5 操作系统: win10 MCU型号: STM32F103ZET6 STM32编程方式: 寄存器开发 (方便程序移植到其他单片机) SPI总线: STM32本身支持SPI硬件时序,本文示例代码里同时采用模拟时序和硬件时序两种方式读写W25Q64。 模拟时序更加方便移植到…

树莓派系统介绍

树莓派是一个微型计算机,和普通的电脑没有什么区别,只是体积更小,只有卡片大小,存储能力和计算能力会差一点,主要用于学习,实验所用。 是电脑就要安装操作系统,树莓派官方推荐了两种系统&#…