NandFlash读写过程

NandFlash读写过程
NandFlash读写过程

NandFlash读写过程

一、结构分析

目前市场上常见的8位NandFlash有三星公司的k9f1208、k9f1g08、k9f2g08等。k9f1208、k9f1g08、k9f2g08的数据页大小分别为512Byte、2kByte、2kByte。它们在寻址方式上有一定差异,所以程序代码并不通用。本文以S3C2410处理器和k9f1208系统为例,讲述NandFlash的读写方法。

NandFlash的数据是以bit的方式保存在memory cell里的,一般来说,一个cell 中只能存储一个bit,这些cell 以8 个或者16 个为单位,连成bit line,形成所谓的byte(x8)/word(x16),这就是NAND Device 的位宽。这些Line 组成Page,page 再组织形成一个Block。k9f1208的相关数据如下:

1block=32page;1page=528byte=512byte(Main Area)+16byte(Spare Area)。

总容量为=4096(block数量)*32(page/block)*512(byte/page)=64Mbyte

NandFlash以页为单位读写数据,而以块为单位擦除数据。按照k9f1208的组织方式可以分四类地址:Column Address、halfpage pointer、Page Address 、Block Address。

A[0:25]表示数据在64M空间中的地址。

Column Address表示数据在半页中的地址,大小范围0~255,用A[0:7]表示;halfpage pointer表示半页在整页中的位置,即在0~255空间还是在256~511空间,用A[8]表示;

Page Address表示页在块中的地址,大小范围0~31,用A[13:9]表示;

Block Address表示块在flash中的位置,大小范围0~4095,A[25:14] 表示;

二、读操作过程

K9f1208的寻址分为4个cycle。分别是:A[0:7]、A[9:16]、A[17:24]、A[25]。读操作的过程为: 1、发送读取指令;2、发送第1个cycle地址;3、发送第2个cycle地址;4、发送第3个cycle地址;5、发送第4个cycle地址;6、读取数据至页末。

K9f1208提供了两个读指令,‘0x00’、‘0x01’。这两个指令区别在于‘0x00’可以将A[8]置为0,选中上半页;而‘0x01’可以将A[8]置为1,选中下半页。

虽然读写过程可以不从页边界开始,但在正式场合下还是建议从页边界开始读写至页结束。下面通过分析读取页的代码,阐述读过程。

static void ReadPage(U32 addr, U8 *buf) //addr表示flash中的第几页,即‘flash

地址>>9’

{

U16 i;

NFChipEn(); //使能NandFlash

WrNFCmd(READCMD0); //发送读指令‘0x00’,由于是整页读取,所以选用指令‘0x00’

WrNFAddr(0); //写地址的第1个cycle,即Column Address,由于是整页读取所以取0

WrNFAddr(addr); //写地址的第2个cycle,即A[9:16]

WrNFAddr(addr>>8); //写地址的第3个cycle,即A[17:24]

WrNFAddr(addr>>16); //写地址的第4个cycle,即A[25]。

WaitNFBusy(); //等待系统不忙

for(i=0; i<512; i++)

buf[i] = RdNFDat(); //循环读出1页数据

NFChipDs(); //释放NandFlash

}

三、写操作过程

写操作的过程为: 1、发送写开始指令;2、发送第1个cycle地址;3、发送第2个cycle地址;4、发送第3个cycle地址;5、发送第4个cycle地址;6、写入数据至页末;7、发送写结束指令

下面通过分析写入页的代码,阐述读写过程。

static void WritePage(U32 addr, U8 *buf) //addr表示flash中的第几页,即‘flash 地址>>9’

{

U32 i;

NFChipEn(); //使能NandFlash

WrNFCmd(PROGCMD0); //发送写开始指令’0x80’

WrNFAddr(0); //写地址的第1个cycle

WrNFAddr(addr); //写地址的第2个cycle

WrNFAddr(addr>>8); //写地址的第3个cycle

WrNFAddr(addr>>16); 写地址的第4个cycle

WaitNFBusy(); //等待系统不忙

for(i=0; i<512; i++)

WrNFDat(buf[i]); //循环写入1页数据

WrNFCmd(PROGCMD1); //发送写结束指令’0x10’

NFChipDs(); //释放NandFlash

}

四、总结

本文以S3C2410处理器和k9f1208系统为例讲述了nand flash的读写过程。在读写过程中没有考虑到坏块问题,有关ecc及坏块处理问题将在下个专题中讲述。

我的板子上使用的是SAMSUNG的K9F1208U0B,下面我将对此型号的NandFlash读取操作做一个讲解。

首先我们先从物理结构上来了解这颗芯片,结构图如下所示

正如硬盘的盘片被分为磁道,每个磁道又被分为若干扇区,一块Nand Flash被分为若干Block,每个Block又被分为若干Page。

由上图我们可以知道flash中Byte(字节),Page(页),Block(块)3个单位之间的关系为

1 Page =51

2 Bytes Data Field+ 16 Bytes Spare Field

1 Blcok="32" Pages

我们讨论的K9F1208U0B总共有4096 个Blocks,故我们可以知道这块flash的容量为4096 *(32 *528)= 69206016 Bytes = 66 MB

但事实上每个Page上的最后16Bytes是用于存贮检验码用的,并不能存放实际的数据,所以实际上我们可以操作的芯片容量为

4096 *(32 *512) = 67108864 Bytes = 64 MB

由上图所示,1个Page总共由528 Bytes组成,这528个字节按顺序由上而下以列为单位进行排列(1列代表一个Byte。第0行为第0 Byte ,第1行为第1 Byte,以此类推,每个行又由8个位组成,每个位表示1个Byte里面的1bit)。这528Bytes 按功能分为两大部分,分别是Data Field和Spare Field,其中Spare Field占

528Bytes里的16Bytes,这16Bytes是用于在读写操作的时候存放校验码用的,一般不用做普通数据的存储区,除去这16Bytes,剩下的512Bytes便是我们用于存放数据用的Data Field,所以一个Page上虽然有528个Bytes,但我们只按512Bytes 进行容量的计算。

Data Field按位置关系又可分为两个部分,分别称为1st half与2nd half,每个half 各占256个bytes。或许你会感到纳闷,为什么要把DataField分为两个部分?把他们看做一个整体进行操作不就好了吗?呵呵,凡事都有因果关系,这么分块自然有它的道理所在,但现在还不是告诉你答案的时候。我们还是先讨论一下它的操作吧。

对K9F1208U0B的操作是通过向Nand Flash命令寄存器(对于s3c2410来说此寄存器为NFCMD,内存映射地址为0x4e000004)发送命令队列进行的,为什么说

是命令队列?就是因为要完成某个操作的时候发送的不是一条命令,而是连续几条命令或是一条命令加几个参数

下面是K9F1208U0B的操作命令集:

读命令有两个,分别是Read1,Read2其中Read1用于读取Data Field的数据,而Read2则是用于读取Spare Field的数据。对于Nand Flash来说,读操作的最小操作单位为Page,也就是说当我们给定了读取的起始位置后,读操作将从该位置开始,连续读取到本Page的最后一个Byte为止(可以包括Spare Field)

Nand Flash的寻址

