1421 字
7 分钟
W25Q16 Flash 存储芯片
2022-08-23
无标签

前言#

MCU:STC8G1K08-16Pin (DIP-16)

Flash 存储芯片:W25Q16BVAIG

便宜,W25Q16 不包邮只需要 ¥1.38。

推荐一个网站:alldatasheetcn


主流 Flash 存储芯片1#

名称特点常用案例
IIC EEPROM容量小,I2C 协议AT24C02 (2K ~ 64K bits)
FM24C02
CAT24C02
SPI NorFlash容量略大,SPI 协议
扇区或整片擦写
S25FL128
MX25L1605
W25Q64 (8M ~ 512M bits)
SPI NandFlash与 SPI NorFlash 一致
擦写寿命长,擦写速度快
eMMC Flash标准 MMC 接口
等效于 NandFlash + 主控IC
KLMAG8DEDD
THGBMAG8B4JBAIM
EMMC04G-S100
SD卡由 MMC 发展而来
支持 SD 模式和 SPI 模式

基本信息2#

  • 采用 2.7V 至 3.6V 单电源供电
  • 有8192个可编程页(256Byte),共计 2MB,寻找地址:000000h ~ 1FFFFFh
    • 16个页面组成1个扇区(4096Byte 扇区擦除)
    • 128个页面组成1个块(32KB块擦除)
    • 256个页面组成1个组(64KB块擦除)
    • 芯片擦除
  • 支持标准串行外设接口(SPI)

引脚定义3#

PIN NO.PIN NAMEI/OFUNCTION
1CSIChip Select Input (片选输入)
2DO(IO1)I/OMISO
3/WP(IO2)I/OWrite Protect Input (写保护输入)
4GNDGround
5DI(IO0)I/OMOSI
6CLKISerial Clock Input (时钟输入)
7/HOLD(IO3)I/OHold Input (保持输入)
8VCCPower Supply

CS:低电平选中,高电平取消。

The SPI Chip Select (/CS) pin enables and disables device operation.

DO (MISO) & DI (MOSI)

The W25Q16BV supports standard SPI, Dual SPI and Quad SPI operation.

  • 标准 SPI 使用单向 DI 在 CLK 的上升沿向器件串行写入指令、地址或数据。
  • 标准 SPI 使用单向 DO 在 CLK 的下降沿上读取器件的数据或状态。

/WP:写保护,低电平有效,用来保护状态寄存器。

/HOLD:低电平有效,允许芯片在被主动选择时暂停,保持输出。

  • 当 /HOLD 变为低电平,而 /CS 为低电平时,DO 引脚将处于高阻态,DI 和 CLK 引脚上的信号将被忽略(无关)
  • 当 /HOLD 变为高电平时,器件可以恢复工作

CLK:SPI串行时钟输入。


Block Diagram#


Status Register#

Register 1#

S7S6S5S4S3S2S1S0
SRP0SECTBBP2BP1BP0WELBUSY

Register 2#

S15S14S13S12S11S10S9S8
SUS(R)(R)(R)(R)(R)QESRP1

Details#

BUSY:忙位(只读),0 表示空闲,1 表示正忙。

WEL:写保护位(只读),执行 Write Enable(06h)指令后 WEL 置 1,写禁用时的 WEL 为 0。

BP2, BP1, BP0:块保护位,默认设置均为 0,不包含任何块。

TB:顶部/底部保护位(非易失读写),控制 BP2/1/0 的保护对象是从顶部(TB=0)还是底部(TB=1)开始,出厂默认设置为 TB=0。

SEC:扇区保护位(非易失读写),控制 TB 和 BP2/1/0 的保护对象是 4KB 扇区(SEC=1)还是 64KB 块(SEC=0),出厂默认设置为 SEC=0。

SRP1, SRP0:状态寄存器保护位(非易失读写),控制写保护方法:

