本篇文章将带领大家全面解析闪存芯片W25Q128,主要分为以几个部分:
一、什么是W25Q128
二、W25Q128引脚封装
三、W25Q128内存结构框架
四、W25Q128JV相关寄存器
五、W25Q128JV命令
六、常用的指令
七、总结
一、什么是W25Q128
W25Q128是华邦公司推出的一款SPI接口的NOR Flash芯片,其存储空间为128Mbit,相当于16M字节。W25Q128V芯片是串行闪存,可以通过标准/两线/四线SPI控制。
W25Q128JV(128M位)串行闪存为空间、引脚和电源有限的系统提供了存储解决方案。25Q系列提供的灵活性和性能远远超过普通串行闪存设备。它们是将代码隐藏到RAM、直接从双/四SPI(XIP)执行代码以及存储语音、文本和数据的理想选择。该设备在单个2.7V至3.6V电源上运行,断电时电流消耗低至1µA。所有设备均提供节省空间的包装。
图 1 W25Q128实物图
W25Q128JV阵列被组织成65536个可编程页面,每个页面256字节。一次最多可编程256个字节。页面可以按16组(4KB扇区擦除)、128组(32KB块擦除)、256组(64KB块擦除或整个芯片(芯片擦除)擦除。W25Q128JV分别具有4096个可擦除扇区和256个可擦除块。小4KB扇区允许在需要数据和参数存储的应用中具有更大的灵活性。
图 2 W25Q128串行闪存框图
二、W25Q128引脚封装
图 3 W25Q128引脚封装
W25Q128JV管脚如下,作为标准SPI控制时,DO管脚为MISO,D1管脚为MOSI,/CS为片选NSS,CLK为时钟信号线。/WP为写保护管脚,/HOLD or /RESET为保持或复位引脚(通过寄存器配置)。
三、W25Q128内存结构框架
首先W25Q128引出一个SPI接口实现通讯基础,具备几个控制和状态寄存器,在写保护逻辑和内存编码上的内存分配大致都是分成64KB的块,4KB的扇区,256Byte的页,例如W25Q128,内存为16MByte(128Mbits/8bit),它有256个块,每个块有16个扇区,每个扇区有16页。
四、W25Q128JV相关寄存器
1.状态寄存器-1
(1)Erase/Write In Progress(BUSY)(只读)
BUSY是状态寄存器(S0)中的只读位,当设备执行页面程序、四页程序、扇区擦除、块擦除、芯片擦除、写入状态寄存器或擦除/程序安全寄存器指令时,该位设置为1状态。在此期间,设备将忽略除读取状态寄存器和擦除/编程暂停指令之外的其他指令(请参阅AC特性中的tW、tPP、tSE、tBE和tCE)。当程序、擦除或写入状态/安全寄存器指令完成时,BUSY位将被清除为0状态,表示设备已准备好接受进一步指令。
(2)Write Enable Latch(WEL)(只读)
写使能锁存器(WEL)是状态寄存器(S1)中的一个只读位,在执行写使能指令后设置为1。当设备被禁止写入时,WEL状态位被清除为0。在通电时或执行以下任一指令后,会出现写禁用状态:写禁用、页面编程、四页编程、扇区擦除、块擦除、芯片擦除、写状态寄存器、擦除安全寄存器和编程安全寄存器。
(3)Block Protect Bits(BP2,BP1,BP0)(读写)
块保护位(BP2、BP1、BP0)是状态寄存器(S4、S3和S2)中的非易失性读/写位,提供写保护控制和状态。可以使用写状态寄存器指令设置块保护位(请参阅AC特性中的tW)。所有、所有或部分内存阵列都可以免受编程和擦除指令的保护(请参阅状态寄存器内存保护表)。块保护位的出厂默认设置为0,所有阵列都不受保护。
(4)Top/Bottom Block Protect (TB) (读写)
非易失性顶部/底部位(TB)控制块保护位(BP2、BP1、BP0)是从阵列的顶部(TB=0)还是底部(TB=1)进行保护。出厂默认设置为TB=0。TB位可以根据SRP、SRL和WEL位的状态使用写入状态寄存器指令设置。
(5)Sector/Block Protect Bit (SEC)(读写)
非易失性扇区/数据块保护位(SEC)控制数据块保护比特(BP2、BP1、BP0)是否保护阵列顶部(TB=0)或底部(TB=1)的4KB扇区(SEC=1)或64KB数据块(SEC=0)。默认设置为SEC=0。
(6)Complement Protect (CMP)(读写)
互补保护位(CMP)是状态寄存器中的非易失性读/写位(S14)。它与SEC、TB、BP2、BP1和BP0位一起使用,为阵列保护提供了更大的灵活性。一旦CMP设置为1,SEC、TB、BP2、BP1和BP0设置的先前阵列保护将被反转。例如,当CMP=0时,可以保护顶部64KB的块,而阵列的其余部分不受保护;当CMP=1时,顶部64KB块将变得不受保护,而阵列的其余部分将变为只读。有关详细信息,请参阅状态寄存器内存保护表。默认设置为CMP=0。
2. 状态寄存器-2
(1)Erase/Program Suspend Status (SUS)(只读)
暂停状态位是状态寄存器(S15)中的只读位,在执行擦除/程序暂停(75h)指令后。SUS状态位通过擦除/编程恢复(7Ah)指令以及断电、通电周期清除为0。
(2)Security Register Lock Bits (LB3, LB2, LB1)(读写)
安全寄存器锁定位(LB3、LB2、LB1)是状态寄存器(S13、S12、S11)中的非易失性一次性编程(OTP)位,其向安全寄存器提供写保护控制和状态。LB3-1的默认状态为0,安全寄存器已解锁。LB3-1可以使用“写入状态寄存器”指令单独设置为1。LB3-1为一次性可编程(OTP),一旦设置为1,对应的256字节安全寄存器将永久变为只读。
(3)Quad Enable (QE) (读写)
出厂时,四位启用(QE)位默认设置为1,因此设备在通电后支持标准/双SPI以及四位SPI。此位不能重置为0。
注:QE位设置为0状态,零件号出厂默认值。
3.状态寄存器-3
(1)Write Protect Selection (WPS) (读写)
WPS位用于选择应使用的写入保护方案。当WPS=0时,设备将使用CMP、SEC、TB、BP[2:0]位的组合来保护存储器阵列的特定区域。当WPS=1时,设备将使用单个块锁来保护任何单个扇区或块。设备通电或复位后,所有单个块锁定位的默认值为1。
(2)Output Driver Strength(DRV1,DRV0)(读写)
DRV1和DRV0位用于确定读取操作的输出驱动器强度。
(3)Reserved Bits(无功能)
有几个保留的状态寄存器位可以作为“0”或“1”读出。建议忽略这些位的值。在“写入状态寄存器”指令期间,保留位可以写为“0”,但不会有任何影响。
五、W25Q128JV命令
1.读制造商/设备ID(0x90)
该指令通常在调试程序的时候用到,判断SPI通信是否正常。该指令通过主器件拉低/CS片选使能器件开始传输,首先通过DI线传输“90H”指令,接着传输000000H的24位地址(A23-A0),之后从器件会通过DO线返回制造商ID(EFH)和设备ID(17H)。
注:SPI为数据交换通信,主器件在发送“90H”指令时也会接收到一个字节FFH,但此数据为无效数据
2.读数据(03H)
读数据指令可从存储器依次一个或多个数据字节,该指令通过主器件拉低/CS电平使能设备开始传输,然后传输“03H”指令,接着通过DI管脚传输24位地址,从器件接到地址后,寻址存储器中的数据通过DO引脚输出。每传输一个字节地址自动递增,所以只要时钟继续传输,可以不断读取存储器中的数据。
3.页编程(02H)
页编程指令可以在已擦除的存储单元中写入256个字节。该指令先拉低/CS引脚电平,接着传输“02H”指令和24位地址。后面接着传输至少一个数据字节,最多256字节。
4.扇区擦除(20H)
扇区擦除指令,数据写入前必须擦除对应的存储单元,该指令先拉低/CS引脚电平,接着传输“20H”指令和要擦除扇区的地址。
5.命令注意事项
在对W25Q128 FLASH的写入数据的操作中一定要先擦出扇区,在进行写入,否则将会发生数据错误。W25Q128 FLASH一次性最大写入只有256个字节。在进行写操作之前,一定要开启写使能(Write Enable)。当只接收数据时不但能只检测RXNE状态 ,必须同时向发送缓冲区发送数据才能驱动SCK时钟跳变。
六、常用的指令
我们使用内存就是想来存放数据的,涉及到读写,所以我们的需求有:读内存和写内存。写内存的时候都需要注意Flash的一个通病,那就是Flash编程只能将1写为0,而不能将0写成1。所以我们需要在写内存的时候将内存擦除,使用内存擦除指令擦除内存,内存变为0xFF,然后再写内存。有时候我们可能要格式化内存,那么就还需要整片擦除指令。最后值得考虑的是,任何一款芯片都会有状态寄存器,我们在操作芯片的时候都需要先了解芯片的状态如何。那么针对使用标准SPI通信,梳理一下我们大致用到的指令有:
1) 阅读 JEDEC ID 0x9f
2) 写入数据使能 Write Enable 0x06
3) 读数据 Read Data 0x03
4) 扇区擦除 Erase_Sector 0x20
5) 写入数据 Write data 0x02
6) 掉电模式 Power-down 0xB9
7) 唤醒模式 Release Powerdown / ID 0xAB
七、总结
总的来说,对于初次SPI的初学者来说,W25Q128芯片确实是学习SPI通信的一个深入的了解,结合SPI通讯对串行FLASH的读写,通过SPI发送指令向W25Q128中读写数据,读者可以通过在STM32开发板结合W25Q128芯片进行相关读写实验。