你的浏览器版本过低,可能导致网站不能正常访问!
为了你能正常使用网站功能,请使用这些浏览器。

STM32F103标准库开发---SPI实验---W25Qxx系列外部Flash芯片

[复制链接]
STMCU小助手 发布时间:2022-9-6 22:09
一、W25Qxx系列芯片----简介
W25Qxx 系列 Flash 存储器可以为用户提供存储解决方案。擦写周期多达10W次,可将数据保存达20年之久,支持2.7~3.6V的电压,支持标准的SPI,还支持双输出/四输出的SPI,最大SPI时钟可达80Mhz。
W25Qxx 系列 Flash 存储器是为系统提供一个最小空间、最少引脚,最低功耗的串行Flash存储器,比普通的串行Flash存储器更灵活,性能更优越。
功耗低,正常工作状态下电流消耗0.5mA,掉电状态下电流消耗1uA。

1. 存储结构
W25Qxx 系列 Flash 存储器的存储结构
相同点:

1块 = 16扇区 = 64k字节,1扇区 = 16页 = 4k字节,1页 = 256字节。
只有三种擦除方式:扇区擦除 、 块擦除 和 全片擦除。
写操作一次可以写1~256字节,最多一次写一页256字节。
不同点: 容量和内存空间地址不同,具体如下表所示:

WVI1][T3@T_GHJ}Y0MIM@]D.png

2. 引脚接口
下面只介绍标准SPI接口,接口如下图所示:

747dfbc65d6a47bb94c2294f59f2484b.png

片选引脚:/CS
(1)当CS引脚为高电平时,芯片被禁能,DO引脚高阻态,不能进行读写操作。
(2)当CS引脚为低电平时,芯片被使能,能进行读写操作。
   上电后,执行一条新指令之前必须使CS引脚先有一个下降沿。

数据输出引脚:DO(IO1)
标准SPI模式: CLK上升沿捕获地址和命令,下降沿输出数据。
QSPI模式: 双向数据传输 IO1。

写保护引脚:/WP(IO2)
标准SPI模式:
写保护引脚可以被用来保护状态寄存器不被意外改写。
(1)当WP引脚为高电平时,芯片写保护失能,可以正常写入数据。
(2)当WP引脚为低电平时,芯片写保护使能,不可以正常写入数据。
QSPI模式: 双向数据传输 IO2。

地:GND
电源地

数据输入引脚:DI(IO0)
标准SPI模式:
数据、地址和命令从DI引脚送到芯片内部,在CLK引脚的上升沿捕获。
QSPI模式: 双向数据传输 IO0。

串行时钟引脚:CLK
SPI时钟引脚,为输入输出提供时序。

保持引脚:/HOLD(IO3)
标准SPI模式:
当CS引脚为低电平时
(1)当HOLD为低电平时,DO引脚处于高阻态状态,而且也会忽略DIO和CLK引脚上的信号。
(2)当HOLD为高电平时,芯片恢复正常工作。
QSPI模式: 双向数据传输 IO3。

电源:VCC
电源正极

3. 原理图

12f552454aa64e35b285542f7500306d.png

4. 内部结构框架图

cb09b34bf18d410596ed4466e685059d.png

5. 型号ID

W25Qxx 系列 Flash 存储器支持 JEDEC 标准,具有唯一的 64 位识别序列号,方便区别芯片型号,具体如下表所示:
(@K3TTZBLL~]80ZD30Q4]64.png


二、W25Qxx系列芯片----工作原理
1. SPI 运行方式

W25Qxx系列芯片支持以下两种SPI通信方式:
模式0: CPOL = 0,CPHA = 0
模式3: CPOL = 1,CPHA = 1

2. W25Qxx系列芯片----状态寄存器
注:这里是记录所有W25Qxx系列芯片的状态寄存器,有些型号的状态寄存器,没有全部功能。

状态寄存器1

%C~@RNU[)_}Z@L2)QZFA5.png

S0----总线忙标志位(BUSY)
在执行页编程、扇区擦除、块区擦除、芯片擦除以及写状态寄存器指令时,该位被硬件自动置1。这时候,除了读状态寄存器指令外的所有操作指令都会被芯片忽略。
当芯片执行完这些指令后,硬件会自动将该位清0,表示芯片器件可以接收其他的指令。

S1----写保护位(WEL)
执行完写使能指令后,该位置1
当芯片掉电后和执行写禁能、页编程、扇区擦除、块区擦除以及芯片擦除指令都会进入写保护状态,该位置0

S2、S3、S4----块区保护位(BP2、BP1、BP0)
这3个位默认状态为0,即块区处于未保护状态。可以利用“写状态寄存器”指令对这几个位进行置1来达到块区保护的目的。块区保护状态为:没有保护、部分保护和全部保护状态。
当状态寄存器的SRP位为1或读写保护管脚(/WP)为低电平时,这3个位不可被更改。

