一.概要

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

在这里插入图片描述

四.STM32G474RET6驱动W25Q32 SPI FLASH读写实验

1. 硬件准备

STLINK接STM32G474RET6开发板,STLINK接电脑USB口,用6根杜邦线把开发板3.3V 与模块VCC,开发板GND与模块GND,开发板PA4 与模块CS, 开发板PA6 与模块DO,开发板PA7与模块DI,开发板PA5与模块CLK相连。
在这里插入图片描述

2.创建CubeMX工程

如下图所示,打开STM32CubeMX软件,新建工程。
在这里插入图片描述
如下图所示,Part Number处输入STM32G474RE,再双击就创建新的工程。
在这里插入图片描述

如下图所示,配置下载口引脚,PA13为SWD的SWDIO脚,PA14为SWD的SWCLK脚。
在这里插入图片描述

如下图所示,配置SPI1,PA5,PA6,PA7为SPI引脚,速度2.6MHZ左右,CS片选采用PA4引脚软件方式。
在这里插入图片描述

如下图所示,PA4配置成输出。
在这里插入图片描述

如下图所示,配置系统主频170Mhz,使用外部8MHZ晶振。
在这里插入图片描述

配置工程文件名,保存路径,KEIL5工程输出方式,生成工程。
在这里插入图片描述
在这里插入图片描述

如下图所示,增加FLASH驱动代码,向FLASH的0地址写入数据0x55,再从FLASH的0地址读取数据。
在这里插入图片描述
如下图所示,FLASH的数据读写驱动,采用SPI硬件驱动代码。
在这里插入图片描述

主要代码如下

uint32_t FlashJedecid,FlashDeviceid;//存储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);
/* USER CODE END PFP */

/* Private user code ---------------------------------------------------------*/
/* USER CODE BEGIN 0 */

/* USER CODE END 0 */

/**
  * @brief  The application entry point.
  * @retval int
  */
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();//8M外部晶振,170MHZ系统主频
  /* USER CODE BEGIN SysInit */
  /* USER CODE END SysInit */
  /* Initialize all configured peripherals */
  MX_GPIO_Init();//PA4配置成输出
  MX_SPI1_Init();//SPI1配置,PA5:SPI1_SCK,PA6:SPI1_MISO,PA7:SPI1_MOSI
  /* USER CODE BEGIN 2 */
	FlashJedecid = spi_flash_read_id();//读取Jedecid
	FlashDeviceid=SFLASH_ReadID();//读取Device ID
  /* USER CODE END 2 */
	Flash_ReadSomeBytes(ReadBuff,0,8);//从FLASH 0地址读取8字节内容放入ReadBuff数组
	Flash_WriteSR(0x42);//解除保护
	HAL_Delay(100);
	Flash_ReadSR();//读状态寄存器
	Flash_WriteSomeBytes(WriteBuff,0,8);//把WriteBuff数组中的内容写入FLASH 0地址
	HAL_Delay(100);
	Flash_ReadSomeBytes(ReadBuff,0,8);//从FLASH 0地址读取8字节内容放入ReadBuff数组
  /* USER CODE END 2 */
  /* Infinite loop */
  /* USER CODE BEGIN WHILE */
  while (1)
  {
    /* USER CODE END WHILE */
    /* USER CODE BEGIN 3 */
  }
  /* USER CODE END 3 */
}

3.实验结果

在Keil5环境下全速运行,查看程序ReadBuff数组8字节内容,从FLASH中读出来的内容是0x55,说明FLASH读写没问题。

五.小结

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

Logo

智能硬件社区聚焦AI智能硬件技术生态,汇聚嵌入式AI、物联网硬件开发者,打造交流分享平台,同步全国赛事资讯、开展 OPC 核心人才招募,助力技术落地与开发者成长。

更多推荐