SRP1SRPT0/WPStatus RegisterDescription
00XSoftware Protection/WP 引脚无控制。
写使能指令 WEL=1 后,可以写入状态寄存器。(出厂默认设置)
010Hardware Protected当 /WP 引脚为低电平时,状态寄存器锁定,无法写入。
011Hardware Unprotected当 /WP 引脚为高电平时,状态寄存器解锁,可以在写入使能指令后写入,WEL=1。
10XPower Supply Lock-Down(1)状态寄存器受到保护,在下一个掉电、上电周期之前不能再次写入。(2)
11XOne Time Program(1)状态寄存器被永久保护,不能写入。

Notes:

  1. These features are available upon special order. Please refer to Ordering Information.
  2. When SRP1, SRP0 = (1, 0), a power-down, power-up cycle will change SRP1, SRP0 to (0, 0) state.

SUS:挂起状态位(只读),执行 Erase Suspend(75h)后 SUS=0。

QE:四通道使能位(非易失读写),QE=0(出厂默认设置)使能 /WP 和 /HOLD,QE=1 使能 IO2 和 IO3。


Instruction Set Table#

Instruction Set Table 1#

(Erase, Program Instructions) (1)

INSTRUCTION NAMEBYTE1 (CODE)BYTE2BYTE3BYTE4BYTE5BYTE6
Write Enable06h
Write Disable04h
Read Status Register-105h(S7-S0)(2)
Read Status Register-235h(S15-S8)(2)
Write Status Register01hS7-S0S15-S8
Page Program02hA23-A16A15-A8A7-A0(D7-D0)
Quad Page Program32hA23-A16A15-A8A7-A0(D7-D0)(3)
Sector Erase (4KB)20hA23-A16A15-A8A7-A0
Block Erase (32KB)52hA23-A16A15-A8A7-A0
Block Erase (64KB)D8hA23-A16A15-A8A7-A0
Chip EraseC7h/60h
Erase Suspend75h
Erase Resume7Ah
Power-downB9h
Continuous Read Mode Reset(4)FFhFFh

Notes:

  1. Data bytes are shifted with Most Significant Bit first. Byte fields with data in parenthesis “()” indicate data being read from the device on the DO pin.
  2. The Status Register contents will repeat continuously until /CS terminates the instruction.
  3. Quad Page Program Input Data:
    • IO0 = (D4, D0, ……)
    • IO1 = (D5, D1, ……)
    • IO2 = (D6, D2, ……)
    • IO3 = (D7, D3, ……)
  4. This instruction is recommended when using the Dual or Quad “Continuous Read Mode” feature. See section 11.2.32 for more information.

Instruction Set Table 2#

Read Instructions

INSTRUCTION NAMEBYTE1 (CODE)BYTE2BYTE3BYTE4BYTE5BYTE6
Read Data03hA23-A16A15-A8A7-A0(D7-D0)
Fast Read0BhA23-A16A15-A8A7-A0dummy(D7-D0)
Fast Read Dual Output3BhA23-A16A15-A8A7-A0dummy(D7-D0, …)(1)
Fast Read Dual I/OBBhA23-A8 (2)A7-A0, M7-M0 (2)(D7-D0, …)(1)
Fast Read Quad Output6BhA23-A16A15-A8A7-A0dummy(D7-D0, …)(3)
Fast Read Quad I/OEBhA23-A0, M7-M0 (4)(x,x,x,x, D7-D0, …)(5)(D7-D0, …)(3)
Word Read Quad I/O(7)E7hA23-A0, M7-M0 (4)(x,x, D7-D0, …)(6)(D7-D0, …)(3)
Octal Word Read
Quad I/O(8)
E3hA23-A0, M7-M0 (4)(D7-D0, …)(3)