Nand Flash的地址寄存器把一个完整的Nand Flash地址分解成Column Address

与Page Address.进行寻址

Column Address: 列地址。Column Address其实就是指定Page上的某个Byte,指定这个Byte其实也就是指定此页的读写起始地址。

Page Address:页地址。由于页地址总是以512Bytes对齐的,所以它的低9位总是0。确定读写操作是在Flash上的哪个页进行的。

Read1命令

当我们得到一个Nand Flash地址src_addr时我们可以这样分解出Column Address 和Page Address

column_addr=src_addr%512; // column address page_address=(src_addr>>9); // page address

也可以这么认为,一个Nand Flash地址的A0~A7是它的column_addr,A9~A25是它的Page Address。(注意地址位A8并没有出现,也就是A8被忽略,在下面你将了解到这是什么原因)

Read1命令的操作分为4个Cycle,发送完读命令00h或01h(00h与01h的区别请见下文描述)之后将分4个Cycle发送参数,1st.Cycle是发送Column Address。2nd.Cycle ,3rd.Cycle和4th.Cycle则是指定Page Address(每次向地址寄存器发送的数据只能是8位,所以17位的Page Address必须分成3次进行发送)。

4个Cycle

你是否还记得我上文提到过的Data Field被分为1st half 和2end half两个部分?而从上面的命令集我们看到Read1的命令里面出现了两个命令选项,分别是00h 和01h。这里出现了两个读命是否令你意识到什么呢?是的,00h是用于读写1st half的命令,而01h是用于读取2nd half的命令。现在我可以结合上图给你说明为什么K9F1208U0B的DataField被分为2个half了。

如上文我所提及的,Read1的1st.Cycle是发送Column Address,假设我现在指定的Column Address是0,那么读操作将从此页的第0号Byte开始一直读取到此页的最后一个Byte(包括Spare Field),如果我指定的Column Address是127,情况也与前面一样,但不知道你发现没有,用于传递Column Address的数据线有8条(I/O0~I/O7,对应A0~A7,这也是A8为什么不出现在我们传递的地址位中),

也就是说我们能够指定的Column Address范围为0~255,但不要忘了,1个Page 的DataField是由512个Byte组成的,假设现在我要指定读命令从第256个字节处开始读取此页,那将会发生什么情景?我必须把Column Address设置为256,但Column Address最大只能是255,这就造成数据溢出。。。正是因为这个原因我们才把Data Field分为两个半区,当要读取的起始地址(Column Address)在0~255内时我们用00h命令,当读取的起始地址是在256~511时,则使用01h命令.假设现在我要指定从第256个byte开始读取此页,那么我将这样发送命令串column_addr=256;

NF_CMD=0x01; 从2nd half开始读取

NF_ADDR=column_addr&0xff; 1st Cycle

NF_ADDR=page_address&0xff; 2nd.Cycle

NF_ADDR=(page_address>>8)&0xff; 3rd.Cycle

NF_ADDR=(page_address>>16)&0xff; 4th.Cycle

其中NF_CMD和NF_ADDR分别是NandFlash的命令寄存器和地址寄存器的地址解引用,我一般这样定义它们,

#define rNFCMD (*(volatile unsigned char *)0x4e000004)

//NADD Flash command

#define rNFADDR (*(volatile unsigned char *)0x4e000008)

//NAND Flash address

事实上,当NF_CMD=0x01时,地址寄存器中的第8位(A8)将被设置为1(如上文分析,A8位不在我们传递的地址中,这个位其实就是硬件电路根据01h或是00h这两个命令来置高位或是置低位),这样我们传递column_addr的值256随然由于数据溢出变为1,但A8位已经由于NF_CMD=0x01的关系被置为1了,所以我们传到地址寄存器里的值变成了

A0 A1 A2 A3 A4 A5 A6 A7 A8

1 0 0 0 0 0 0 0 1

这8个位所表示的正好是256,这样读操作将从此页的第256号byte(2nd half 的第0号byte)开始读取数据。

Read2

Read2则是指定读取Spare Field的内容

其实Read1和Read2都是读命令,他们的区别相当于对一个读指针进行不同区域的定位。

nand_flash.c中包含3个函数

void nf_reset(void);

void nf_init(void);

void nf_read(unsigned int src_addr,unsigned char *desc_addr,int size);

nf_reset()将被nf_init()调用。

nf_init()是nand_flash的初始化函数,在对nand flash进行任何操作之前,nf_init()必须被调用。

nf_read(unsigned int src_addr,unsigned char *desc_addr,int size);为读函数,

src_addr是nand flash上的地址,desc_addr是内存地址,size是读取文件的长度。在nf_reset和nf_read函数中存在两个宏

NF_nFCE_L();

NF_nFCE_H();

你可以看到当每次对Nand Flash进行操作之前NF_nFCE_L()必定被调用,操作结束之时NF_nFCE_H()必定被调用。这两个宏用于启动和关闭Flash芯片的工作(片选/取消片选)。

至于nf_reset()中的

rNFCONF=(1<<15)|(1<<14)|(1<<13)|(1<<12)|(1<<11)|(TACLS<<8)|(TWRPH0<<4)| (TWRPH1<<0);

这一行代码是对NandFlash的控制寄存器进行初始化配置,rNFCONF是Nand Flash的配置寄存器,各个位的具体功能请参阅s3c2410数据手册。

现在举一个例子,假设我要从Nand Flash中的第5000字节处开始读取1024个字节到内存的0x30000000处,我们这样调用read函数

nf_read(5000, 0x30000000,1024);

我们来分析5000这个src_addr.

根据

column_addr=src_addr%512;

page_address=(src_addr>>9);

我们可得出column_addr=5000%512=392

page_address=(5000>>9)=9

于是我们可以知道5000这个地址是在第9页的第392个字节处,于是我们的

nf_read函数将这样发送命令和参数

column_addr=5000%512;

page_address=(5000>>9);

NF_CMD=0x01; 从2nd half 开始读取

NF_ADDR= column_addr &0xff; 1st Cycle

NF_ADDR=page_address&0xff; 2nd.Cycle

NF_ADDR=(page_address>>8)&0xff; 3rd.Cycle

NF_ADDR=(page_address>>16)&0xff; 4th.Cycle

向NandFlash的命令寄存器和地址寄存器发送完以上命令和参数之后,我们就可以从rNFDATA寄存器(NandFlash数据寄存器)读取数据了.

我用下面的代码进行数据的读取.

for(i=column_addr;i<512;i++)

{

*buf++=NF_RDDA TA();

}

每当读取完一个Page之后,数据指针会落在下一个Page的0号Column(0号Byte).

Fisrt part :

NAND flash和NOR flash的不同

NOR flash采用位读写,因为它具有sram的接口,有足够的引脚来寻址,可以很容易的存取其内部的每一个字节。NAND flash使用复杂的I/O口来穿行地存取数据。8个引脚用来传送控制、地址和数据信息。NAND的读和写单位为512Byte 的页,擦写单位为32页的块。

●NOR的读速度比NAND稍快一些。

●NAND的写入速度比NOR快很多。

●NAND的4ms擦除速度远比NOR的5s快。

●大多数写入操作需要先进行擦除操作。

●NAND的擦除单元更小,相应的擦除电路更少。