S5----底部和顶部块保护位(TB)
此位默认值为0,可以利用“写状态寄存器”指令对这个位进行置1或清零。
当TB = 0时,表示保护位从顶部开始;
当TB = 1时,表示保护位从底部开始。
当状态寄存器的SRP位为1或读写保护管脚(/WP)为低电平时,这个位不可被更改。

S6----扇区/块保护(SEC)
此位默认值为0,可以利用“写状态寄存器”指令对这个位进行置1或清零。
当SEC = 0时,表示每次保护的区域大小为4K;
当SEC = 1时,表示每次保护的区域大小为64K。

状态寄存器2


EBU]91I719ZNX5J~SI480EO.png

S7、S8----状态寄存器保护位(SRP、SRL)
这两个位的默认值为0,可以利用“写状态寄存器”指令对这个位进行置1或清零。
这两位和读写保护管脚(/WP)决定了状态寄存器写保护的方式。
状态寄存器写保护的方式有:软件保护,硬件保护、电源锁定或一次性可编程(OTP)保护。

S9----快速SPI通讯使能(QE)
此位默认值为0,可以利用“写状态寄存器”指令对这个位进行置1或清零。
当QE = 0时,设置为标准速度模式或快速模式,保持管脚(/HOLE)和读写保护管脚(/WP)启用;
当QE = 1时,设置为高速模式,保持管脚(/HOLE)和读写保护管脚(/WP)被设置为IO2和IO3功能使用。

S10、S11、S12、S13----安全寄存器锁位(LB3、LB2、LB1)
LB3-1的默认状态为0,安全寄存器被解锁。
可以使用写状态寄存器指令将LB3-1单独设置为1。
LB3-1是一次性可编程(OTP),一旦它设置为1,相应的256字节安全寄存器将成为永久只读。

S14----补码保护位(CMP)
它与SEC、TB、BP2、BP1和BP0位结合使用,为阵列保护提供更大的灵活性。
一旦CMP设置为1,之前SEC、TB、BP2、BP1和BP0设置的阵列保护将被逆转。例如:
当CMP=0时,一个最高64KB的块可以被保护,而数组的其他部分则不受保护;
当CMP=1时,最上面的64KB块将成为不受保护的,而数组的其余部分将成为只读的。
默认设置为CMP=0。

S15----暂停状态位(SUS)
在执行**擦除/程序暂停(75h)指令后设置为1。
通过擦除/程序恢复 (7Ah)**指令以及下电、上电周期将SUS状态位清除为0。

状态寄存器3

M7KOQ]@Q2E8YTH}`W]0NL2D.png

S16----当前地址模式(ADS)
表示设备当前运行的地址模式。
当ADS=0时,设备处于3字节地址模式,
当ADS=1时,设备处于4字节地址模式。

S17----启动时地址模式(ADP)
决定设备上电或复位时的初始地址模式,该位仅在上电或设备复位初始化期间使用。
当ADP=0(出厂默认)时,设备将启动到3字节地址模式,扩展地址寄存器必须用于访问超过128Mb的内存区域。当ADP=1时,设备将直接启动到4字节地址模式。

S18----写保护方案(WPS)
当WPS=0时,设备将使用CMP、SEC、TB、BP[2:0]位的组合来保护存储阵列的特定区域。
当WPS=1时,设备将使用单独块锁来保护任何单独的扇区或块。
设备上电或复位后,所有单个块锁定位的缺省值为1。

S22、S21 ---- 输出信号强度(DRV1、DRV0)

bc43c9f8441f4eacac4548a5609f8e13.png

S23----HOLD/RST引脚功能选择
当HOLD/RST=0(出厂设置)时,引脚为/HOLD。
当HOLD/RST=1时,引脚为/RESET。
但是,只有当QE=0时,/HOLD或/RESET函数才可用。
QE设置为1时,关闭/HOLD和/RESET功能,引脚为专用数据I/O引脚。

3. W25Qxx系列芯片----常用操作命令
(1)单字节操作
单字节操作,只往芯片中写入1字节的操作命令,具体代码如下:

  1. void W25QXX_Write_Enable(void) //写使能
  2. {
  3.         W25QXX_CS(0);                                 //拉低片选CS引脚---使能芯片
  4.         W25QXX_ReadWriteByte(0x06);  //写入1字节操作命令
  5.         W25QXX_CS(1);                                 //拉高片选CS引脚---关闭芯片        
  6. }
复制代码

操作命令 如下表所示:

B6K5[CC`CZQXLZSW{%%7QV2.png
2XEKHJE0%]M3RGR3Q7]QZZ2.png