Notes:

  1. Dual Output data
    • IO0 = (D6, D4, D2, D0)
    • IO1 = (D7, D5, D3, D1)
  2. Dual Input Address
    • IO0 = A22, A20, A18, A16, A14, A12, A10, A8 A6, A4, A2, A0, M6, M4, M2, M0
    • IO1 = A23, A21, A19, A17, A15, A13, A11, A9 A7, A5, A3, A1, M7, M5, M3, M1
  3. Quad Output Data
    • IO0 = (D4, D0, …..)
    • IO1 = (D5, D1, …..)
    • IO2 = (D6, D2, …..)
    • IO3 = (D7, D3, …..)
  4. Quad Input Address
    • IO0 = A20, A16, A12, A8, A4, A0, M4, M0
    • IO1 = A21, A17, A13, A9, A5, A1, M5, M1
    • IO2 = A22, A18, A14, A10, A6, A2, M6, M2
    • IO3 = A23, A19, A15, A11, A7, A3, M7, M3
  5. Fast Read Quad I/O Data
    • IO0 = (x, x, x, x, D4, D0, …..)
    • IO1 = (x, x, x, x, D5, D1, …..)
    • IO2 = (x, x, x, x, D6, D2, …..)
    • IO3 = (x, x, x, x, D7, D3, …..)
  6. Word Read Quad I/O Data
    • IO0 = (x, x, D4, D0, …..)
    • IO1 = (x, x, D5, D1, …..)
    • IO2 = (x, x, D6, D2, …..)
    • IO3 = (x, x, D7, D3, …..)
  7. The lowest address bit must be 0. ( A0 = 0 )
  8. The lowest 4 address bits must be 0. ( A0, A1, A2, A3 = 0 )

Instruction Set Table 3#

ID, Security Instructions

INSTRUCTION NAMEBYTE1 (CODE)BYTE2BYTE3BYTE4BYTE5BYTE6
Release Power down/Device IDABhdummydummydummy(ID7-ID0)(1)
Manufacturer/Device ID(2)90hdummydummy00h(MF7-MF0)(ID7-ID0)
Manufacturer/Device ID by Dual I/O92hA23-A8A7-A0, M[7:0](MF[7:0], ID[7:0])
Manufacture/Device ID by Quad I/O94hA23-A0, M[7:0]xxxx, (MF[7:0], ID[7:0])(MF[7:0], ID[7:0], …)
JEDEC ID9Fh(MF7-MF0) Manufacturer(ID15-ID8) Memory Type(ID7-ID0) Capacity
Read Unique ID4Bhdummydummydummydummy(ID63-ID0)

Notes:

  1. The Device ID will repeat continuously until /CS terminates the instruction.
  2. See Manufacturer and Device Identification table for Device ID information.

案例#

FLASH 状态确认/设备测试#

在初始化阶段判断 FLASH 状态的常用方法有两种,分别是 JEDEC IDS0-BUSY

JEDEC ID

W25Q16 的 JEDEC ID 由3个字节组成,分别是:

  • Manufacturer ID (0xEF)
  • Memory Type
  • Capacity

以我 W25Q16JVSSIQ 为例,发送 0x9F 后,读取3个字节(0xEF : 0x40 : 0x15)。

unsigned char SPI_FLASH_CheckStatus(void)
{
unsigned char b1, b2, b3;
unsigned char i = 0;
while (i++ < 200)
{
SPI_FLASH_CS=0;
SPI_WriteByte(W25X_ReadJEDECID);
b1 = SPI_ReadByte();
b2 = SPI_ReadByte();
b3 = SPI_ReadByte();
SPI_FLASH_CS=1;
if (b1 == 0xEF & b2 == 0x40 & b3 == 0x15) return 1;
delayms(1);
}
return 0;
}

S0-BUSY

unsigned char SPI_FLASH_CheckStatus(void)
{
unsigned char b1;
unsigned char i = 0;
while(i++ < 200)
{
SPI_FLASH_CS=0;
SPI_WriteByte(W25X_ReadStatus1);
b1 = SPI_ReadByte();
SPI_FLASH_CS=1;
if (!(b1 & 0x01)) return 1;
delayms(1);
}
return 0;
}

Footnotes#

  1. 几种flash存储芯片的用途和分类

  2. 硬件知识储备01_一文看懂W25Qxx系列芯片(W25Q16、W25Q32、W25Q64…)

  3. SPI flash W25Q64B的程序谁用过呀,可以共享一份吗

W25Q16 Flash 存储芯片
https://fuwari.vercel.app/posts/嵌入式/其他/w25q16-flash-存储芯片/
作者
Asuwee
发布于
2022-08-23
许可协议
CC BY-NC-SA 4.0