欢迎来到尧图网

客户服务 关于我们

您的位置:首页 > 教育 > 幼教 > 零基础国产GD32单片机编程入门(十八)华邦W25Q32 SPI FLASH实战含源码

零基础国产GD32单片机编程入门(十八)华邦W25Q32 SPI FLASH实战含源码

2024/10/24 21:21:25 来源:https://blog.csdn.net/zy2232652/article/details/142077475  浏览:    关键词:零基础国产GD32单片机编程入门(十八)华邦W25Q32 SPI FLASH实战含源码

文章目录

    • 一.概要
    • 二.W25Q32 SPI FLASH主要参数
    • 三.W25Q32 SPI FLASH芯片介绍
      • 1.W25Q32 芯片内部框图
      • 2.W25Q32 芯片指令表格
      • 3.W25Q32 芯片通讯时序
    • 四.GD32F103单片机SPI简介
    • 五.W25Q32 SPI FLASH读写实验
    • 六.工程源代码下载
    • 七.小结

一.概要

FLASH是一种存储芯片,通过程序可以修改数据,即平时所说的“闪存”。
FLASH闪存是非易失存储器,可以对称为块的存储器单元块进行擦写和再编程。任何Flash器件的写入操作只能在空或已擦除的单元内进行,所以大多数情况下,在进行写入操作之前必须先执行擦除。
SPI Flash使用SPI接口进行数据传输,采用一种主从模式。主控制器通过发送命令和地址来访问SPI Flash,然后接收或写入数据。SPI Flash在接收到命令后,将相应的数据返回给主控制器。
SPI Flash的读取速度相对较慢,不支持直接执行代码。因此,它更适合用于存储配置数据、固件升级或数据存储等需要大容量存储但不需要频繁读取的应用。
本文对W25Q32 SPI FLASH的原理,指令,通讯时序等进行讲解,并通过GD32F103C8T6单片机对W25Q32 进行数据读写实验。

在这里插入图片描述

二.W25Q32 SPI FLASH主要参数

FLASH芯片型号:W25Q32JVSSIQ
制造商:Winbond
产品种类:SPI NOR FLASH
封装 :SOIC-8
系列:W25Q32JV
存储容量:32 Mbit
最大时钟频率:133 MHz
接口类型:SPI
数据总线宽度:8 bit
电源电压: 2.7~3.6 V
电源电流—最大值: 25 mA
最小工作温度: - 40°C~85°C

模块接口说明:
1.VCC 供电电源 3.3V
2.CS SPI通讯CS引脚
3.DO SPI通讯MISO引脚
4.GND 电源地
5.CLK SPI通讯CLK引脚
6.DI SPI通讯MOSI引脚

在这里插入图片描述

三.W25Q32 SPI FLASH芯片介绍

引脚定义
在这里插入图片描述

在这里插入图片描述

1.W25Q32 芯片内部框图

在这里插入图片描述

如上图所示:
W25Q32的存储单位
Page(页)
256字节,编程最小单位(向FLASH写入内容),一次最多编程256字节。
Sector(扇区)
擦除的最小单位,1个Sector一般包含16个Page,即4KB。
Block(块)
包含16个Sector,块擦除可以32KB(半块)、64KB(整块)两种擦除方式。

2.W25Q32 芯片指令表格

下图是指令表格,每个不同的指令所发的字节数量是不同的,第一个字节发送的都是命令号,比如擦除指令,擦除第0个Sector,SPI所发送的内容是0x20,0x00,0x00,0x00这四个字节。

在这里插入图片描述

3.W25Q32 芯片通讯时序

我们以读数据为例,解析下通讯时序,根据SPI通讯规则,CPOL为0,CPHA为0,MCU提供CLK,跟CS控制。
根据指令表格,读的命令4字节内容,是0x03+3字节地址,就能获取到对应地址的数据内容,数据内容是1字节。
在这里插入图片描述

在这里插入图片描述

四.GD32F103单片机SPI简介