在NOR器件上运行代码不需要任何的软件支持,在NAND器件上进行同样操作时,通常需要驱动程序,也就是内存技术驱动程序(MTD),NAND和NOR器件在进行写入和擦除操作时都需要MTD。

---------摘抄自网上流传很广的《NAND 和NOR flash的区别》

Second part:

NAND Flash结构与驱动分析

一、NAND flash的物理组成

NAND Flash 的数据是以bit的方式保存在memory cell,一般来说,一个cell 中只能存储一个bit。这些cell 以8个或者16个为单位,连成bit line,形成所谓的byte(x8)/word(x16),这就是NAND Device的位宽。这些Line会再组成Page,(NAND Flash 有多种结构,我使用的NAND Flash 是K9F1208,下面内容针对三星的K9F1208U0M),每页528Bytes(512byte(Main Area)+16byte(Spare Area)),每32个page形成一个Block(32*528B)。具体一片flash上有多少个Block视需要所定。我所使用的三星k9f1208U0M具有4096个block,故总容量为4096*(32*528B)=66MB,但是其中的2MB是用来保存ECC校验码等额外数据的,故实际中可使用的为64MB。

NAND flash以页为单位读写数据,而以块为单位擦除数据。按照这样的组织方式可以形成所谓的三类地址:

Column Address:Starting Address of the Register. 翻成中文为列地址,地址的低8位

Page Address :页地址

Block Address :块地址

对于NAND Flash来讲,地址和命令只能在I/O[7:0]上传递,数据宽度是8位。

二、NAND Flash地址的表示

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 的使用方法完全相同。

三、NAND flash驱动解读

以前由于做移植多一些,那些工作很简单(现在看来),从来都不用去关心驱动里面到底怎么实现的,这几次面试才发现真的是学的太浅了,似乎我还在学习仰泳而那些牛人基本都属于潜水级的了,潜的不知有多深。我对照着开发板所带的NAND flash驱动和k9f1208的芯片资料把这些代码通读了一遍,终于明白了NAND flash的读写过程是如何实现的了。我所参考的驱动是mizi公司为三星芯片所写的,我看看了,大概和官方2.4.18内核的nand.c差不多。

在s3c2410处理器中有专门的NAND flash控制器,他们位于SFR区,具体可以参看s3c2410用户手册。以下的这些代码均可以在vivi或者kernel里面找到,文中会标明程序出自何处。在vivi中,有关NAND flash的驱动都在driver/mtd/nand/下,该目录中包含的源文件:smc_core.c是NAND flash的主要驱动。

NAND flash 芯片定义了一个很长的结构,这个结构中包含了操作NAND flash 的函数和一些必要的变量(include/mtd/nand.h)。

struct nand_chip {

#ifdef CONFIG_MTD_NANDY /* =y */

void (*hwcontrol)(int cmd);

void (*write_cmd)(u_char val);

void (*write_addr)(u_char val);

u_char (*read_data)(void);

void (*write_data)(u_char val);

void (*wait_for_ready)(void);

int page_shift;

u_char *data_buf;

u_char *data_cache;

int cache_page;

struct nand_smc_dev *dev;

u_char spare[SMC_OOB_SIZE];

#else /* CONFIG_MTD_NANDY */

……

#ifdef CONFIG_MTD_NAND_ECC

u_char ecc_code_buf[6];

u_char reserved[2];

#endif

#endif /* CONFIG_MTD_NANDY */

};

纵观对NAND flash的各种操作(read、write、erase),无外乎如下几种操作:1〃选择flash nand_select()

2〃发送命令nand_command()

3〃进行相应操作read,write……

4〃反选NAND flash nand_deselect()

下面是以上四步的实现代码:

1、选择NAND flash

#define nand_select() this->hwcontrol(NAND_CTL_SETNCE); \

nand_command(mtd, NAND_CMD_RESET, -1, -1); \

udelay (10);

hwcontrol(NAND_CTL_SETNCE)的作用是设置2410的NAND FLASH CONFIGURA TION (NFCONF) REGISTER的NAND Flash Memory chip enable位为0,这位寄存器在自动重启后就被系统自动清零。如果要访问NAND flash的内存,这位必须置1。

nand_command(mtd, NAND_CMD_RESET, -1, -1);向flash发送命令,此命令为reset,即为重置NAND flash。

然后是10us的延迟,给flash个反应时间。

2、发送命令

Nand_command()同样在smc_core.c中实现。NAND flash的命令有如下几种:

命令命令值描述

NAND_CMD_READ0 0 读操作

NAND_CMD_READ1 1 读操作

NAND_CMD_PAGEPROG 0x10 页编程操作NAND_CMD_READOOB 0x50 读写OOB NAND_CMD_ERASE1 0x60 读写操作

NAND_CMD_STATUS 0x70 读取状态NAND_CMD_STATUS_MULTI 0x71 读取状态NAND_CMD_SEQIN 0x80 写操作

NAND_CMD_READID 0x90 读Flash ID号NAND_CMD_ERASE2 0xd0 擦写操作

NAND_CMD_RESET oxff 复位操作

按照程序的注释,可以将该函数的实现分为如下几步:

1、Begin command latch cycle

实现代码:

this->hwcontrol(NAND_CTL_SETCLE);

this->hwcontrol(NAND_CTL_DA T_OUT);

找到第二条语句的定义,发现什么都么做,不解!!希望达人解答。我猜想可能是一个数据读出的使能操作,允许数据读出。

Command Latch Enable(CLE) and Address Latch Enable(ALE) are used to multiplex command and address respectively, via the I/O pins. The CLE input controls the path activation for commands sent to the command register. When active high, commands are latched into the command register through the I/O ports on the rising edge of the nWE signal. 看了这段英文相信对第一条语句的作用已经十分清楚了,他就是用来控制向命令寄存(COMMAND SET (NFCMD) REGISTER)发送命令的。

2、Write out the command to the device

这部分对于不同的命令来说,操作的步骤也不太相同,如果为写操作,那么还有根据flash不同的容量决定操作步骤,具体可以参看代码。如果为其他命令,那么就是简单的一行:

this->write_cmd (command);

将命令直接想到命令寄存器(NFCMD[7:0])中。

3、Set ALE and clear CLE to start address cycle & Serially input address

1中已经提到了ALE和CLE的作用,现在开始发送地址。

实现代码:

this->hwcontrol(NAND_CTL_CLRCLE); // clear the command latch enable

this->hwcontrol(NAND_CTL_SETALE); // set the address latch enable

然后按位操作,是用函数write_addr()将地址写到NAND FLASH ADDRESS SET (NFADDR) REGISTER中。

4、Latch in address

实现代码:

this->hwcontrol(NAND_CTL_CLRALE);

this->hwcontrol(NAND_CTL_DA T_IN);

地址发送完毕,清楚ALE。

5、Pause for 15us

我使用的VIVI中,使用udelay (15)延时15us,但这个时间会因NAND Flash的不同而不同。

三、Operation

