关于nand flash的地址 A8,寻址
对NnF的基本操作

S3C2440对Nand Flash操作和电路原理——K9F2G08U0A S3C2440内部集成了一个Nand flash控制器.S3C2440的Nand flash控制器包含了如下的特性:l 一个引导启动单元l Nand Flash存储器接口,支持8位或16位的每页大小为256字,512字节,1K字和2K字节的Nand flashl 软件模式:用户可以直接访问Nand Flash存储器,此特性可以用于Nand Flash 存储器的读、擦除和编程.l S3C2440支持8/16位的Nand Flash存储器接口总线l 硬件ECC生成,检测和指示(软件纠错).l Steppingstone接口,支持大/小端模式的按字节/半字/字访问.我用的开发板是天嵌的TQ2440,板子用到的Nand Flash是Samsung公司的K9F2G08U0A,它是8位的Nand flash.本文只介绍Nand Flash的电路原理和Nand Flash的读、写、擦除等基本操作,暂不涉及Nand Flash启动程序的问题.Nand Flash的电路连接如图 1所示:图 1 Nand Flash电路原理上图的左边为K9F2G08U0A与2440的连接图,原理方面就不多介绍,去看看datasheet估计就懂得了,右边的部分是S3C2440的Nand控制器的配置.配置引脚NCON,GPG13,GPG14和GPG15用来设置Nand Flash的基本信息,Nand控制器通过读取配置引脚的状态获取外接的Nand Flash的配置信息,图 2是这四个配置引脚的定义:图 2 Nand控制配置引脚信息由于K9F2G08U0A的总线宽度为8位,页大小为2048字节,需要5个寻址命令,所以NCON、GPG13和GPG14应该接高电平,GPG15应该接低电平.K9F2G08U0A没有地址或数据总线,只有8个IO口,这8个IO口用于传输命令、地址和数据.K9F2G08U0A主要以page(页)为单位进行读写,以block(块)为单位进行擦除.每一页中又分为main区和spare区,main区用于正常数据的存储,spare区用于存储一些附加信息,如块好坏的标记、块的逻辑地址、页内数据的ECC校验和等.K9F2G08U0A的存储阵列如图 3所示:图 3K9F2G08U0A内部存储阵列由上图,我们可以知道:K9F2G08U0A的一页为(2K+64)字节(2K表示的是main区容量, 64表示的是spare区容量),它的一块为64页,而整个设备包括了2048个块.这样算下来一共有2112M位容量,如果只算main区容量则有256M字节(即256M×8位).图 4 K9F2G08U0A地址序列要实现用8个IO口来要访问这么大的容量,如图 4所示:K9F2G08U0A规定了用5个周期来实现.第一个周期访问的地址为A0~A7;第二个周期访问的地址为A8~A11,它作用在IO0~IO3上,而此时IO4~IO7必须为低电平;第三个周期访问的地址为A12~A19;第四个周期访问的地址为A20~A27;第五个周期访问的地址为A28,它作用在IO0上,而此时IO1~IO7必须为低电平.前两个周期传输的是列地址,后三个周期传输的是行地址.通过分析可知,列地址是用于寻址页内空间,行地址用于寻址页,如果要直接访问块,则需要从地址A18开始.由于所有的命令、地址和数据全部从8位IO口传输,所以Nand flash定义了一个命令集来完成各种操作.有的操作只需要一个命令(即一个周期)即可,而有的操作则需要两个命令(即两个周期)来实现.K9F2G08U0A的命令说明如图 5所示:图 5 K9F2G08U0A命令表为了方便使用,我们宏定义了K9F2G08U0A的常用命令define CMD_READ10x00 //页读命令周期1define CMD_READ20x30 //页读命令周期2define CMD_READID 0x90 //读ID命令define CMD_WRITE1 0x80 //页写命令周期1define CMD_WRITE2 0x10 //页写命令周期2define CMD_ERASE1 0x60 //块擦除命令周期1define CMD_ERASE2 0xd0 //块擦除命令周期2define CMD_STATUS0x70 //读状态命令define CMD_RESET0xff //复位define CMD_RANDOMREAD1 0x05 //随意读命令周期1define CMD_RANDOMREAD2 0xE0 //随意读命令周期2define CMD_RANDOMWRITE 0x85 //随意写命令接下来介绍几个Nand Flash控制器的寄存器.Nand Flash控制器的寄存器主要有NFCONF(Nand Flash配置寄存器),NFCONT (Nand Flash控制寄存器),NFCMMD(Nand Flash命令集寄存器),NFADDR(Nand Flash地址集寄存器),NFDATA(Nand Flash数据寄存器),NFMECCD0/1(Nand Flash的main区ECC寄存器),NFSECCD(Nand Flash的spare区ECC寄存器),NFSTAT(Nand Flash操作状态寄存器),NFESTAT0/1(Nand Flash的ECC状态寄存器),NFMECC0/1(Nand Flash用于数据的ECC寄存器),以及NFSECC(Nand Flash用于IO的ECC寄存器).(1)NFCONF:2440的NFCONF寄存器是用来设置NAND Flash的时序参数TACLS、TWRPH0、TWRPH1.配置寄存器的[3:0]是只读位,用来指示外部所接的Nand Flash的配置信息,它们是由配置引脚NCON,GPG13,GPG14和GPG15所决定的(比如说K9F2G08U0A的配置为NCON、GPG13和GPG14接高电平,GPG15接低电平,所以[3:0]位状态应该是1110).(2)NFCONT:用来使能/禁止NAND Flash控制器、使能/禁止控制引脚信号nFCE、初始化ECC.它还有其他功能,在一般的应用中用不到,比如锁定NAND Flash.(3)NFCMMD:对于不同型号的Flash,操作命令一般不一样.参考前面介绍的K9F2G08U0A命令序列.(4)NFADDR:当写这个寄存器时,它将对Flash发出地址信号.只用到低8位来传输,所以需要分次来写入一个完整的32位地址,K9F2G08U0A的地址序列在图4已经做了详细说明.(5)NFDATA:只用到低8位,读、写此寄存器将启动对NAND Flash的读数据、写数据操作.(6)NFSTAT:只用到位0,用来检测NAND是否准备好.0:busy,1:ready.NFCONF寄存器使用TACLS、TWRPH0、TWRPH1这3个参数来控制NAND Flash信号线CLE/ALE与写控制信号nWE的时序关系,它们之间的关系如图6和图7所示:图6 CLE/ALE时序图图7 nWE和nRE时序图TACLS为CLE/ALE有效到nWE有效之间的持续时间,TWRPH0为nWE的有效持续时间,TWRPH1为nWE无效到CLE/ALE无效之间的持续时间,这些时间都是以HCLK为单位的.通过查阅K9F2G08U0A的数据手册,我们可以找到并计算与S3C2440相对应的时序:K9F2G08U0A中的Twp与TWRPH0相对应,Tclh与TWRPH1相对应, TACLS应该是与Tcls相对应.K9F2G08U0A给出的都是最小时间, 2440只要满足它的最小时间即可.TACLS、TWRPH0、TWRPH1这三个变量取值大一些会更保险,在这里,这三个值分别取1,2和0.下面就开始详细介绍K9F2G08U0A的基本操作,包括复位,读ID,页读、写数据,随意读、写数据,块擦除等.为了更好地应用ECC和使能Nand Flash片选,我们还需要一些宏定义:define NF_nFCE_L(){rNFCONT &= ~(1<<1); }define NF_CE_L()NF_nFCE_L()//打开nandflash片选define NF_nFCE_H(){rNFCONT |= (1<<1); }define NF_CE_H() NF_nFCE_H() //关闭nandflash片选define NF_RSTECC(){rNFCONT |= (1<<4); }//复位ECCdefine NF_MECC_UnLock(){rNFCONT &= ~(1<<5); }//解锁main区ECCdefine NF_MECC_Lock(){rNFCONT |= (1<<5); }//锁定main区ECCdefine NF_SECC_UnLock() {rNFCONT &= ~(1<<6); }//解锁spare区ECCdefine NF_SECC_Lock(){rNFCONT |= (1<<6); }//锁定spare区ECCNFSTAT是另一个比较重要的寄存器,它的第0位可以用于判断nandflash是否在忙,第2位用于检测RnB引脚信号:define NF_WAITRB() {while((rNFSTAT & (1<<0) ) ); }//等待Nand Flash不忙define NF_CLEAR_RB(){rNFSTAT |= (1<<2); }//清除RnB信号define NF_DETECT_RB(){while((rNFSTAT&(1<<2)));} //等待RnB信号变高,即不忙NFCMMD,NFADDR和NFDATA分别用于传输命令,地址和数据,为了方便起见,我们可以定义一些宏定义用于完成上述操作:define NF_CMD(data) {rNFCMD = (data); }//传输命令define NF_ADDR(addr){rNFADDR = (addr); }//传输地址define NF_RDDATA() (rNFDATA) //读32位数据define NF_RDDATA8()(rNFDATA8)//读8位数据define NF_WRDATA(data){rNFDATA = (data); }//写32位数据define NF_WRDATA8(data) {rNFDATA8 = (data); }//写8位数据首先,是初始化操作void rNF_Init(void){rNFCONF = (TACLS<<12)|(TWRPH0<<8)|( TWRPH1<<4)|(0<<0); //初始化时序参数rNFCONT =(0<<13)|(0<<12)|(0<<10)|(0<<9)|(0<<8)|(1<<6)|(1<<5)|(1<<4)|(1<<1)|(1<<0); //非锁定,屏蔽nandflash中断,初始化ECC及锁定main区和spare区ECC,使能nandflash控制器,禁止片选rNF_Reset(); //复位芯片}复位操作,写入复位命令static void rNF_Reset(){NF_CE_L();//打开nandflash片选NF_CLEAR_RB();//清除RnB信号NF_CMD(CMD_RESET); //写入复位命令NF_DETECT_RB();//等待RnB信号变高,即不忙NF_CE_H();//关闭nandflash片选}读取K9F2G08U0A芯片ID的操作如下:时序图在datasheet的figure18.首先需要写入读ID命令(0x90),然后再写入0x00地址,并等待芯片就绪,就可以读取到一共五个周期的芯片ID,第一个周期为厂商ID,第二个周期为设备ID,第三个周期至第五个周期包括了一些具体的该芯片信息,函数如下static char rNF_ReadID(){char pMID;char pDID;char cyc3, cyc4, cyc5;NF_nFCE_L();//打开nandflash片选NF_CLEAR_RB();//清RnB信号NF_CMD(CMD_READID);//读ID命令NF_ADDR(0x0); //写0x00地址for ( i = 0; i < 100; i++ );等一段时间//读五个周期的IDpMID = NF_RDDATA8();//厂商ID:0xECpDID = NF_RDDATA8();//设备ID:0xDAcyc3 = NF_RDDATA8();//0x10cyc4 = NF_RDDATA8();//0x95cyc5 = NF_RDDATA8();//0x44NF_nFCE_H();//关闭nandflash片选return (pDID);}下面介绍Nand Flash读操作,读操作是以页为单位进行的.如果在读取数据的过程中不进行ECC校验判断,则读操作比较简单,在写入读命令的两个周期之间写入要读取的页地址,然后读取数据即可.如果为了更准确地读取数据,则在读取完数据之后还要进行ECC校验判断,以确定所读取的数据是否正确.在上文中已经介绍过,Nand Flash的每一页有两区:main区和spare区,main区用于存储正常的数据,spare区用于存储其他附加信息,其中就包括ECC校验码.当我们在写入数据的时候,我们就计算这一页数据的ECC校验码,然后把校验码存储到spare区的特定位置中,在下次读取这一页数据的时候,同样我们也计算ECC校验码,然后与spare区中的ECC校验码比较,如果一致则说明读取的数据正确,如果不一致则不正确.ECC的算法较为复杂,好在S3C2440能够硬件产生ECC校验码,这样就省去了不少的麻烦事.S3C2440既可以产生main区的ECC 校验码,也可以产生spare区的ECC校验码.因为K9F2G08U0A是8位IO口,因此S3C2440共产生4个字节的main区ECC码和2个字节的spare区ECC码.在这里我们规定,在每一页的spare区的第0个地址到第3个地址存储main区ECC,第4个地址和第5个地址存储spare区ECC.产生ECC校验码的过程为:在读取或写入哪个区的数据之前,先解锁该区的ECC,以便产生该区的ECC.在读取或写入完数据之后,再锁定该区的ECC,这样系统就会把产生的ECC码保存到相应的寄存器中.main区的ECC保存到NFMECC0/1中(因为K9F2G08U0A是8位IO口,因此这里只用到了NFMECC0),spare区的ECC保存到NFSECC中.对于读操作来说,我们还要继续读取spare 区的相应地址内容,以得到上次写操作时所存储的main区和spare区的ECC,并把这些数据分别放入NFMECCD0/1和NFSECCD的相应位置中.最后我们就可以通过读取NFESTAT0/1(因为K9F2G08U0A是8位IO口,因此这里只用到了NFESTAT0)中的低4位来判断读取的数据是否正确,其中第0位和第1位为main区指示错误,第2位和第3位为spare区指示错误.下面是一段具体的页读操作程序:U8 rNF_ReadPage( U32 page_number ){U32 i, mecc0, secc;NF_RSTECC(); //复位ECCNF_MECC_UnLock(); //解锁main区ECCNF_nFCE_L(); //使能芯片NF_CLEAR_RB(); //清除RnBNF_CMD(CMD_READ1); //页读命令周期1,0x00//写入5个地址周期NF_ADDR(0x00); //列地址A0-A7NF_ADDR(0x00); //列地址A8-A11NF_ADDR((page_number) & 0xff); //行地址A12-A19NF_ADDR((page_number >> 8) & 0xff); //行地址A20-A27NF_ADDR((page_number >> 16) & 0xff); //行地址A28NF_CMD(CMD_READ2); //页读命令周期2,0x30NF_DETECT_RB(); //等待RnB信号变高,即不忙for (i = 0; i < 2048; i++){buf[i] = NF_RDDATA8(); //读取一页数据内容}NF_MECC_Lock();//锁定main区ECC值NF_SECC_UnLock();//解锁spare区ECC//读spare区的前4个地址内容,即第2048~2051地址,这4个字节为main区的ECCmecc0=NF_RDDATA();//把读取到的main区的ECC校验码放入NFMECCD0/1的相应位置内rNFMECCD0=((mecc0&0xff00)<<8)|(mecc0&0xff);rNFMECCD1=((mecc0 & 0xff00 0000)>>8)|((mecc0 & 0xff0 000)>>16);NF_SECC_Lock();//锁定spare区的ECC值//继续读spare区的4个地址内容,即第2052~2055地址,其中前2个字节为spare区的ECC值secc=NF_RDDATA();//把读取到的spare区的ECC校验码放入NFSECCD的相应位置内rNFSECCD=((secc&0xff00)<<8)|(secc&0xff);NF_nFCE_H(); //关闭nandflash片选//判断所读取到的数据是否正确if ((rNFESTAT0&0xf) == 0x0)return 0x66; //正确elsereturn 0x44; //错误}这段程序是把某一页的内容读取到全局变量数组buffer中.该程序的输入参数直接就为K9F2G08U0A的第几页,例如我们要读取第128064页中的内容,可以调用该程序为:rNF_ReadPage(128064).由于第128064页是第2001块中的第0页(128064=2001×64+0),所以为了更清楚地表示页与块之间的关系,也可以写为:rNF_ReadPage(200164).页写操作的大致流程为:在两个写命令周期之间分别写入页地址和数据,当然如果为了保证下次读取该数据时的正确性,还需要把main区的ECC值和spare区的ECC值写入到该页的spare区内.然后我们还需要读取状态寄存器,以判断这次写操作是否正确.下面就给出一段具体的页写操作程序,其中输入参数也是要写入数据到第几页:U8 rNF_WritePage(U32 page_number){U32 i, mecc0, secc;U8 stat, temp;temp = rNF_IsBadBlock(page_number>>6); //判断该块是否为坏块if(temp == 0x33)return 0x42; //是坏块,返回NF_RSTECC(); //复位ECC——>使能ECCNF_MECC_UnLock();//解锁main区的ECCNF_nFCE_L();//打开nandflash片选NF_CLEAR_RB(); //清RnB信号NF_CMD(CMD_WRITE1); //页写命令周期1//写入5个地址周期NF_ADDR(0x00);//列地址A0~A7NF_ADDR(0x00); //列地址A8~A11NF_ADDR((page_number) & 0xff);//行地址A12~A19NF_ADDR((page_number >> 8) & 0xff); //行地址A20~A27NF_ADDR((page_number >> 16) & 0xff); //行地址A28for (i = 0; i < 2048; i++)//写入一页数据{NF_WRDATA8((char)(i+6));}NF_MECC_Lock();//锁定main区的ECC值mecc0=rNFMECC0; //读取main区的ECC校验码//把ECC校验码由字型转换为字节型,并保存到全局变量数组ECCBuf中ECCBuf[0]=(U8)(mecc0&0xff);ECCBuf[1]=(U8)((mecc0>>8) & 0xff);ECCBuf[2]=(U8)((mecc0>>16) & 0xff);ECCBuf[3]=(U8)((mecc0>>24) & 0xff);NF_SECC_UnLock(); //解锁spare区的ECC//把main区的ECC值写入到spare区的前4个字节地址内,即第2048~2051地址for(i=0;i<4;i++){NF_WRDATA8(ECCBuf[i]);}NF_SECC_Lock(); //锁定spare区的ECC值secc=rNFSECC; //读取spare区的ECC校验码//把ECC校验码保存到全局变量数组ECCBuf中ECCBuf[4]=(U8)(secc&0xff);ECCBuf[5]=(U8)((secc>>8) & 0xff);//把spare区的ECC值继续写入到spare区的第2052~2053地址内for(i=4;i<6;i++){NF_WRDATA8(ECCBuf[i]);}NF_CMD(CMD_WRITE2);//页写命令周期2delay(1000);//延时一段时间,以等待写操作完成NF_CMD(CMD_STATUS); //读状态命令//判断状态值的第6位是否为1,即是否在忙,该语句的作用与NF_DETECT_RB();相同do {stat = NF_RDDATA8();}while((stat&0x40));NF_nFCE_H(); //关闭Nand Flash片选//判断状态值的第0位是否为0,为0则写操作正确,否则错误if (stat & 0x1){temp = rNF_MarkBadBlock(page_number>>6);//标注该页所在的块为坏块if (temp == 0x21)return 0x43 //表示写操作失败,并且在标注该页所在的块为坏块时也失败elsereturn 0x44; //写操作失败}elsereturn 0x66; //写操作成功}该段程序先判断该页所在的坏是否为坏块,如果是则退出.在最后写操作失败后,还要标注该页所在的块为坏块,其中所用到的函数rNF_IsBadBlock和rNF_MarkBadBlock,我们在后面介绍.我们再总结一下该程序所返回数值的含义,0x42:表示该页所在的块为坏块;0x43:表示写操作失败,并且在标注该页所在的块为坏块时也失败;0x44:表示写操作失败,但是标注坏块成功;0x66:写操作成功.擦除是以块为单位进行的,因此在写地址周期是,只需写三个行周期,并且要从A18开始写起.与写操作一样,在擦除结束前还要判断是否擦除操作成功,另外同样也存在需要判断是否为坏块以及要标注坏块的问题.下面就给出一段具体的块擦除操作程序:U8 rNF_EraseBlock(U32 block_number){char stat, temp;temp = rNF_IsBadBlock(block_number); //判断该块是否为坏块if(temp == 0x33)return 0x42; //是坏块,返回NF_nFCE_L(); //打开片选NF_CLEAR_RB(); //清RnB信号NF_CMD(CMD_ERASE1); //擦除命令周期1//写入3个地址周期,从A18开始写起NF_ADDR((block_number << 6) & 0xff); //行地址A18~A19NF_ADDR((block_number >> 2) & 0xff); //行地址A20~A27NF_ADDR((block_number >> 10) & 0xff); //行地址A28NF_CMD(CMD_ERASE2); //擦除命令周期2delay(1000); //延时一段时间NF_CMD(CMD_STATUS); //读状态命令//判断状态值的第6位是否为1,即是否在忙,该语句的作用与NF_DETECT_RB();相同do{stat = NF_RDDATA8();}while((stat&0x40));NF_nFCE_H(); //关闭Nand Flash片选//判断状态值的第0位是否为0,为0则擦除操作正确,否则错误if (stat & 0x1){temp = rNF_MarkBadBlock(page_number>>6);//标注该块为坏块if (temp == 0x21)return 0x43 //标注坏块失败elsereturn 0x44; //擦除操作失败}elsereturn 0x66; //擦除操作成功}该程序的输入参数为K9F2G08U0A的第几块,例如我们要擦除第2001块,则调用该函数为:rNF_EraseBlock(2001) K9F2G08U0A除了提供了页读和页写功能外,还提供了页内地址随意读、写功能.页读和页写是从页的首地址开始读、写,而随意读、写实现了在一页范围内任意地址的读、写.随意读操作是在页读操作后输入随意读命令和页内列地址,这样就可以读取到列地址所指定地址的数据.随意写操作是在页写操作的第二个页写命令周期前,输入随意写命令和页内列地址,以及要写入的数据,这样就可以把数据写入到列地址所指定的地址内.下面两段程序实现了随意读和随意写功能,其中随意读程序的输入参数分别为页地址和页内地址,输出参数为所读取到的数据,随意写程序的输入参数分别为页地址,页内地址,以及要写入的数据.U8 rNF_RamdomRead(U32 page_number, U32 add){NF_nFCE_L(); //打开Nand Flash片选NF_CLEAR_RB(); //清RnB信号NF_CMD(CMD_READ1); //页读命令周期1//写入5个地址周期NF_ADDR(0x00); //列地址A0~A7NF_ADDR(0x00); //列地址A8~A11NF_ADDR((page_number) & 0xff); //行地址A12~A19NF_ADDR((page_number >> 8) & 0xff); //行地址A20~A27NF_ADDR((page_number >> 16) & 0xff); //行地址A28NF_CMD(CMD_READ2); //页读命令周期2NF_DETECT_RB(); //等待RnB信号变高,即不忙NF_CMD(CMD_RANDOMREAD1); //随意读命令周期1//页内地址NF_ADDR((char)(add&0xff)); //列地址A0~A7NF_ADDR((char)((add>>8)&0x0f)); //列地址A8~A11NF_CMD(CMD_RANDOMREAD2); //随意读命令周期2return NF_RDDATA8(); //读取数据}U8 rNF_RamdomWrite(U32 page_number, U32 add, U8 dat){U8 temp,stat;NF_nFCE_L(); //打开Nand Flash片选NF_CLEAR_RB(); //清RnB信号NF_CMD(CMD_WRITE1); //页写命令周期1//写入5个地址周期NF_ADDR(0x00); //列地址A0~A7NF_ADDR(0x00); //列地址A8~A11NF_ADDR((page_number) & 0xff); //行地址A12~A19NF_ADDR((page_number >> 8) & 0xff); //行地址A20~A27NF_ADDR((page_number >> 16) & 0xff); //行地址A28NF_CMD(CMD_RANDOMWRITE); //随意写命令//页内地址NF_ADDR((char)(add&0xff)); //列地址A0~A7NF_ADDR((char)((add>>8)&0x0f)); //列地址A8~A11NF_WRDATA8(dat); //写入数据NF_CMD(CMD_WRITE2); //页写命令周期2delay(1000); //延时一段时间NF_CMD(CMD_STATUS); //读状态命令//判断状态值的第6位是否为1,即是否在忙,该语句的作用与NF_DETECT_RB();相同do{stat = NF_RDDATA8();}while((stat&0x40));NF_nFCE_H(); //关闭Nand Flash片选//判断状态值的第0位是否为0,为0则写操作正确,否则错误if (stat & 0x1)return 0x44; //失败elsereturn 0x66; //成功}下面介绍上文中提到的判断坏块以及标注坏块的那两个程序:rNF_IsBadBlock和rNF_MarkBadBlock.在这里,我们定义在spare区的第6个地址(即每页的第2054地址)用来标注坏块,0x44表示该块为坏块.要判断坏块时,利用随意读命令来读取2054地址的内容是否为0x44,要标注坏块时,利用随意写命令来向2054地址写0x33.下面就给出这两个程序,它们的输入参数都为块地址,也就是即使仅仅一页出现问题,我们也标注整个块为坏块.U8 rNF_IsBadBlock(U32 block){return rNF_RamdomRead(block64, 2054);}U8 rNF_MarkBadBlock(U32 block){U8 result;result = rNF_RamdomWrite(block64, 2054, 0x33);if(result == 0x44)return 0x21; //写坏块标注失败elsereturn 0x60; //写坏块标注成功}关于Nand Flash的基本操作就介绍到这吧。
NandFlash驱动编写知识详解与坏块管理

