Flash做为一种非易失性存储器,在原理、技术和结构上,与ROM、PROM、EPROM和EEPROM存储器有显著的不同。它是一种可快速擦除可现场编程的快擦写存储器。这种特性决定了Flash做为BIOS、在线擦写、掉电保护数据以及分区保护数据等场合有着广泛的应用。
Flash存储器特点
由于其内部结构的特殊性,Flash存储器最主要的特点在于其内部状态机(Internal State Machine)及指令序列(Command Sequences)的操作模式,因此Flash需要较复杂的软件支持。
除了读取数据(Read Array Data)以外的其它所有操作,如生产商ID(Manufacture ID)及器件ID(Device ID)识别,分区写保护(Sector Protection)/去写保护(Sector Unprotection),擦除(chip erase/sector erase),写数据/校验,复位等操作都需要通过器件内部的指令寄存器(Command Register)启动内嵌算法(embeded algorithms)来完成。
BCS / SCS
Intel从早期的8位闪存芯片28F008开始,就为闪存芯片的操作定义了操作规程和一套相应的命令,一般就称为“28F008”或者“008”。后来正式命名为闪存操作基本命令集,即BCS,其要点如下:
闪存芯片平时处于随机读出状态,此时的闪存芯片就像普通的ROM芯片,访问地址决定了具体的存储单元;
除非芯片处于写入状态,往芯片任意一个单元写都意味着向芯片发命令,因此是对其控制器的访问,而不是对其存储单元的访问;
根据命令代码的不同,闪存芯片内部的状态机进入不同的状态,从而可以进行不同的操作。
BCS中有以下几条命令:
随机读出(Read Array)。向芯片的任意地址写0xff,使芯片“复位”进入“读存储阵列” 状态,在此状态下CPU可以想访问普通内存那样从闪存芯片随机读出。闪存芯片加电后的初始状态就是随机读出状态。
读状态寄存器(Read Status Register)。 向芯片的任意地址写0x70,表示要求从芯片读出其状态寄存器,此后可以从芯片的任意地址读出状态寄存器的内容。
写入(Program),要求写入芯片的若干存储单元。往目标块起始地址写0x40,表示要求进入写模式,或者称为“编程模式”。进入写模式后,就可以对目标块进行随机写入,就像写静态RAM一样。对每个单元只能写一次(要再次对某单元写入,需要先对该单元所在的块进行擦除操作后,才能再进行)。
清除状态寄存器(Clear Status Register)。向芯片的任意地址写0x50,表示要求清除状态寄存器。
单字节或者字写入。先向需要写入的单元写入0x40或0x10,然后写入具体数据。
成块擦除(Block Erase)。向目标块内任意地址写0x20(或者0x28),表示要求擦除芯片内一个块的所有内容。
暂停擦除(Erase Suspends)。向目标块内任意地址写0xb0,表示要求暂停擦除操作。需要时,可以通过往目标块内的任意地址写0xd0来恢复擦除
成块擦除确认,或者继续擦除。往目标块内的任意地址写0xd0,表示确认要求擦除芯片内一个块的所有内容,或者在暂停擦除后恢复擦除操作。
每当向芯片发出命令时,状态寄存器的最高位(bit 7)就会变成0,当操作完成后,该bit会被硬件置为1。
随着闪存技术的发展,Intel后来对BCS进行了扩展,称为SCS(Scaleable Command Set),即“可扩充命令集”。其中增加了芯片加锁(Set/Clear Lock Bit)、缓冲写入。芯片配置、整片擦除操作等命令功能。
上面BCS和SCS描述的操作只适用于Intel的闪存芯片,或者使用Intel BCS/SCS规范的芯片。 |