1.简介
SPI/I2S模块可以通过SPI协议或I2S音频协议与外部设备进行通信。
串行外设接口(Serial Peripheral Interface,缩写为SPI)提供了基于SPI协议的数据发送和接收功能,可以工作于主机或从机模式。SPI接口支持具有硬件CRC计算和校验的全双工和单工模式。

2.特点
 具有全双工和单工模式的主从操作;
 16位宽度,独立的发送和接收缓冲区;
 8位或16位数据帧格式;
 低位在前或高位在前的数据位顺序;
 软件和硬件NSS管理;
 硬件CRC计算、发送和校验;
 发送和接收支持DMA模式。

3.结构框图
在这里插入图片描述

4.SPI信号线描述
在这里插入图片描述

5.SPI 时序和数据帧格式
在这里插入图片描述
6.典型的全双工连接方式
在这里插入图片描述

五.W25Q32 SPI FLASH读写实验

硬件准备:

STLINK接GD32F103C8T6开发板,STLINK接电脑USB口。

用6根杜邦线把模块与开发板相连
开发板3.3V <->模块VCC
开发板GND <->模块GND
开发板PA4 <->模块CS
开发板PA6 <->模块DO
开发板PA7 <->模块DI
开发板PA5 <->模块CLK

在这里插入图片描述

主要代码