根据函数的不同,操作部分会不一样,但是主要的是对NAND FLASH DATA (NFDATA) REGISTER的操作,或写(编程)或者读。通过读或写函数的参数来返回或传递读出的值或写入的值。写得操作通常比较麻烦,他要将写到flash的内容重新读出后进行ECC校验,如果数据正确则在重新真正的写(编程),如果错误,则将数据写入flash的另一个块。读和写都是以页为单位进行操作。而擦除则以块为单位,三个周期发送完地址。擦除完毕后同样需要进行检察以确定是否擦除成功。

四、De-select the NAND device

实现代码:

#define nand_deselect() this->hwcontrol(NAND_CTL_CLRNCE);

反选flash吧,不知这样叫正确与否,跟select the NAND device相反,亦即使用完后将使能flash位清0,代码是NFCONF位于0x4e00_0000的位置(NFCONF |= NFCONF_nFCE_HIGH;),有兴趣的可以读读代码,看看这是怎么实现的,我的感觉就是关于寄存器的清置读起来都比较晕。

好了,到此flash操作的框架基本完成。

本文来自:我爱研发网(https://www.360docs.net/doc/ac17132577.html,) - R&D大本营

详细出处:

https://www.360docs.net/doc/ac17132577.html,/Blog/Detail_RD.Blog_gebi1218_20186.html?#Flag_Comment

NandFlash简介

NandFlash简介 分类:Linux2013-03-06 14:34 2945人阅读评论(0) 收藏举报 Flash Memory中文名字叫闪存,是一种长寿命的非易失性(在断电情况下仍能保持所存储的数据信息)的存储器。 从名字中就可以看出,非易失性就是不容易丢失,数据存储在这类设备中,即使断电了,也不会丢失,这类设备,除了Flash,还有其他比较常见的入硬盘,ROM等,与此相对的,易失性就是断电了,数据就丢失了,比如大家常用的内存,不论是以前的SDRAM,DDR SDRAM,还是现在的DDR2,DDR3等,都是断电后,数据就没了。 FLASH的分类:功能特性分为两种:一种是NOR型闪存,以编码应用为主,其功能多与运算相关;另一种为NAND型闪存,主要功能是存储资料,如数码相机中所用的记忆卡。 NOR FLASH和NAND FLASH NOR和NAND是现在市场上两种主要的非易失闪存技术。Intel于1988年首先开发出NOR flash技术,彻底改变了原先由EPROM和EEPROM 一统天下的局面。紧接着,1989年,东芝公司发表了NAND flash结结,强调降低每比特的成本,更高的性能,并且象磁盘一样可以通过接口轻松升级。但是经过了十多年之后,仍然有相当多的硬件工程师分不清NOR和NAND闪存。 NOR的读速度比NAND稍快一些。 NAND的写入速度比NOR快很多。 NAND的4ms擦除速度远比NOR的5s快。 大多数写入操作需要先进行擦除操作。 NAND的擦除单元更小,相应的擦除电路更少 在NOR Flash中, 所有的存储区域都保证是完好的, 同时也拥有相同的耐久性。在硬模中专门制成了一个相当容量的扩展存储单元—他们被用来修补存储阵列中那些坏的部分,这也是为了保证生产出来的产品全部拥有完好的存储区域。为了增加产量和降低生产成本, NAND Flash 器件中存在一些随机bad block 。为了防止数据存储到这些坏的单元中, bad block 在IC烧录前必须先识别。在一些出版物中, 有人称bad block 为“bad block”, 也有人称bad block 为“invalid block”。其实他们拥有相同的含义, 指相同的东西。 从实际的应用上来说, NOR Flash与NAND Flash主要的区别在于接口。NOR Flash拥有完整的存取-映射访问接口, 它拥有专门的地址线和数据线, 类似与EPROM。然而在NAND Flash中没有专门的地址线。它发送指令,地址和数据都通过8/16位宽的总线(I/O接口)到内部的寄存器。 SLC/MLC基本原理

海力士NANDFlash选型

Q1’2011 DATABOOK Rev 0.1

NAND Flash –SLC / MLC / TLC AND Flash N NAND Flash SLC COMPONENT Product Tech Density Block Size Stack Vcc/Org Package Availability Remark HY27US08281A 90nm 128Mb 16KB Mono 3.3v/X8TSOP/USOP Now HY27US08561A 90nm 256Mb 16KB Mono 3.3v/X8TSOP/USOP/FBGA Now HY27US08121B 70nm 512Mb 16KB Mono 3.3v/X8TSOP/USOP/FBGA Now H27U518S2C 57nm 512Mb 16KB Mono 3.3v/X8TSOP Now HY27US081G1M 70nm 1Gb 16KB Mono 3.3v/X8USOP Now HY27UF081G2A 70nm 1Gb 128KB Mono 3.3v/X8TSOP/USOP/FBGA Now HY27US081G2A 70nm 1Gb 128KB Mono 1.8v/X8FBGA Now H27U1G8F2B 48nm 1Gb 128KB Mono 3.3v/X8TSOP,FBGA Now H27U1G8F2B 48nm 1Gb 128KB Mono 1.8v/X8FBGA Now H27U1G8F2CTR 32nm 1Gb 128KB Mono 1.8v/X8TSOP Q4 '11H27U1G8F2CFR 32nm 1Gb 128KB Mono 1.8v/X8FBGA Q4 '11HY27UF082G2B 57nm 2Gb 128KB Mono 3.3v/X8TSOP,FBGA, LGA Now H27U2G8F2C 41nm 2Gb 128KB Mono 3.3v/X8TSOP Now HY27UF084G2B 57nm 4Gb 128KB Mono 3.3v/X8TSOP Now H27U4G8F2D 41nm 4Gb 128KB Mono 3.3v/X8TSOP Now HY27UG088G5(D)B 57nm 8Gb 128KB DDP 3.3v/X8TSOP Now 2CE/Dual CH.H27U8G8G5D 41nm 8Gb 128KB Mono 3.3v/X8TSOP Now H27QBG8GDAIR-BCB 32nm 32Gb 512KB DDP 1.8v/x8VFBGA Now 2CE/Dual CH.H27QCG8HEAIR-BCB 32nm 64Gb 512KB QDP 1.8v/x8VFBGA Now 4CE/Dual CH.H27QDG8JEAJR-BCB 32nm 128Gb 512KB ODP 1.8v/x8 JFBGA Feb. '11 4CE/Dual CH.NAND Flash MLC COMPONENT Product Tech Density Block Size Stack Vcc/Org Package Availability Remark H27U8G8T2B 48nm 8Gb 512KB Mono 3.3v/X8TSOP Now H27UAG8T2M 48nm 16Gb 512KB(4KB Page)Mono 3.3v/X8TSOP/VLGA Now H27UAG8T2A 41nm 16Gb 512KB(4KB Page)Mono 3.3v/X8TSOP Now H27UBG8U5A 41nm 32Gb 512KB(4KB Page)DDP 3.3v/X8TSOP Now H27UBG8T2M 41nm 32Gb 512KB(4KB Page)Mono 3.3v/X8VLGA Now H27UBG8T2A 32nm 32Gb 2MB(8KB Page)SDP 3.3v/x8TSOP / VLGA Now H27UCG8VFA 41nm 64Gb 512KB(4KB Page)QDP 3.3v/X8TSOP Now H27UCG8UDM 41nm 64Gb 512KB(4KB Page)DDP 3.3v/X8VLGA Now Dual CH.H27UCG8U5(D)A 32nm 64Gb 2MB(8KB Page)DDP 3.3v/x8TSOP / VLGA Now Dual CH. LGA H27UCG8T2M 26nm 64Gb 2MB(8KB Page)SDP 3.3v/x8VLGA Now H27UDG8VEM 41nm 128Gb 512KB(4KB Page)QDP 3.3v/X8VLGA Now 4CE,Dual CH.H27UDG8V5(E)A 32nm 128Gb 2MB(8KB Page)QDP 3.3v/x8TSOP / VLGA Now 4CE,Dual CH.H27UEG8YEA 32nm 256Gb 2MB(8KB Page)ODP 3.3v/x8VLGA Now 4CE,Dual CH.H27UAG8T2B 32nm 16Gb 2MB(8KB Page)SDP 3.3v/x8TSOP Now H27UBG8T2B 26nm 32Gb 2MB(8KB Page)SDP 3.3v/x8TSOP Now Legacy H27UCG8U2B 26nm 64Gb 2MB(8KB Page)DDP 3.3v/x8TSOP Jan. '11Legacy H27UDG8V2B 26nm 128Gb 2MB(8KB Page)QDP 3.3v/x8FBGA-100Feb. '11HS(ONFi2.2)H27UEG8Y2B 26nm 256Gb 2MB(8KB Page) ODP 3.3v/x8 FBGA-100 Mar. '11 HS(ONFi2.2)NAND Flash TLC COMPONENT Product Tech Density Block Size Stack Vcc/Org Package Availability Remark H27UAG8M2M 41nm 16Gb 768KB (4KB page)SDP 3.3V/x8VLGA Now H27UBG8M2A 32nm 32Gb 1MB (4KB page) SDP 3.3V/x8 VLGA Now

NandFlash的基础知识

NAND FLASH的基础知识 NAND Flash 的数据是以bit 的方式保存在memory cell,一般来说,一个cell 中只能存储一个bit。这些cell 以8 个或者16 个为单位,连成bit line,形成所谓的byte(x8)/word(x16),这就是NAND Device 的位宽。这些Line 会再组成Page,(Nand Flash 有多种结构,我使用的Nand Flash 是K9F1208,下面内容针对三星的K9F1208U0M),每页528Byte,每32 个page 形成一个Block, Sizeof(block)=16kByte = 32 page = 32 * 528 byte Numberof(block)=64Mbyte/16kbyte=4096 1page=528byte=512byte(Main Area)+16byte(Spare Area) Nand flash 以页为单位读写数据,而以块为单位擦除数据。按照这样的组织方式可以形成所谓的三类地址: --Block Address -- Page Address --Column Address 对于NAND Flash 来讲,地址和命令只能在I/O[7:0]上传递,数据宽度是8 位。 512byte需要9bit来表示,对于528byte系列的NAND,这512byte被分成1st half和2nd half,各自的访问由地址指针命令来选择,A[7:0]就是所谓的column address。32 个page 需要5bit 来表示,占用A[13:9],即该page 在块内的相对地址。Block的地址是由A14 以上的bit 来表示,例如512Mbit的NAND,共4096block,因此,需要12 个bit 来表示,即A[25:14],如果是1Gbit 的528byte/page的NAND Flash,则block address用A[26:24]表示。而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 即bit8 是由操作指令决定的,即指令决定在哪个halfpage 上进行读写。而真正的bit8 的值是don't care 的。 ◆第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 的容量是256Mbit 以下,那么,block adress 最高位只到bit24,因此寻址只需要3 步。下面,就x16 的NAND flash 器件稍微进行一下说明。由于一个page 的main area 的容量为256word,仍相当于512byte。但是,这个时候没有所谓的1st halfpage 和2nd halfpage 之分了,所以,bit8就变得没有意义了,也就是这个时候bit8 完全不用管,地址传递仍然和x8 器件相同。除了,这一点之外,x16 的NAND使用方法和x8 的使用方法完全相同。 正如硬盘的盘片被分为磁道,每个磁道又分为若干扇区,一块nand flash也分为若干block,每个block分为如干page。一般而言,block、page之间的关系随着芯片的不同而不同,典型的分配是这样的

Nand Flash存储结构及控制方法

Nand Flash存储结构及控制方法(K9F1G08) 2011-02-26 15:05:59| 分类:默认分类 | 标签: mini2440nandflash k9f1g08 |字号订阅 一、NAND Flash介绍和NAND Flash控制器的使用 NAND Flash在嵌入式系统中的作用,相当于PC上的硬盘 常见的Flash有NOR Flash和NAND Flash,NOR Flash上进行读取的效率非常高,但是擦除和写操作的效率很低,容量一般比较小;NAND Flash进行擦除和写操作的效率更高,并且容量更大。一般NOR Flash用于存储程序,NAND Flash 用于存储数据。 1)NAND Flash的物理结构 笔者用的开发板上NAND Flash型号是K9F1G08,大小为128M,下图为它的封装和外部引脚 I/O0-I/O7 数据输入/输出 CLE 命令锁存使能 ALE 地址锁存使能 CE 芯片使能 RE 读使能 WE 写使能 WP 写保护 R/B 就绪/忙输出信号 Vcc 电源 Vss 地 N.C 不接 K9F1G08功能结构图如下