注:如果想要实现其他功能,替换操作指令数据,便可实现功能。

(2)双字节操作
双字节操作,先往芯片中写入1字节的操作命令,接下来是读取/写入的字节数据。
具体代码如下:

  1. //读取1字节数据
  2. uint8_t W25QXX_ReadSR(void)//读取状态寄存器
  3. {
  4.         uint8_t  data=0;
  5.         W25QXX_CS(0);                             //拉低片选CS引脚---使能芯片
  6.         W25QXX_ReadWriteByte(0x05);           //写入1字节操作命令
  7.         data=W25QXX_ReadWriteByte(0Xff); //读取1字节数据
  8.         W25QXX_CS(1);                    //拉高片选CS引脚---取消片选
  9.         return data;
  10. }

  11. //写入1字节数据
  12. void W25QXX_WriteSR(uint8_t data)//写状态寄存器
  13. {
  14.         W25QXX_CS(0);                    //拉低片选CS引脚---使能芯片
  15.         W25QXX_ReadWriteByte(0x01); //写入1字节操作命令
  16.         W25QXX_ReadWriteByte(data); //写入1字节数据
  17.         W25QXX_CS(1);               //拉高片选CS引脚---取消片选
  18. }
复制代码

操作命令 如下表所示:

M}40KHB2X}]JGPY1`RVOZGC.png

注:如果想要实现其他功能,替换操作指令数据,便可实现功能。

(3)读取ID操作
具体代码如下:

  1. uint16_t W25QXX_ReadID(void)//读取芯片ID
  2. {
  3.         uint16_t ID = 0;         
  4.         W25QXX_CS(0);                                //拉低片选CS引脚---使能芯片   
  5.         W25QXX_ReadWriteByte(0x90);        //发送读取ID命令            
  6.         W25QXX_ReadWriteByte(0x00);            
  7.         W25QXX_ReadWriteByte(0x00);            
  8.         W25QXX_ReadWriteByte(0x00);                                    
  9.         ID|=W25QXX_ReadWriteByte(0xFF)<<8;  
  10.         ID|=W25QXX_ReadWriteByte(0xFF);         
  11.         W25QXX_CS(1);                                 //拉高片选CS引脚---取消片选   
  12.         return ID;
  13. }
复制代码

操作命令 如下表所示:



指令名称        指令数据(hex)        字节1        字节2        字节3        字节4        字节5        功能
Device ID        0xAB        0x00        0x00        0x00        (ID7-ID0)                读取设备ID
Manufacturer/Device ID        0x90        0x00        0x00        0x00        (MF7-MF0)        (ID7-ID0)        读取制造商+设备ID
JEDEC ID        0x9F        (MF7-MF0)        (ID15-ID8)        (ID7-ID0)                        读取全部ID
Read Unique ID        0x4B        0x00        0x00        0x00        0x00        (UID63-0)        读取唯一ID号
注:如果想要实现其他功能,替换操作指令数据,便可实现功能。

(4)带地址操作
带地址操作主要分两种:
3字节地址:W25Qxx系列芯片都可以使用。
4字节地址:只有W25Q256和W25Q512可用。

3字节地址
具体代码如下:
  1. //读取数据
  2. void W25QXX_Read(uint8_t* pBuffer,uint32_t ReadAddr,uint16_t NumByteToRead)   
  3. {                                                     
  4.         W25QXX_CS(0);                                //拉低片选CS引脚---使能芯片
  5.     W25QXX_ReadWriteByte(0x03);                            //发送读取命令  
  6.     W25QXX_ReadWriteByte((uint8_t)((ReadAddr)>>16));   //发送24bit地址   
  7.     W25QXX_ReadWriteByte((uint8_t)((ReadAddr)>>8));   
  8.     W25QXX_ReadWriteByte((uint8_t)ReadAddr);   
  9.     for(uint16_t i=0;i<NumByteToRead;i++)//可读多个数据
  10.         {
  11.        pBuffer<i>=W25QXX_ReadWriteByte(0XFF);    //循环读数  
  12.     }
  13.         W25QXX_CS(1);                                                  
  14. }  

  15. //写入数据
  16. void W25QXX_Write_Page(uint8_t* pBuffer,uint32_t WriteAddr,uint16_t NumByteToWrite)
  17. {
  18.     W25QXX_Write_Enable();                          //写使能
  19.         W25QXX_CS(0);                                    //使能器件   
  20.     W25QXX_ReadWriteByte(0x02);   //发送页写命令   
  21.     W25QXX_ReadWriteByte((uint8_t)((WriteAddr)>>16)); //发送24bit地址   
  22.     W25QXX_ReadWriteByte((uint8_t)((WriteAddr)>>8));   
  23.     W25QXX_ReadWriteByte((uint8_t)WriteAddr);   
  24.     for(uint16_t i=0;i<NumByteToWrite;i++)//可写多个数据,最多256个字节一页数据
  25.         {
  26.                 W25QXX_ReadWriteByte(pBuffer<i>);//循环写数  
  27.         }
  28.         W25QXX_CS(1);                                    //取消片选
  29.         W25QXX_Wait_Busy();                                                           //等待写入结束
  30. } </i></i>
复制代码

操作命令 如下表所示:
BM1@R5XOY96ST0QZ(X)BI0Y.png
T%UQ7@4])){RN9[CCYV_D8Y.png

4字节地址
具体代码如下:
  1. //启用4字节地址模式        
  2. void W25QXX_Enter_4Byte()
  3. {
  4.         W25QXX_CS(0);                                 //拉低片选CS引脚---使能芯片
  5.         W25QXX_ReadWriteByte(0xB7);  //写入1字节操作命令
  6.         W25QXX_CS(1);                                 //拉高片选CS引脚---关闭芯片
  7. }

  8. //退出4字节地址模式        
  9. void W25QXX_Exit_4Byte()
  10. {
  11.         W25QXX_CS(0);                                 //拉低片选CS引脚---使能芯片
  12.         W25QXX_ReadWriteByte(0xE9);  //写入1字节操作命令
  13.         W25QXX_CS(1);                                 //拉高片选CS引脚---关闭芯片
  14. }

  15. //读取数据
  16. void W25QXX_Read(uint8_t* pBuffer,uint32_t ReadAddr,uint16_t NumByteToRead)   
  17. {                                                     
  18.         W25QXX_CS(0);                                //拉低片选CS引脚---使能芯片
  19.     W25QXX_ReadWriteByte(0x13);                            //发送4字节地址读取命令  
  20.     W25QXX_ReadWriteByte((uint8_t)((WriteAddr)>>24));//发送32bit地址
  21.     W25QXX_ReadWriteByte((uint8_t)((ReadAddr)>>16));     
  22.     W25QXX_ReadWriteByte((uint8_t)((ReadAddr)>>8));   
  23.     W25QXX_ReadWriteByte((uint8_t)ReadAddr);   
  24.     for(uint16_t i=0;i<NumByteToRead;i++)//可读多个数据
  25.         {
  26.        pBuffer=W25QXX_ReadWriteByte(0XFF);    //循环读数  
  27.     }
  28.         W25QXX_CS(1);                                                  
  29. }  

  30. //写入数据
  31. void W25QXX_Write_Page(uint8_t* pBuffer,uint32_t WriteAddr,uint16_t NumByteToWrite)
  32. {
  33.     W25QXX_Write_Enable();                  //写使能
  34.         W25QXX_CS(0);                            //使能器件   
  35.     W25QXX_ReadWriteByte(0x12);                           //发送4字节地址页写命令   
  36.     W25QXX_ReadWriteByte((uint8_t)((WriteAddr)>>24));//发送32bit地址
  37.     W25QXX_ReadWriteByte((uint8_t)((WriteAddr)>>16));   
  38.     W25QXX_ReadWriteByte((uint8_t)((WriteAddr)>>8));   
  39.     W25QXX_ReadWriteByte((uint8_t)WriteAddr);   
  40.     for(uint16_t i=0;i<NumByteToWrite;i++)//可写多个数据,最多256个字节一页数据
  41.         {
  42.                 W25QXX_ReadWriteByte(pBuffer);//循环写数  
  43.         }
  44.         W25QXX_CS(1);                                    //取消片选
  45.         W25QXX_Wait_Busy();                                                           //等待写入结束
  46. }
复制代码

注:如果想要实现4字节地址,需要启用4字节地址模式。

操作命令 如下表所示:



————————————————
版权声明:根号五



6(AG%P$K@2WYM7L28}Z~2YC.png
28aa85ae89f54d22a0ac7f859f06dffb.png
0429d107819242b99ac4b1572581e79f.png
440efd4c84a849299dc4a781b30b43e4.png
d2e3010e09354c1a831211d35a40522f.png
收藏 评论0 发布时间:2022-9-6 22:09

举报

0个回答

所属标签

相似分享

官网相关资源

关于
我们是谁
投资者关系
意法半导体可持续发展举措
创新与技术
意法半导体官网
联系我们
联系ST分支机构
寻找销售人员和分销渠道
社区
媒体中心
活动与培训
隐私策略
隐私策略
Cookies管理
行使您的权利
官方最新发布
STM32N6 AI生态系统
STM32MCU,MPU高性能GUI
ST ACEPACK电源模块
意法半导体生物传感器
STM32Cube扩展软件包
关注我们
st-img 微信公众号
st-img 手机版