IT民工
分类: 嵌入式
2009-09-01 13:16:53
NOR FLASH 相关
Flash做为一种非易失性存储器,在原理、技术和结构上,与ROM、PROM、EPROM和EEPROM存储器有显著的不同。它是一种可快速擦除可现场编程的快擦写存储器。这种特性决定了Flash做为BIOS、在线擦写、掉电保护数据以及分区保护数据等场合有着广泛的应用。
Flash存储器特点
由于其内部结构的特殊性,Flash存储器最主要的特点在于其内部状态机(Internal State Machine)及指令序列(Command Sequences)的操作模式,因此Flash需要较复杂的软件支持。
除了读取数据(Read Array #)以外的其它所有操作,如生产商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规范的芯片。
Jedec ID
在闪存技术发展的初期,只有Intel一家生产闪存芯片,产品单一。后来慢慢多起来,新投入闪存芯片生产的厂商往往使自己的产品与Intel兼容,所以Intel的BCS就成为了事实上的标准。但是,随着闪存芯片生产厂商的增加,闪存芯片种类和规格也越来越多,一方面导致BCS不够用了,另一方面就是有的厂商使用了不同于BCS的规程。例如,同样是读取芯片ID,由AMD生产的芯片则需要向片上地址0写入0xAA5。实际上,INTEL和AMD就是最主要的闪存芯片厂商。在这种情况下,特别是对于通用计算机系统,在对闪存芯片进行操作之前,首先要搞清这是由哪个厂商生产的什么芯片。为此,就需要有一个“中立”、受所有闪存芯片厂商支持的手段,使得计算机软件可以从芯片中读取这些信息。于是,便有了所谓的“Jedec ID”以及相应当命令:
读芯片ID(Read ID)。往芯片任何地址写0x90,表示要求从芯片读出固化在芯片内的身份信息,如由谁生产,什么型号等等,称为“Jedec ID”。这些信息并不占用闪存芯片在内存空间的地址。此后,CPU可以从片上地址0开始逐个字节读出这些信息。
CFI
由Jedec ID所提供的信息实在是太少了。因此,“公共闪存接口”(Common Flash Interface),即CFI,便应运而生。这是由存储芯片工业界定义的一种获取闪存芯片物理会和结构参数的操作规程和标准。
CFI规定,各厂商可以使用自己的操作规程和命令集,但是必须有统一的编号,并且在软件到查询下提供这个编号。而且,闪存芯片可以同时支持两套操作规程和命令集,让软件选择使用。同时,又规定闪存芯片必须提供更多的信息,包括:芯片的电源电压是多少,擦除/写入操作是否需要额外的电源,如果需要是多少,芯片的容量有多大,分成几个擦除块,各种操作所需时间的典型值和最大值,等等。为此,还定义了一个用来提供详细信息的标准数据结构,凡是支持CFI的闪存芯片在收到查询时都应该能够按照这个数据结构的格式提供信息,即CFI信息块。此外,还可以与所支持的操作规程和命令集配套提供附加的参数和信息。
CFI 查询的规程和命令如下:
向芯片地址0x55写入0x98,然后从片上地址0x10开始读出数据。如果读出的内容依次为:“Q”、“R”、“Y”,则该芯片支持CFI。
然后从芯片上连续的地址0x13 ~ 0x30读出CFI信息块的固定部分。
除了固定部分以外,后面还有一个无符号整数数组,其大小取决于芯片上的存储区间划分成几个擦除区间,数组中的每一个无符号整数都描述一个擦除区间。一个擦除区间中可以有若干个大小相同的擦除块。
如果从地址0x15和0x16读出的16位无符号短整数P非0,则在片上地址P处还有一个“主算法扩充表”。这就是与“主算法”(即芯片中主要的操作规程和命令集)配套的参数和其他信息。
如果从地址0x19和0x20读出的16位无符号短整数T非0,则在片上地址T处还有一个“次算法扩充表”。这就是与“次算法”(即芯片所支持的另外一套操作规程和命令集)配套的参数和其他信息。