【Nand Flash驱动编写之前要了解的知识】1.硬件特性:【Flash的硬件实现机制】Flash全名叫做Flash Memory,属于非易失性存储设备(Non-volatile Memory Device),与此相对应的是易失性存储设备(Volatile Memory Device)。
关于什么是非易失性/易失性,从名字中就可以看出,非易失性就是不容易丢失,数据存储在这类设备中,即使断电了,也不会丢失,这类设备,除了Flash,还有其他比较常见的入硬盘,ROM等,与此相对的,易失性就是断电了,数据就丢失了,比如大家常用的内存,不论是以前的SDRAM,DDR SDRAM,还是现在的DDR2,DDR3等,都是断电后,数据就没了。
Flash的内部存储是MOSFET,里面有个悬浮门(Floating Gate),是真正存储数据的单元。
在Flash之前,紫外线可擦除(uv-erasable)的EPROM,就已经采用用Floating Gate存储数据这一技术了。
图1.典型的Flash内存单元的物理结构数据在Flash内存单元中是以电荷(electrical charge) 形式存储的。
存储电荷的多少,取决于图中的外部门(external gate)所被施加的电压,其控制了是向存储单元中冲入电荷还是使其释放电荷。
而数据的表示,以所存储的电荷的电压是否超过一个特定的阈值Vth来表示。
【SLC和MLC的实现机制】Nand Flash按照内部存储数据单元的电压的不同层次,也就是单个内存单元中,是存储1位数据,还是多位数据,可以分为SLC和MLC:1.SLC,Single Level Cell:单个存储单元,只存储一位数据,表示成1或0.就是上面介绍的,对于数据的表示,单个存储单元中内部所存储电荷的电压,和某个特定的阈值电压Vth,相比,如果大于此Vth值,就是表示1,反之,小于Vth,就表示0.对于nand Flash的数据的写入1,就是控制External Gate去充电,使得存储的电荷够多,超过阈值Vth,就表示1了。
NandFLash分析与总结