K9F1G08内部结构有下面一些功能部件 ①X-Buffers Latches & Decoders:用于行地址 ②Y-Buffers Latches & Decoders:用于列地址 ③Command Register:用于命令字 ④Control Logic & High Voltage Generator:控制逻辑及产生Flash所需高压 ⑤Nand Flash Array:存储部件 ⑥Data Register & S/A:数据寄存器,读、写页时,数据存放此寄存器 ⑦Y-Gating ⑧I/O Buffers & Latches ⑨Global Buffers ⑩Output Driver

NANDFLASH 常见问题汇总

NAND flash常见问题汇总 掉程序(这里专指使用NAND flash的主板掉程序),这是一个让工程师浑身发毛的问题,特别是用着用着程序就没有了,往往这个时候很多工程师都无法下手,问题出现的时候你可能根本不在旁边,无法看到问题现象,而且通过测量信号也很难发现问题的原因,这个时候很多工程师可能会采用更换主板器件的方式,用排除法来定位问题,基本上换一个NAND flash就可以解决问题了。这个时候很多工程师可能就会表示NAND flash有问题,需要换厂商,换品牌。但其实还可以更加深入的去了解问题的原因,这里我总结一下我遇到过得NAND flash掉程序的情况及原因。 1.电源电压不稳导致的NAND flash程序错误 很多时候,产品在客户手中出现了问题,工程师把产品拿回来,重新烧录程序产品可以上电启动,反复测试并不会出现掉程序的情况。如果这种产品是带有电池的产品,就可以考虑一下是否在客户实际使用中是用电池的情况,当电池的电量比较低,或者在极端情况下,程序对于电池电量的检测阈值较低,这个时候主控就有可能刚刚可以启动,但是很快电量不够,NAND flash内的程序乱掉,从而无法正常启动。 解决方法可以在程序中加入或者提高电池电量检测的阈值,保证所有芯片在这个阈值上均可以正常工作。 2.DRAM工作状态不正常导致的NAND flash程序错误 主控, DRAM和NAND flash基本构成了一个产品的最小系统。当系统中的任何一环出现问题,整个系统就可能出现问题。但是当DRAM出现问题时,有可能反映出来的是NAND flash 出错,掉程序或者查明NAND flash坏块过多。对于这种情况,处理起来就会复杂一些。如果直接重新烧录程序,系统又能正常工作,则说明之前存储在NAND flash中的程序确实乱了,但是NAND flash的功能正常,特别是SLC规格的1bit ECC 的NAND flash,出错概率非常小。因为对于NAND flash来说,只有当写数据或者擦除数据时,数据可能产生坏块,当程序只是读取的状态时,由于不涉及电荷的改变,所以NAND flash一般不会出现问题。但从程序的调试端口读到NAND flash坏块很多时,看是否有更深入的调试工具,例如JTAG等调试工具,可以深入调试NAND flash的情况。有些时候,因为一些程序误操作,导致将原本good block的标志位标记成了bad block。用过JTAG调试工具可以修改标志位,并且重新打标,重新烧录一遍程序,有可能主板又能重新启动了。 3.坏块管理未做好 因为NAND flash都面临着可能出现坏块的问题,所以必须应该对于坏块进行管理,在规格书中可以看到,坏块产生的三种情况,在编程的时候,在擦出的时候,在读取的时候。对于这几种情况下,程序应该怎么操作,规格书中也有流程图来说明,在读取和擦除中,如果出现失败情况,就需要重新坏一个块进行目标块的转移,并且对于当前块进行标识,在坏块表中进行更新。通过对于坏块表的维护,达到程序避免写入坏块中的情况。在读取程序时,也需要对于ECC进行校验,保证读取的程度是真实可靠的。但是很多工程师可能由于对于坏块管理做的不够仔细,导致产品在实际使用中,会出现掉程序的问题。工程师也应该从程序方面着手,分析一下程序对于坏块部分管理是否完善。 从上面三种类型只是部分说明了关于掉程序这个问题的一些原因。特别是对于1bit ECC 的SLC NAND flash大部分适用,工程师们可以进行参考。

