Samsung K9F1G08U0D SLC NAND FLASH简介(待整理)
Samsung K9F1G08U0D,数据存储容量为128M,采用块页式存储管理。8个I/O引脚充当数据、地址、命令的复用端口。详细:http://www.linux-mtd.infradead.org/nand-data/nanddata.html
芯片内部存储布局及存储操作特点:
一片Nand flash为一个设备(device),其数据存储分层为:
1(device)= 1024(blocks)
1(block)= 64(pages)
1 (page) = (数据块大小)2048 + (00B块大小)64 = 2112(bytes)
Samsung K9F1G08U0D,数据存储容量为128M,采用块页式存储管理。8个I/O引脚充当数据、地址、命令的复用端口。详细:http://www.linux-mtd.infradead.org/nand-data/nanddata.html
芯片内部存储布局及存储操作特点:
一片Nand flash为一个设备(device),其数据存储分层为:
1(device)= 1024(blocks)
1(block)= 64(pages)
1 (page) = (数据块大小)2048 + (00B块大小)64 = 2112(bytes)
在每一页中,最后的64字节(又称OOB)用于Nand Flash命令执行完后设置状态用,剩余2048个字节又分为前半部分和后半部分。可以通过Nand Flash命令00h/01h/50h分别对前半部、后半部、OOB进行定位。
存储操作特点:
1. 擦除操作的最小单位是块。
2. Nand Flash芯片每一位(bit)只能从1变为0,而不能从0变为1,所以在对其进行写入操作之前要一定将相应块擦除(擦除即是将相应块得位全部变为1).
3. OOB部分的第六字节(即2053字节)标志是否是坏块,如果不是坏块该值为FF,否则为坏块。
4. 除OOB第六字节外,通常至少把OOB的前3个字节存放Nand Flash硬件ECC码。
NAND Flash出厂时,因为制造工艺的关系,会存在一定量的坏块。坏块产生有多种原因,如解码失败,地址线错误,存储单元错误等,一般NAND Flash出厂时,厂商经过测试,会将确认的坏块标记出来。同时,因为NAND Flash的擦写寿命有限(一般不超过10万次),当使用到一定时限后也会产生坏块,当擦除或写入失败时,这些块被认为是坏块。一旦一个块被认为是坏块,对其进行擦除或写入操作都是不允许的。(这里的不允许,我个人理解是擦除和写入会通过状态寄存器报错)
到底怎样的块会被标记为坏块?
1 NAND Flash用一个状态寄存器来指示对一个块的擦除和写入操作是否成功,当状态寄存器指示对一个块的擦除或写入操作失败时,该块被标记为坏块。
2 当Error Correction Code(ECC)算法发现超出其纠正能力的错误时,该块也被标识为坏块,这时ECC将该块标为坏块,坏块管理软件将通过分配一个好块对地址重新进行地址映射。
BBT:bad block table,即坏块表。各家对nand的坏块管理方法都有差异。比如专门用nand做存储的,会把bbt放到block0,因为第0块一定是好的块。但是如果nand本身被用来boot,那么第0块就要存放程序,不能放bbt了。
有的把bbt放到最后一块,当然,这一块不能为坏块。
有的bbt中用2个bits表示1个block的状态,所以1个字节可以表示4个blocks。
bbt的大小跟nand大小有关,nand越大,需要的bbt也就越大。
所以具体代码具体分析。
ECC:
NAND Flash出错的时候一般不会造成整个Block或是Page不能读取或是全部出错,而是整个Page(例如512Bytes)中只有一个或几个bit出 错。一般使用一种比较专用的校验——ECC。ECC能纠正单比特错误和检测双比特错误,而且计算速度很快,但对1比特以上的错误无法纠正,对2比特以上的 错误不保证能检测。
ECC一般每256字节原始数据生成3字节ECC校验数据,这三字节共24比特分成两部分:6比特的列校验和16比特的行校验,多余的两个比特置1.
当往NAND Flash的page中写入数据的时候,每256字节我们生成一个ECC校验和,称之为原ECC校验和,保存到PAGE的OOB(out-of-band)数据区中。其位置就是eccpos[]。
校验的时候,根据上述ECC生成原理不难推断:将从OOB区中读出的原ECC校验和新ECC校验和按位异或,若结果为0,则表示不存在错(或是出现了 ECC无法检测的错误);若3个字节异或结果中存在11个比特位为1,表示存在一个比特错误,且可纠正;若3个字节异或结果中只存在1个比特位为1,表示 OOB区出错;其他情况均表示出现了无法纠正的错误。
NAND flashes may have bit-flips which occur on read and write operations. Bit-flips are corrected by ECC checksums, but they may accumulate over time and cause data loss.
NAND vs. NOR
包括硅片设计的不同,NAND和NOR flash之间最重要的不同是总线接口的差异。NOR Flash是像SRAM这样的存储器一样被直接链接在地址或者数据总线上。NAND Flash使用复用的I/O接口和一些附加的控制引脚。NAND Flash是一种适合作为大容量存储的顺序存储设备,而NOR Flash是适合作为代码存储的随机存储设备。NOR Flash常被用作代码存储和代码执行。存储在NAND Flash上的代码不能从上面直接执行。这些代码必须被下载到RAM上并从RAM上执行。
对于大量数据写的操作,NAND Flash明显快于NOR Flash。
NAND Flash比起Nor Flash要便宜很多,并且需要较少的接口。所以在大容量存储和数字音视频,数码相机上被广泛应用。
A page consists of 2048 Bytes data and and 64 Bytes spare area sizes. The spare (out of band) area is used to store ECC (error correction code), bad block information and filesystem-dependent data. n pages build one block. The read / write access to data is on a per page basis. Erase is done on a per block basis. The commands to read / write / erase the chip is given by writing to the chip with the Command Latch Enable pin high. Address is given by writing with the Address Latch Enable pin high.
由于spare area是必须使用的,所以/SE(Spare area Enable)pin should be tied to GND. /CE,CLE和ALE应该是GPIO引脚或者latched 信号线。也可以将ALE和CLE连接到地址线,但是此时必须要注意芯片上的时限。
/RE和/WE可以被连接到CPU响应的线上。确保它们逻辑上连接到了响应的片选线上。也可以为/RE和/WE选择两种不同的片选线,但是要知道数据保持了NAND芯片的时间约束。
系统通过分析R\B针脚的状态来检测数据传输是否完成。一旦页数据被装进数据寄存器,通过使读使能信号(低电平有效)连续有效,数据能在25纳秒内读出。重复的使能使能信号,使数据从选中的列地址到最后的列地址在读使能信号下降沿输出。
在每一页中,最后的64字节(又称OOB)用于Nand Flash命令执行完后设置状态用,剩余2048个字节又分为前半部分和后半部分。可以通过Nand Flash命令00h/01h/50h分别对前半部、后半部、OOB进行定位。
存储操作特点:
1. 擦除操作的最小单位是块。
2. Nand Flash芯片每一位(bit)只能从1变为0,而不能从0变为1,所以在对其进行写入操作之前要一定将相应块擦除(擦除即是将相应块得位全部变为1).
3. OOB部分的第六字节(即2053字节)标志是否是坏块,如果不是坏块该值为FF,否则为坏块。
4. 除OOB第六字节外,通常至少把OOB的前3个字节存放Nand Flash硬件ECC码。
NAND Flash出厂时,因为制造工艺的关系,会存在一定量的坏块。坏块产生有多种原因,如解码失败,地址线错误,存储单元错误等,一般NAND Flash出厂时,厂商经过测试,会将确认的坏块标记出来。同时,因为NAND Flash的擦写寿命有限(一般不超过10万次),当使用到一定时限后也会产生坏块,当擦除或写入失败时,这些块被认为是坏块。一旦一个块被认为是坏块,对其进行擦除或写入操作都是不允许的。(这里的不允许,我个人理解是擦除和写入会通过状态寄存器报错)
到底怎样的块会被标记为坏块?
1 NAND Flash用一个状态寄存器来指示对一个块的擦除和写入操作是否成功,当状态寄存器指示对一个块的擦除或写入操作失败时,该块被标记为坏块。
2 当Error Correction Code(ECC)算法发现超出其纠正能力的错误时,该块也被标识为坏块,这时ECC将该块标为坏块,坏块管理软件将通过分配一个好块对地址重新进行地址映射。
BBT:bad block table,即坏块表。各家对nand的坏块管理方法都有差异。比如专门用nand做存储的,会把bbt放到block0,因为第0块一定是好的块。但是如果nand本身被用来boot,那么第0块就要存放程序,不能放bbt了。
有的把bbt放到最后一块,当然,这一块不能为坏块。
有的bbt中用2个bits表示1个block的状态,所以1个字节可以表示4个blocks。
bbt的大小跟nand大小有关,nand越大,需要的bbt也就越大。
所以具体代码具体分析。
ECC:
NAND Flash出错的时候一般不会造成整个Block或是Page不能读取或是全部出错,而是整个Page(例如512Bytes)中只有一个或几个bit出 错。一般使用一种比较专用的校验——ECC。ECC能纠正单比特错误和检测双比特错误,而且计算速度很快,但对1比特以上的错误无法纠正,对2比特以上的 错误不保证能检测。
ECC一般每256字节原始数据生成3字节ECC校验数据,这三字节共24比特分成两部分:6比特的列校验和16比特的行校验,多余的两个比特置1.
当往NAND Flash的page中写入数据的时候,每256字节我们生成一个ECC校验和,称之为原ECC校验和,保存到PAGE的OOB(out-of-band)数据区中。其位置就是eccpos[]。
校验的时候,根据上述ECC生成原理不难推断:将从OOB区中读出的原ECC校验和新ECC校验和按位异或,若结果为0,则表示不存在错(或是出现了 ECC无法检测的错误);若3个字节异或结果中存在11个比特位为1,表示存在一个比特错误,且可纠正;若3个字节异或结果中只存在1个比特位为1,表示 OOB区出错;其他情况均表示出现了无法纠正的错误。
NAND flashes may have bit-flips which occur on read and write operations. Bit-flips are corrected by ECC checksums, but they may accumulate over time and cause data loss.
NAND vs. NOR
包括硅片设计的不同,NAND和NOR flash之间最重要的不同是总线接口的差异。NOR Flash是像SRAM这样的存储器一样被直接链接在地址或者数据总线上。NAND Flash使用复用的I/O接口和一些附加的控制引脚。NAND Flash是一种适合作为大容量存储的顺序存储设备,而NOR Flash是适合作为代码存储的随机存储设备。NOR Flash常被用作代码存储和代码执行。存储在NAND Flash上的代码不能从上面直接执行。这些代码必须被下载到RAM上并从RAM上执行。
对于大量数据写的操作,NAND Flash明显快于NOR Flash。
NAND Flash比起Nor Flash要便宜很多,并且需要较少的接口。所以在大容量存储和数字音视频,数码相机上被广泛应用。
A page consists of 2048 Bytes data and and 64 Bytes spare area sizes. The spare (out of band) area is used to store ECC (error correction code), bad block information and filesystem-dependent data. n pages build one block. The read / write access to data is on a per page basis. Erase is done on a per block basis. The commands to read / write / erase the chip is given by writing to the chip with the Command Latch Enable pin high. Address is given by writing with the Address Latch Enable pin high.
由于spare area是必须使用的,所以/SE(Spare area Enable)pin should be tied to GND. /CE,CLE和ALE应该是GPIO引脚或者latched 信号线。也可以将ALE和CLE连接到地址线,但是此时必须要注意芯片上的时限。
/RE和/WE可以被连接到CPU响应的线上。确保它们逻辑上连接到了响应的片选线上。也可以为/RE和/WE选择两种不同的片选线,但是要知道数据保持了NAND芯片的时间约束。
系统通过分析R\B针脚的状态来检测数据传输是否完成。一旦页数据被装进数据寄存器,通过使读使能信号(低电平有效)连续有效,数据能在25纳秒内读出。重复的使能使能信号,使数据从选中的列地址到最后的列地址在读使能信号下降沿输出。
NAND FLASH 需要多cycle的原因
NAND flash以页为单位读写数据,而以块为单位擦除数据。按照这样的组织方式可以形成所谓的三类地址:
Column Address:Starting Address of the Register. 翻成中文为列地址,地址的低8位
Page Address :页地址
Block Address :块地址
对于NAND Flash来讲,地址和命令只能在I/O[7:0]上传递,数据宽度是8位。
512byte需要9bit来表示,对于528byte系列的NAND,这512byte被分成1st half Page Register和2nd half Page Register,各自的访问由地址指针命令来选择,A[7:0]就是所谓的column address(列地址),在进行擦除操作时不需要它,why?因为以块为单位擦除。32个page需要5bit来表示,占用A[13:9],即该page在块内的相对地址。A8这一位地址被用来设置512byte的1st half page还是2nd half page,0表示1st,1表示2nd。Block的地址是由A14以上的bit来表示。
例如64MB(512Mb)的NAND flash(实际中由于存在spare area,故都大于这个值),共4096block,因此,需要12个bit来表示,即A[25:14],如果是128MB(1Gbit) 的528byte/page的NAND Flash,则block address用A[26:14]表示。而page address就是blcok address|page address in block NAND Flash 的地址表示为: Block Address|Page Address in block|halfpage pointer|Column Address 地址传送顺序是Column Address,Page Address,Block Address。
由于地址只能在I/O[7:0]上传递,因此,必须采用移位的方式进行。 例如,对于512Mbit x8的NAND flash,地址范围是0~0x3FF_FFFF,只要是这个范围内的数值表示的地址都是有效的。 以NAND_ADDR 为例:
第1 步是传递column address,就是NAND_ADDR[7:0],不需移位即可传递到I/O[7:0]上,而halfpage pointer即A8 是由操作指令决定的,即指令决定在哪个halfpage 上进行读写,而真正的A8 的值是不需程序员关心的。
第2 步就是将NAND_ADDR 右移9位,将NAND_ADDR[16:9]传到I/O[7:0]上;
第3 步将NAND_ADDR[24:17]放到I/O上;
第4步需要将NAND_ADDR[25]放到I/O上;
因此,整个地址传递过程需要4 步才能完成,即4-step addressing。 如果NAND Flash 的容量是32MB(256Mbit)以下,那么,block adress最高位只到bit24,因此寻址只需要3步。
下面,就x16 的NAND flash 器件稍微进行一下说明。 由于一个page 的main area 的容量为256word,仍相当于512byte。但是,这个时候没有所谓的1st halfpage 和2nd halfpage 之分了,所以,bit8就变得没有意义了,也就是这个时候 A8 完全不用管,地址传递仍然和x8 器件相同。除了,这一点之外,x16 的NAND使用方法和 x8 的使用方法完全相同。