友善之臂K9F1208U0C PCB04-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 status3NandFlash启动时,代码小于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中最大的操作单元。
NAND_FLASH_内存详解与读写寻址方式

NAND FLASH 内存详解与读写寻址方式一、内存详解NAND闪存阵列分为一系列128kB的区块(block),这些区块是NAND器件中最小的可擦除实体。
擦除一个区块就是把所有的位(bit)设置为"1"(而所有字节(byte)设置为FFh)。
有必要通过编程,将已擦除的位从"1"变为"0"。
最小的编程实体是字节(byte)。
一些NOR闪存能同时执行读写操作(见下图1)。
虽然NAND不能同时执行读写操作,它可以采用称为"映射(shadowing)"的方法,在系统级实现这一点。
这种方法在个人电脑上已经沿用多年,即将BIOS从速率较低的ROM加载到速率较高的RAM上。
NAND的效率较高,是因为NAND串中没有金属触点。
NAND闪存单元的大小比NOR要小(4F2:10F2)的原因,是NOR的每一个单元都需要独立的金属触点。
NAND与硬盘驱动器类似,基于扇区(页),适合于存储连续的数据,如图片、音频或个人电脑数据。
虽然通过把数据映射到RAM上,能在系统级实现随机存取,但是,这样做需要额外的RAM存储空间。
此外,跟硬盘一样,NAND器件存在坏的扇区,需要纠错码(ECC)来维持数据的完整性。
存储单元面积越小,裸片的面积也就越小。
在这种情况下,NAND就能够为当今的低成本消费市场提供存储容量更大的闪存产品。
NAND闪存用于几乎所有可擦除的存储卡。
NAND的复用接口为所有最新的器件和密度都提供了一种相似的引脚输出。
这种引脚输出使得设计工程师无须改变电路板的硬件设计,就能从更小的密度移植到更大密度的设计上。
NAND与NOR闪存比较NAND闪存的优点在于写(编程)和擦除操作的速率快,而NOR的优点是具有随机存取和对字节执行写(编程)操作的能力(见下图图2)。
NOR的随机存取能力支持直接代码执行(XiP),而这是嵌入式应用经常需要的一个功能。
nand_flash读写工作原理_概述说明