nandflash时序

三星系列的NAND FLASH芯片容量从8MB到256MB(最近听说有1G容量的了),对于需要大容量数据存储的嵌入式系统是一个很好的选择,尤其是其接近1MB/元的高性价比,更是普通nor flash 无法比拟的。本文以K9F2808U0C为例,采用AVR芯片连接,进行了初步的读写试验,完成了芯片的ID读出功能。 电路连接如下图: 左边是所使用的AVR芯片ATmega16L的局部电路,右边是K9F2808芯片的连接图,数据/地址总线使用ATmega16的PORTB端口连接,其它全部所需信号线使用IO连接,组成了IO模拟方式。 K9F2808芯片的全部命令字如下: 其中,Read1读取的是普通数据存储区域的数据,Read2读取的是每页存储器附加的16Bytes区域的数据;Page Program可以编程一页最大528Bytes的数据,Block Erase擦除指定页面数据,Read Status可以读取芯片状态。 芯片的整个读写时序可以分解为4个基本步骤,即1、命令写入,2、数据写入,3、数据读出,4、地址写入。 1、命令写入时序如下:

对应函数为: void WriteCmd(unsigned char cmd) { nandPortD = 0xFF; ClsLine(nandSPortO,nandALE); ClsLine(nandSPortO,nandnCE); SetLine(nandSPortO,nandCLE); ClsLine(nandSPortO,nandnWE); nandPortO = cmd; SetLine(nandSPortO,nandnWE); ClsLine(nandSPortO,nandCLE); SetLine(nandSPortO,nandALE); } 2、数据写入时序如下: 对应函数为:

Nand Flash的读写操作

NandFlash的读写操作 正如硬盘的盘片被分为磁道,每个磁道又分为若干扇区,一块nand flash也分为若干block,每个block分为如干page。一般而言,block、page之间的关系随着芯片的不同而不同,典型的分配是这样的: 1block = 32page 1 page = 512bytes(datafield) + 16bytes(oob) 需要注意的是,对于flash的读写都是以一个page开始的,但是在读写之前必须进行flash 的擦写,而擦写则是以一个block为单位的。同时必须提醒的是,512bytes理论上被分为1st half 和2sd half,每个half各占256个字节。 我们讨论的K9F1208U0B总共有4096 个Blocks,故我们可以知道这块flash的容量为4096 *(32 *528)= 69206016 Bytes = 66 MB 但事实上每个Page上的最后16Bytes是用于存贮检验码和其他信息用的,并不能存放实际的数据,所以实际上我们可以操作的芯片容量为4096 *(32 *512) = 67108864 Bytes = 64 MB 由上图所示,1个Page总共由528 Bytes组成,这528个字节按顺序由上而下以列为单位进行排列(1列代表一个Byte。第0行为第0 Byte ,第1行为第1 Byte,以此类推,每个行又由8个位组成,每个位表示1个Byte里面的1bit)。这528Bytes按功能分为两大部分,分别是Data Field和Spare Field,其中Spare Field占528Bytes里的16Bytes,这16Bytes是用于在读写操作的时候存放校验码用的,一般不用做普通数据的存储区,除去这16Bytes,剩下的512Bytes便是我们用于存放数据用的Data Field,所以一个Page上虽然有528个Bytes,

NAND flash详解

NAND flash和NOR flash的区别详解 [导读]我们使用的智能手机除了有一个可用的空间(如苹果8G、16G等),还有一个RAM容量,很多人都 不是很清楚,为什么需要二个这样的芯片做存储呢,这就是我们下面要讲到的这二种存储. 关键词:NOR flashNand flashFlaSh 我们使用的智能手机除了有一个可用的空间(如苹果8G、16G等),还有一个RAM容量,很多人都不是很清楚,为什么需要二个这样的芯片做存储呢,这就是我们下面要讲到的。这二种存储设备我们都统称为“FLASH”,FLASH是一种存储芯片,全名叫Flash EEPROM Memory,通地过程序可以修改数据,即平时所 说的“闪存”。Flash又分为NAND flash和NOR flash二种。U盘和MP3里用的就是这种存储器。 相“flash存储器”经常可以与相“NOR存储器”互换使用。许多业内人士也搞不清楚NAND闪存技术相对于NOR技术的优越之处,因为大多数情况下闪存只是用来存储少量的代码,这时NOR闪存更适合一些。而NAND则是高数据存储密度的理想解决方案。NOR Flash 的读取和我们常见的 SDRAM 的读取是一样,用户 可以直接运行装载在 NOR FLASH 里面的代码,这样可以减少 SRAM 的容量从而节约了成本。 NAND Flash 没有采取内存的随机读取技术,它的读取是以一次读取一块的形式来进行的,通常是一次读取 512 个字节, 采用这种技术的 Flash 比较廉价。用户不能直接运行 NAND Flash 上的代码,因此好多使用 NAND Flash 的 开发板除了使用 NAND Flah以外,还作上了一块小的 NOR Flash 来运行启动代码。 NOR flash是intel公司1988年开发出了NOR flash技术。NOR的特点是芯片内执行(XIP, eXecute In Place),这样应用程序可以直接在flash 闪存内运行,不必再把代码读到系统RAM中。NOR的传输效率很高,在1~4MB的小容量时具有很高的成本效益,但是很低的写入和擦除速度大大影响了它的性能。 Nand-flash内存是flash内存的一种,1989年,东芝公司发表了NAND flash结构。其内部采用非线性宏单元 模式,为固态大容量内存的实现提供了廉价有效的解决方案。Nand-flash存储器具有容量较大,改写速度快 等优点,适用于大量数据的存储,因而在业界得到了越来越广泛的应用,如嵌入式产品中包括数码相机、

