SST25F080B是美国微芯科技推出的一款8Mbit SPI串行FLASH,今天我们来简单了解下如何用STM32单片机进行FLASH的读写操作。首先我们打开STM32CubeMX软件进行SPI的硬件基本配置:
SPI工作方式我们配置为全双工主模式:
基本参数配置保持默认即可:
然后生成代码即可,这里不在过多的赘述关于STM32CubeMX的配置部分,有需要的可以参考我的其他文章。
这里需要注意的是:时钟极性CPOL和时钟相位CPHA这两个参数需要根据FLASH数据手册的SPI协议来配置,根据SST25VF080B芯片数据手册得知,该芯片工作于模式0或者模式3,我们这里配置为CPOL:0,CPHA:0,
在写驱动程序之前,我们首先了解下该FLASH芯片的区块页概念:对于该芯片来说总共是8Mbit,也就是1Mbyte,众所周知FLASH闪存是由区块页组成的,但是这些区块页之间的换算关系很多人却搞不明白,我在这里给出计算公式,就拿我们这个芯片SST25VF080B举例说下,简单直观:
对于我们这个FLASH芯片来说:总共是8Mbit,大家都知道1byte=8bit,1K=1024byte,1page=256byte,1sector=4Kbyte,1block=64Kbyte,故我们的芯片SST25VF080B:
总位数bit:8Mbit = 8*1024*1024 = 8388608bit
总字节数byte:8388608bit/8=1048576byte=1M字节
总页数page:1048576byte/256=4096页
总扇区sector:4096page/4=1024扇区
总块block:1024sector/64=16块
所以,对我们这个芯片来说::总共有16个块(64Kbyte*16),每块又有16个扇区(4Kbyte*16),每个扇区又有16页(256byte*16).
SST25VF080B的基本指令表:
根据该表我们在SST25VFxx.h文件中我们做如下定义:
#include "main.h"
#define SST25VF_CSL HAL_GPIO_WritePin(SPI2_CE_GPIO_Port,SPI2_CE_Pin,GPIO_PIN_RESET); /*配置spi-cs引脚*/
#define SST25VF_CSH HAL_GPIO_WritePin(SPI2_CE_GPIO_Port,SPI2_CE_Pin,GPIO_PIN_SET);
//SST25VF指令表
#define SST25VF_WrStrEnable 0x50 //写状态使能
#define SST25VF_WriteEnable 0x06 //写使能
#define SST25VF_WriteDisable 0x04 //写禁止
#define SST25VF_ReadStatusReg 0x05 //读状态寄存器
#define SST25VF_WriteStatusReg 0x01 //写状态寄存器
#define SST25VF_ReadData