nand flash读写工作原理概述说明1. 引言1.1 概述NAND Flash是一种非常常见和重要的存储设备,被广泛应用于各种电子产品中。
它的独特设计使得它成为一种高性能、低功耗、擦写可靠且具有较大容量的存储器解决方案。
由于其许多优点,NAND Flash在移动设备、个人电脑、服务器以及其他许多领域都有着广泛的应用。
1.2 文章结构本文将详细介绍NAND Flash的读写工作原理,并探讨其在存储领域中的优势与应用场景。
首先,我们将简要介绍NAND Flash的基本概念和特点,包括其结构和组成部分。
然后,我们将重点讲解NAND Flash进行读操作和写操作时所涉及的工作原理和步骤。
通过对这些原理的详细阐述,读者将能够全面了解NAND Flash如何实现数据的读取和写入。
除此之外,我们还将探讨NAND Flash相对于其他存储设备的优势,并介绍几个典型应用场景。
这些优势包括快速读写速度、低功耗、体积小且轻便、强大的耐久性以及较大的存储容量。
在应用场景方面,我们将重点介绍NAND Flash 在移动设备领域、物联网和服务器等各个行业中的广泛应用。
最后,我们将进行本文的小结,并对NAND Flash未来的发展进行展望。
通过全面了解NAND Flash的工作原理和优势,读者将能够更好地理解其在现代科技领域中的重要性,并对其未来发展趋势有一个清晰的认识。
1.3 目的本文的目的是通过对NAND Flash读写工作原理进行详细说明,使读者能够全面了解NAND Flash是如何实现数据读写操作的。
此外,我们还旨在向读者展示NAND Flash在存储领域中所具有的优势和广泛应用场景,使其意识到这一存储设备在现代科技产业中所扮演的重要角色。
希望通过本文,读者能够加深对NAND Flash技术的理解,并为相关领域或产品的研发与设计提供参考依据。
2. NAND Flash读写工作原理:2.1 NAND Flash简介:NAND Flash是一种非易失性存储器,采用了电子闪存技术。
NAND闪存芯片和NOR闪存芯片的不同