nandflash命名规则大全(三星,海力士,美光)

NAND Flash Code Information(1/3)
Last Updated : August 2009
K9XXXXXXXX - XXXXXXX
1
1. Memory (K) 2. NAND Flash : 9 3. Small Classification (SLC : Single Level Cell, MLC : Multi Level Cell, SM : SmartMedia, S/B : Small Block) 1 : SLC 1 Chip XD Card 2 : SLC 2 Chip XD Card 3 : 4bit MLC Mono 4 : SLC 4 Chip XD Card 5 : MLC 1 Chip XD Card 6 : MLC 2 Chip XD Card 7 : SLC moviNAND 8 : MLC moviNAND 9 : 4bit MLC ODP A : 3bit MLC MONO B : 3bit MLC DDP C : 3bit MLC QDP F : SLC Normal G : MLC Normal H : MLC QDP K : SLC Die Stack L : MLC DDP M : MLC DSP N : SLC DSP O : 3bit MLC ODP P : MLC ODP Q : SLC ODP R : MLC 12-die stack S : MLC 6 Die Stack T : SLC SINGLE (S/B) U : MLC 16 Die Stack W : SLC 4 Die Stack 4~5. Density 12 : 512M 32 : 32M 64 : 64M 2G : 2G AG : 16G DG : 128G GG : 384G NG : 96G
2
3
4
5
6
7
8
9 10 11 12 13 14 15 16 17 18
6. Technology 0 : Normal (x8) C : Catridge SIP M : moviNAND P : moviMCP Z : SSD 7. Organization 0 : NONE 6 : x16
1 : Normal (x16) D : DDR N : moviNAND FAB T : Premium eSSD
8 : x8
8. Vcc A : 1.65V~3.6V B : 2.7V (2.5V~2.9V) C : 5.0V (4.5V~5.5V) D : 2.65V (2.4V ~ 2.9V) E : 2.3V~3.6V R : 1.8V (1.65V~1.95V) Q : 1.8V (1.7V ~ 1.95V) T : 2.4V~3.0V S : 3.3V (3V~3.6V/ VccQ1.8V (1.65V~1.95V) U : 2.7V~3.6V V : 3.3V (3.0V~3.6V) W : 2.7V~5.5V, 3.0V~5.5V 0 : NONE 9. Mode 0 : Normal 1 : Dual nCE & Dual R/nB 3 : Tri /CE & Tri R/B 4 : Quad nCE & Single R/nB 5 : Quad nCE & Quad R/nB 6 : 6 nCE & 2 RnB 7 : 8 nCE & 4 RnB 8 : 8 nCE & 2 RnB 9 : 1st block OTP A : Mask Option 1 L : Low grade 10. Generation M : 1st Generation A : 2nd Generation B : 3rd Generation C : 4th Generation D : 5th Generation E : 6th Generation Y : 25th Generation Z : 26th Generation
16 : 16M 40 : 4M 80 : 8M 4G : 4G BG : 32G EG : 256G HG : 512G ZG : 48G
28 : 128M 56 : 256M 1G : 1G 8G : 8G CG : 64G FG : 256G LG : 24G 00 : NONE
-1-
Part Number Decoder

NandFlash的规范程序代码

nandflash裸机驱动程序的分析 nandflash在嵌入式设备中广泛的应用,学些nandflash的重要性不言而喻,这里分析一段实例代码,不管是编码规范还是程序的结构都是很有价值的。下边是K9F1208U0M的实例代码。 首先看nand.h文件: #ifndef __NAND_Flash__ #define __NAND_Flash__ extern void InitNandCfg(void); //初始化K9F1208UOM NAND flash 配置extern unsigned int ReadChipId(void); //读取NAND Flash的ID号extern unsigned short ReadStatus(void); //读取NAND Flash的状态extern unsigned int EraseBlock(unsigned int addr); //NAND Flash块擦除extern void ReadPage(unsigned int addr, unsigned char *buf); //K9F1208U0M nand flash 的页数据读 extern void WritePage(unsigned int addr, unsigned char *buf); //K9F1208U0M nand flash 的页数据写 extern void MarkBadBlk(unsigned int addr); //屏蔽K9F1208U0M nand flash 的坏块 extern int CheckBadBlk(unsigned int addr); //检查K9F1208U0M nand flash 的坏块 extern void InitNandFlash(void); //K9F1208U0M nand flash 的初始化 #endif 需要详细看的是nandflash.c文件: //==================================================== // 常量定义区 //==================================================== #define EnNandFlash() (rNFCONF |= 0x8000) //bit15=1 enable NAND flash controller #define DsNandFlash() (rNFCONF &= ~0x8000) //bit15=1 disable NAND flash controller #define InitEcc() (rNFCONF |= 0x1000) //bit12=1 initialize ECC #define NoEcc() (rNFCONF &= ~0x1000) //bit12=0 initialize ECC #define NFChipEn() (rNFCONF &= ~0x800) //bit11=0 NAND flash nFCE = L (active) #define NFChipDs() (rNFCONF |= 0x800) //bit11=1 NAND flash nFCE = H (inactive) #define WrNFCmd(cmd) (rNFCMD = (cmd)) //write commond to nand flash #define WrNFAddr(addr) (rNFADDR = (addr)) //write address to nand flash #define WrNFDat(dat) (rNFDATA = (dat)) //write data to nand flash #define RdNFDat() (rNFDATA) //read data from nand flash #define RdNFStat() (rNFSTAT) //read status from nand flash

NandFLash分析与总结

友善之臂K9F1208U0C PCB0 4-5位,12代表512M位,也就是64M字节 熟悉一下NandFlash的硬件: 1主要的引脚: I/O0 —I/O7:数据输入输出端,命令,数据,地址复用端口(LDATA0-LDATA7)R/B: 准备忙输出(RnB) CE:芯片使能(nFCE) CLE: 命令锁存使能(CLE) ALE:地址锁存使能(ALE) WE:写使能(nFWE) RE:读使能(nFRE)

2Mini2440的一些引脚设置:和寄存器设置: (NCON(Advflash), GPG13(页大小), GPG14(地址周期), GPG15(总线宽度)–参考引脚配置)

#define rGSTATUS0 (*(volatile unsigned *)0x560000ac) //External pin status 3NandFlash启动时,代码小于4k与大于4k的情况: 在三星的NAND Flash 中,当CPU从NAND Flash开始启动时,CPU会通过

内部的硬件将NAND Flash开始的4KB数据复制到称为“Steppingstone”的4KB 的内部RAM中,起始地址为0,然后跳到地址0处开始执行。这也就是我们为什么可以把小于4KB的程序烧到NAND Flash中,可以运行,而当大于4KB时,却没有办法运行,必须借助于NAND Flash的读操作,读取4KB以后的程序到内存中。 4NandFlash的存储结构以及读写原理: 4.1NandFlash中的块,页,位宽: ●NAND Flash的数据是以bit的方式保存在memory cell(存储单元)一般情 况下,一个cell中只能存储一个bit。这些cell以8个或者16个为单位,连成bit line ,形成所谓的byte(x8)/word(x16),这就是NAND Flash的位宽。这些Line会再组成Pape(页)。然后是每32个page形成一个Block,所以一个Block(块)大小是16k.Block是NAND Flash中最大的操作单元。 ●1block = 32page 1page = 512bytes(datafield) + 16bytes(oob) ●K9F1208U0B总共有4096 个Blocks,故我们可以知道这块flash的容量为 4096 *(32 *528)= 69206016 Bytes = 66 MB 但事实上每个Page上的最后16Bytes是用于存贮检验码用的,并不能存放实际的数据,所以实际上我们可以操作的芯片容量为 4096 *(32 *512) = 67108864 Bytes = 64 MB ● 一页有528个字节,而在前512B中存放着用户的数据。在后面的16字节中(OOB)中存放着执行命令后的状态信息。主要是ECC校验的标识。列地址A0-A7可以寻址的范围是256个字节,要寻址528字节的话,将一页分为了A.(1half array)B(2 half array) C(spare array)。A区0—255字节,B区256-511 字节C区512—527字节。访问某页时必须选定特定的区。 这可以使地址指针指向特定的区实现。 4.2NandFlash存储操作特点: ●其中的擦除操作是以Block为单位进行擦除的,而读写和编程是以page为 单位进行操作的,并且读写之前必须进行flash的擦写。 ●OOB部分的第六字节(即517字节)标志是否坏块,如果不是坏块该值为 FF,否则为坏块 ●擦除操作的最小单位是块 ●Nand Flash芯片每一位只能从1变为0,而不能从0变为1,所以在对其进 行写入操作之前一定要将相应块擦除(擦除就是将相应块的位全部变为1 ●除OOB第六字节外,通常至少把OOB前3字节存放Nand Flash硬件ECC 码 4.3NandFlash读写操作原理: ●只能8个I/O引脚充当地址、数据、命令的复用端口,所以每次传地址只能 传8位 ●。这样就需要4个地址序列。因此读写一次nand flash需要传送4次(A[7:0] A[16:9] A[24:17] A[25])。 ●在NAND Flash 中存在三类地址,分别为Block Address 、Column Address

Nand Flash 介绍及高通nand flash驱动

Nand Flash 介绍及高通nand flash驱动 1. Nand Flash 相关概念 1.1 NOR flash与nand flash 1) Nor flash 写速度要比Nand flash 慢得多,Nor flash的读速度比Nand flash快得多。 2.)Nor flash 可以挂上CPU 芯片的地址线,不需要额外的sdram 就可直接在Nor flash 中直接运行,而Nand flash 需要代码搬运到Ram中运行,所以需要Boot loader,需要额外的sdram 的开销。 3)Nandflash需要做badblock检测和ecc校验;每个page中需有一块区域标识坏块信息,而 Nor flash 没有badblock 和ecc 校验的概念。 4)Nand flash最小的program单位为page,而Nor flash 可以对bit进行 1.2 什么是SLC和MLC SLC,Single Level Cell:单个存储单元,只存储一位数据,表示成1或0. 对于数据的表示,单个存储单元中内部所存储电荷的电压,和某个特定的阈值电压Vth,相比,如果大于此Vth值,就是表示1,反之,小于Vth,就表示0.