uint32_t FlashJedecid,FlashDeviceid;//FLASH ID变量
extern void Flash_TestDataInit(void);
extern uint32_t spi_flash_read_id(void);
extern uint16_t SFLASH_ReadID(void);
uint8_t ReadBuff[10],WriteBuff[10]={0x55,0x55,0x55,0x55,0x55,0x55,0x55,0x55,0x55};//读写存储
extern void Flash_ReadSomeBytes(uint8_t *ucpBuffer, uint32_t _ulReadAddr, uint16_t _usNByte);
extern void Flash_WriteSomeBytes(uint8_t *ucpBuffer, uint32_t _ulWriteAddr, uint16_t _usNByte);
extern void Flash_WriteSR(uint8_t _ucByte);
extern uint8_t Flash_ReadSR(void);/*
SPI0配置SCK/PA5, MISO/PA6, MOSI/PA7
*/
void spi_config(void)
{spi_parameter_struct spi_init_struct;/* deinitilize SPI and the parameters */spi_i2s_deinit(SPI0);spi_struct_para_init(&spi_init_struct);/* SPI0 parameter config */spi_init_struct.trans_mode           = SPI_TRANSMODE_FULLDUPLEX;spi_init_struct.device_mode          = SPI_MASTER;spi_init_struct.frame_size           = SPI_FRAMESIZE_8BIT;spi_init_struct.clock_polarity_phase = SPI_CK_PL_LOW_PH_1EDGE;spi_init_struct.nss                  = SPI_NSS_SOFT;spi_init_struct.prescale             = SPI_PSC_128;spi_init_struct.endian               = SPI_ENDIAN_MSB;spi_init(SPI0, &spi_init_struct);spi_enable(SPI0);	}
int main(void)
{rcu_apb1_clock_config(RCU_APB1_CKAHB_DIV1);rcu_apb2_clock_config(RCU_APB2_CKAHB_DIV1);//设置主频108M(#define __SYSTEM_CLOCK_108M_PLL_HXTAL         (uint32_t)(108000000)),8M外部晶振  (#define HXTAL_VALUE    ((uint32_t)8000000))systick_config();//配置1ms SysTickrcu_periph_clock_enable(RCU_GPIOA);//使能GPIOA时钟   rcu_periph_clock_enable(RCU_AF);//AF时钟使能 rcu_periph_clock_enable(RCU_SPI0);//使能SPI0时钟   gpio_init(GPIOA, GPIO_MODE_AF_PP, GPIO_OSPEED_50MHZ, GPIO_PIN_5 | GPIO_PIN_7); /* SPI0 GPIO config:SCK/PA5, MISO/PA6, MOSI/PA7 */gpio_init(GPIOA, GPIO_MODE_IN_FLOATING, GPIO_OSPEED_50MHZ, GPIO_PIN_6);gpio_init(GPIOA, GPIO_MODE_OUT_PP, GPIO_OSPEED_50MHZ, GPIO_PIN_4);//CS脚配成输出spi_config();//SPI初始化FlashJedecid = spi_flash_read_id();//读取JedecidFlashDeviceid=SFLASH_ReadID();//读取Device ID/* USER CODE END 2 */Flash_ReadSomeBytes(ReadBuff,0,8);//从FLASH 0地址读取8字节内容放入ReadBuff数组Flash_WriteSR(0x42);//解除保护delay_1ms(100);Flash_ReadSR();//读状态寄存器Flash_WriteSomeBytes(WriteBuff,0,8);//把WriteBuff数组中的内容写入FLASH 0地址delay_1ms(100);Flash_ReadSomeBytes(ReadBuff,0,8);//从FLASH 0地址读取8字节内容放入ReadBuff数组while(1){}}
#define FLASH_CS_0()			{gpio_bit_write(GPIOA, GPIO_PIN_4,RESET);delay_1ms(10);}
#define FLASH_CS_1() 			{gpio_bit_write(GPIOA, GPIO_PIN_4,SET);delay_1ms(10);}//SPI读取1字节
uint8_t spi_master_send_recv_byte(uint8_t spi_byte)
{		uint8_t ByteSend,ByteRecv;ByteSend=spi_byte;while(RESET == spi_i2s_flag_get(SPI0, SPI_FLAG_TBE));spi_i2s_data_transmit(SPI0,ByteSend);while(RESET == spi_i2s_flag_get(SPI0, SPI_FLAG_RBNE));ByteRecv=spi_i2s_data_receive(SPI0);return ByteRecv;}//SPI读取多字节
void spi_master_recv_some_bytes( uint8_t *pbdata, uint16_t recv_length)
{uint8_t *temp_data = pbdata;while (recv_length--){*temp_data++ = spi_master_send_recv_byte(0xFF);	//发送 0xff 为从设备提供时钟}}//SPI任意地址读取任意字节
void Flash_ReadSomeBytes(uint8_t *ucpBuffer, uint32_t _ulReadAddr, uint16_t _usNByte)
{uint8_t command = FLASH_READ_DATA;uint8_t temp_buff[3] = {0};temp_buff[0] = (uint8_t)(_ulReadAddr >> 16);temp_buff[1] = (uint8_t)(_ulReadAddr >> 8);temp_buff[2] = (uint8_t)(_ulReadAddr >> 0);FLASH_CS_0();spi_master_send_recv_byte(command);spi_master_send_recv_byte(temp_buff[0]);spi_master_send_recv_byte(temp_buff[1]);spi_master_send_recv_byte(temp_buff[2]);spi_master_recv_some_bytes(ucpBuffer, _usNByte);FLASH_CS_1();
}

实验效果:
下载程序,全速运行,可以看到ReadBuff数组8字节内容从FLASH中读出来的内容是0x55,说明写进去读出来没问题。

六.工程源代码下载

通过网盘分享的文件:20.华邦W25Q32 SPI FLASH读写实验.zip
链接: https://pan.baidu.com/s/1JadRbS-SFogUs7xd7_EoNQ 提取码: dih8
如果链接失效,可以联系博主给最新链接
程序下载下来之后解压就行

七.小结

SPI Flash广泛应用于各种产品中,如智能手机、平板电脑、路由器、网络设备、工业控制系统、汽车电子、穿戴设备等。由于其灵活性和可靠性,SPI Flash成为许多嵌入式系统首选的存储解决方案之一。

版权声明:

本网仅为发布的内容提供存储空间,不对发表、转载的内容提供任何形式的保证。凡本网注明“来源:XXX网络”的作品,均转载自其它媒体,著作权归作者所有,商业转载请联系作者获得授权,非商业转载请注明出处。

我们尊重并感谢每一位作者,均已注明文章来源和作者。如因作品内容、版权或其它问题,请及时与我们联系,联系邮箱:809451989@qq.com,投稿邮箱:809451989@qq.com