NAND闪存芯片和NOR闪存芯片的不同1)闪存芯片读写的基本单位不同应用程序对NOR芯片操作以“字”为基本单位。
为了方便对大容量NOR闪存的管理,通常将NOR闪存分成大小为128KB或者64KB的逻辑块,有时候块内还分成扇区。
读写时需要同时指定逻辑块号和块内偏移。
应用程序对N AN D芯片操作是以“块”为基本单位。
NAND闪存的块比较小,一般是8KB,然后每块又分成页,页的大小一般是512字节。
要修改NAND芯片中一个字节,必须重写整个数据块。
2)NOR闪存是随机存储介质,用于数据量较小的场合;N AND闪存是连续存储介质,适合存放大的数据。
3)由于NOR地址线和数据线分开,所以NOR芯片可以像SRAM一样连在数据线上。
NOR芯片的使用也类似于通常的内存芯片,它的传输效率很高,可执行程序可以在芯片内执行(XI P,eXecute In Place),这样应用程序可以直接在flash闪存内运行,不必再把代码读到系统RAM中。
由于NOR的这个特点,嵌入式系统中经常将NOR芯片做启动芯片使用。
而NAND共用地址和数据总线,需要额外联结一些控制的输入输出,所以直接将NAND芯片做启动芯片比较难。
4)NAND闪存芯片因为共用地址和数据总线的原因,不允许对一个字节甚至一个块进行的数据清空,只能对一个固定大小的区域进行清零操作;而NOR芯片可以对字进行操作。
所以在处理小数据量的I/O操作的时候的速度要快与NAND的速度。
比如一块NOR芯片通常写一个字需要10微秒,那么在32位总线上写512字节需要1280毫秒;而NAND闪存写512字节需要的时间包括:512×每字节50纳秒+10微秒的寻页时间+200微秒的片擦写时间=234微秒。
5)NAND闪存的容量比较大,目前最大容量己经达到8G字节。
为了方便管理,NAND 的存储空间使用了块和页两级存储体系,也就是说闪存的存储空间是二维的,比如K9F5608UOA闪存块的大小为16K,每页的大小是512字节,每页还16字节空闲区用来存放错误校验码空间(有时也称为out-of-band,OOB空间);在进行写操作的时候NAND闪存每次将一个字节的数据放入内部的缓存区,然后再发出“写指令”进行写操作。
ARM_cotex_A8嵌入式原理与系统设计习题答案
第1章1.1 什么是嵌入式系统?嵌入式系统是以应用为中心、以计算机技术为基础、软/硬件可剪裁、适用于对系统功能、可靠性、成本、体积、功耗等有严格要求的专用计算机系统。
1.2 嵌入式系统的应用领域有哪些? 列举一些生活中的嵌入式系统实例。
嵌入式系统的应用领域有交通管理、工控设备、智能仪器、汽车电子、环境监测、电子商务、医疗仪器、移动计算、网络设备、通信设备、军事电子、机器人、智能玩具、信息家电等;①网络设备: 交换机、路由器、Modem 等。
②消费电子: 手机、MP3、PDA、可视、电视机顶盒、数字电视、数码照相机、数码摄像机、信息家电等。
③办公设备: 打印机、传真机、扫描仪等。
④汽车电子: ABS (防死锁制动系统)、供油喷射控制系统、车载GPS 等。
⑤工业控制: 各种自动控制设备1.3 嵌入式系统的组成有哪些?嵌入式系统一般由硬件层,中间层,软件层三层组成。
1.4 嵌入式系统的特点有哪些?嵌入式系统有以下4个特点:系统核小、专用性强、系统精简、实时性高。
1.5 简述嵌入式系统的发展。
嵌入式系统具有以下6个发展趋势:系统工程化、开源化、功能多样化、节能化、人性化、网络化。
1.6 常用的嵌入式处理器分为哪几类?常见的嵌入式处理器有一下四类:嵌入式微处理器、嵌入式微控制器、嵌入式DSP 处理器、嵌入式片上系统。
1.7 嵌入式操作系统的特点有哪些?嵌入式操作系统有以下6个特点:系统核小、专用性强、系统精简、高实时性、多任务的操作系统、需要专用开发工具和环境。
1.8 什么是实时操作系统? IEEE 实时UNIX 分委会认为实时操作系统应具备哪些特点?实时操作系统是指在限定的时间能对过程调用产生正确的响应的操作系统。
IEEE 的实时UNIX分委会认为实时操作系统应具备以下特点:异步的事件响应、切换时间和中断延迟时间确定、优先级中断和调度、抢占式调度、存锁定、连续文件、同步。
1.9 常用的嵌入式操作系统有哪些? 它们各有什么特点?1.10 嵌入式系统工程设计的要点有哪些?应用需求;硬件要求;实时性的实现;系统功耗;系统升级方式;调试方式;开发环境的选择等。
NandFlash结构与读写分析及NandFlash寻址方式
NandFlash结构与读写分析及NandFlash寻址方式NAND Flash是一种常用的非易失性存储器,用于存储大量的数据。
它具有高密度、快速读写、低功耗和可擦写的特点,因此被广泛应用于手机、相机、电脑和其他电子设备中。
本文将介绍NAND Flash的结构与读写分析,并详细讨论NAND Flash的寻址方式。
首先,我们来看一下NAND Flash的结构。
NAND Flash由一系列的存储单元组成,每个存储单元被称为“页”。
每个页都包含了一定数量的数据位,通常为2KB到16KB。
NAND Flash通常以块的形式进行读写操作,一个块包含了一定数量的页,通常为32页到128页。
每个块都有一个唯一的地址,用于寻址和访问。
所有的块集合起来构成了一个NAND Flash 芯片。
接下来,我们将分析NAND Flash的读写过程。
首先是写操作。
当要向NAND Flash写入数据时,控制器将数据分成适当的大小并进行编码,然后将其发送到NAND Flash芯片。
芯片会将数据写入到一个可用的空闲块中的空闲页中,并更新一些关于数据的元数据信息,比如页状态和块状态。
为了提高写入速度,NAND Flash通常使用了一种称为“写入放大”的技术,即将多个写入操作合并在一起,一次性写入多个页。
然后是读操作。
当要从NAND Flash中读取数据时,控制器将发送读命令和所需的地址给芯片。
芯片会根据地址找到对应的页,并将数据读取出来发送给控制器。
为了提高读取速度,NAND Flash通常使用了一种称为“读取放大”的技术,即一次读取多个页的数据,然后通过多路复用器将这些数据发送给控制器。
最后,我们讨论NAND Flash的寻址方式。
NAND Flash的寻址方式可以分为两种:页级寻址和块级寻址。
在页级寻址中,每个页都有一个唯一的地址,通过页地址可以直接访问到特定的页。
这种方式简单直接,但会带来额外的寻址开销。
在块级寻址中,每个块有一个唯一的地址,通过块地址可以访问到整个块的所有页。
nand flash架构读取操作原理
nand flash架构读取操作原理
NAND Flash是一种非易失性存储器,其读取操作原理如下:
1. 数据存储:NAND Flash将数据存储在一组互相连接的存储单元(或称为“存储块”),每个存储单元存储一个或多个数据位。
2. 读取操作:当进行读取操作时,控制器发送一个读取命令给NAND Flash芯片。
读取命令包括存储单元的地址,用于指示需要读取的数据位在哪个存储单元中。
3. 地址解码:NAND Flash芯片通过解码器将接收到的地址信号解码为特定的存储单元。
4. 数据传输:一旦解码,NAND Flash芯片会将请求的数据位传输给控制器。
数据传输是通过读取线路进行的,其中包括数据线和引脚,以便将数据传输到控制器。
5. 数据返回:NAND Flash芯片将请求的数据位返回给控制器后,控制器可以根据需要将数据传输到主机系统的内存中。
需要注意的是,NAND Flash芯片的读取操作是以块为单位进行的,而不是以字节或位为单位。
这是因为每个存储单元中的数据位是同时读取的。
因此,如果需要读取少于一个存储块的数据,控制器仍会读取整个存储块,并从中提取所需数据,这会导致一定的浪费。
nand flash和dram工作原理
nand flash和dram工作原理NAND Flash和DRAM的工作原理导言在计算机领域,NAND Flash和DRAM是重要的存储器件。
本文将从浅入深,逐步解释它们的工作原理,并帮助读者更好地理解它们。
NAND Flash基本概念NAND Flash是一种非易失性存储器件,常用于存储大容量的数据。
它由许多存储单元组成,每个存储单元可以存储一个或多个二进制位。
存储单元NAND Flash的存储单元被称为“页(Page)”,每个页通常包含多个存储单元。
每个存储单元可以存储一个或多个二进制位,最常见的是存储一个二进制位,即0或1。
页的组织NAND Flash中的页以块(Block)的形式进行组织。
每个块由多个页组成,通常包含数百或数千个页。
这种组织方式有助于提高数据的读取和写入效率。
NAND Flash的工作原理现在我们来了解NAND Flash的工作原理。
1.写入操作1.擦除:在写入新数据之前,需要先将待写入的块擦除。
擦除是一个比较慢的操作,需要将整个块中的所有页都擦除为初始状态。
2.编程:将数据编程到特定的页中。
编程操作会改变页中的存储单元的状态,从而存储相应的数据。
2.读取操作1.寻址:需要通过选择特定的块、页和存储单元来确定要读取的数据。
2.读取:将存储单元的状态转换为相应的数据,并输出给外部设备。
3.擦除操作1.擦除:与写入操作中的擦除类似,需要将整个块中的所有页都擦除为初始状态。
DRAM基本概念DRAM是一种易失性存储器件,常用于计算机的内存。
它由许多存储单元组成,每个存储单元可以存储一个二进制位。
存储单元DRAM的存储单元被称为“存储单元(Cell)”,每个存储单元可以存储一个二进制位,即0或1。
DRAM的工作原理现在我们来了解DRAM的工作原理。
1.写入操作1.寻址:通过选择特定的存储单元来确定要写入的位置。
2.刷新:为了保持数据的稳定性,DRAM需要定期进行刷新操作。
刷新操作会重新读取并重新写入所有存储单元中的数据。
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
关于nand flash的地址A8,寻址关于nand flash的地址A8,寻址在NAND Flash中有8个I/O引脚(IO0—IO7)、5个全能信号(nWE ALE CLE nCE nRE)、一个引脚,1个写保护引脚。
操作NAND Flash时,先传输命令,然后传输地址,最后读写数据。
对于64MB的NAND Flash,需要一个26位的地址。
只能8个I/O引脚充当地址、数据、命令的复用端口,所以每次传地址只能传8位。
这样就需要4个地址序列。
因此读写一次nand flash需要传送4次(A[7:0] A[16:9] A[24:17] A[25])。
64M的NAND Flash的地址范围为0x00000000—0x03FFFFFF。
128M的NAND Flash的地址范围为0x00000000---0x07FFFFFF。
1KB =0x000-0x3FF.128字节=0x00H--7FH。
一页有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字节。
访问某页时必须选定特定的区。
这可以使地址指针指向特定的区实现。
在NAND Flash 中存在三类地址,分别为Block Address 、Column Address Page Address.。
(实际就是块地址和页地址)Column Address 用来选择是在上半页寻址还是在下半页寻址A[0]—A[7].也就相当于页内的偏移地址。
在进行擦除时不需要列地址,因为擦除是以块为单位擦除。
32个Page 需要5bit来表示。
也就是A[13:9];也就是页在块内的相对地址。
A8这一位用来设置512字节的上半页,还是下半页,1表示是在上半页,而2表示是在下半页。
Block的地址有A[25:14]组成.一个容量为64M(512Mbit)的NAND Flash,分为131072页,528列。
(实际中由于存在spare area,故都大于这个值),有4096块,需要12bit来表示即A[25:14].如果是128M (1Gbit)的话,blodk Address为A[26:14].由于地址只能在IO0—IO7上传送。
编程时通常通过移位来实现地址的传送。
传送过程如下:第1个地址序列:传递column address,也就是NAND Flash[7:0],这一周期不需要移位即可传递到I/O[7:0]上,而half page pointer 即A8是由操作指令决定,00h,在A区,01h在B区,指令决定在哪个half page上进行读写,而真正A8的值是不需要程序员关心的;第2个地址序列:就是将NAND_ADDR 右移9位,而不是8位,将NAND_ADDR[16:9]传递到I/O[7:0]上;第3个地址序列:将NAND_ADDR[24:17] 传递到I/O[7:0]上;第4个地址序列:将NAND_ADDR[25]传送到I/O上。
整个地址的传送过程需要4步才能完成。
如果NAND Flash 的大小是32MB的以下的话,那么block address 最高位只到bit24,因此寻址只需要3步,就可以完成。
在进行擦除操作时由于是以块进行擦除,所以只需要3个地址序列,也就是只传递块的地址,即A[14:25]。
NAND Flash地址的计算:Column Address 翻译过来是列地址,也就是在一页里的偏移地址。
其实是指定Page上的某个Byte,指定这个Byte,其实也就是指定此页的读写起始地址。
Page Address:页地址。
页的地址总是以512Bytes对齐的,所以它的低9位问题0,确定读写操作在NAND Flash 中的哪个页进行。
当我们得到一个Nand Flash地址addr时,我们可以这样分解出Column Address和Page Address。
Columnaddr = addr % 512 // column address Pageaddr = addr>>9 // page address实际上A0~A7是页内地址,比如从第2个开始读起。
不过一般都从0开始读起,呵呵。
也就是一个Nand Flash地址的A0-A7是它的columnaddress ,A9—A25是它的Page Address,地址A8被忽略。
现在假设我要从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=392page_address=(5000>>9)=9于是我们可以知道5000这个地址是在第9页的第392个字节处,于是我们的NF_read函数将这样发送命令和参数column_addr=5000%512;page_address=(5000>>9);NF_CMD=0x01; //要从2nd half开始读取所以要发送命令0x01NF_ADDR= column_addr &0xff; //1st Cycle A[7:0] NF_ADDR=page_address& 0xffNF_ADDR=(page_address>>8)&0xff;//3rd.Cycle A[24:17]NF_ADDR=(page_address>>16)&0xff;//4th.Cycle A[25]向NandFlash的命令寄存器和地址寄存器发送完以上命令和参数之后,我们就可以从rNFDATA寄存器(NandFlash数据寄存器)读取数据了.我用下面的代码进行数据的读取.for(i=column_addr;i<512;i++)*buf++=NF_RDDATA();每当读取完一个Page之后,数据指针会落在下一个Page的0号Column(0号Byte).//========================下面是另外一篇,差不多=====================一、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(实际中由于存在sparearea,故都大于这个值),共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。