MLC,Multi Level Cell:与SLC相对应,就是单个存储单元,可以存储多个位,比如2位,4位等。其实现机制,就是,通过控制内部电荷的多少,分成多个阈值,通过控制里面的电荷多少,而达到我们所需要的存储成不同的数据。比如,假设输入电压是Vin=4V那么,可以设计出2的2次方=4个阈值, 1/4 的Vin=1V,2/4的Vin=2V,3/4的Vin=3V,Vin=4V,分别表示2位数据00,01,10,11。对于写入数据,就是充电,通过控制内部的电荷的多少,对应表示不同的数据。 另,nand flash: 页大小是512+16=528的称为small page 页大小是2048+64=2112的称为large page 1.3 Nand flash的组成结构 图2 Nand flash 物理存储单元的阵列组织结构 NAND Flash 的数据是以bit 的方式保存在memory cell,一般来说,一个cell 中只能存储一个bit。这些cell 以8 个或者16 个为单位,连成bit line,形成所谓的byte(x8)/word(x16),这就是NAND Device 的位宽。这些Line 会再组成Page。 如上图flash的结构,每个page包含2012Byte,每64 个page 形成一个Block, 8192个block形成整个flash。 page=2012Byte=2048(Main Area)+64byte(Spare Area) 2 .Nand flash 命令及寻址方式: Nand flash的操作,一般都用通用的命令。如下图表示nand flash操作的相关命令。

ONFI和toggle---nandflash的区别

闪存的接口协议介绍 首先,闪存是分为很多标准的。其中,以英特尔、美光、海力士为首的NAND厂商所主打制定的闪存接口标准为“ONFI”,而以三星和东芝阵营为首的NAND厂商当前所主打的则是“Toggle DDR”。 toggle是samsung和toshiba推的一个协议,用的技术也是DDR 技术,不过是全异步的方式,不像ONFI 2.X使用的是源同步的方式,所以toggle功耗比ONFI要低,而且速度也很快,跟ONFI不相上下吧。在toggle 2.0之后,ONFI 3.0也出台了,我看了一下,与toggle2.0方式很像了,也是异步的方式,感觉这两个标准有点融合的趋势。 Toshiba,Samsung等的NAND Flash Toggle协议与Intel,Micron 等的ONFI协议大部分都是一样的,不同点如下: 信号: Toggle同步模式下不用clock,写数据用DQS差分信号跳变沿触发,读数据用Host发的REN差分信号跳变沿发读request,DQS 跳变沿输出数据。 ONFI同步模式下有Clock,数据、命令、地址都要与Clock 同步。但是DQS,Clock都不是差分信号,所以边沿容易受干扰。ONFI 3.0里面有NV DDR2模式,就和Toggle一样了,不再用Clock,用DQS和REN差分信号。 闪存肯定很重要:那么现在我们就来谈谈目前市售SandForce SF-2281固态硬盘经常采用哪几种MLC NAND闪存颗粒。

英特尔25纳米ONFI 2.2标准的MLC NAND闪存 目前基于SandForce SF-2281主控固态硬盘多采用ONFI 2.2标准的闪存,其带宽达到166MT/s~200MT/s,并增加了“同步和异步”模式,简单来说,主控可以通过发送同步指令激活NAND闪存上的同步时钟信号,以工作在同步模式。从性能测试来看,工作在同步模式下的固态硬盘在持续性的读写操作上有着更好的性能表现,目前中高端SandForce SF-2281固态硬盘均使用的是同步时钟。

相关主题
相关文档
最新文档