nand

时间:2024-02-26 07:33:33编辑:分享君

手机里面的NAND是啥意思

这里说的16G绝对不是我们PC机经常说的内存,128MB的RAM才是内存。而16GB的空间相当于电脑的硬盘,用于给用户存储数据用的。NAND是一种闪存,也是用于存储东西的。但是它存储的东西是操作系统、启动程序和文件系统。

我们一般不会直接去操作NAND,我们存储东西就是用那个16G的空间。希望我的回答能够解决你的疑惑。

谢谢


NAND的与NOR闪存比较

NAND闪存的优点在于写(编程)和擦除操作的速率快,而NOR的优点是具有随机存取和对字节执行写(编程)操作的能力(见下图图2)。NOR的随机存取能力支持直接代码执行(XiP),而这是嵌入式应用经常需要的一个功能。NAND的缺点是随机存取的速率慢,NOR的缺点是受到读和擦除速度慢的性能制约。NAND较适合于存储文件。如今,越来越多的处理器具备直接NAND接口,并能直接从NAND(没有NOR)导入数据。编程速度快、擦除时间短NAND的真正好处是编程速度快、擦除时间短。NAND支持速率超过5Mbps的持续写操作,其区块擦除时间短至2ms,而NOR是750ms。显然,NAND在某些方面具有绝对优势。然而,它不太适合于直接随机存取。对于16位的器件,NOR闪存大约需要41个I/O引脚;相对而言,NAND器件仅需24个引脚。NAND器件能够复用指令、地址和数据总线,从而节省了引脚数量。复用接口的一项好处,就在于能够利用同样的硬件设计和电路板,支持较大的NAND器件。由于普通的TSOP-1封装已经沿用多年,该功能让客户能够把较高密度的NAND器件移植到相同的电路板上。NAND器件的另外一个好处显然是其封装选项:NAND提供一种厚膜的2Gb裸片或能够支持最多四颗堆叠裸片,容许在相同的TSOP-1封装中堆叠一个8Gb的器件。这就使得一种封装和接口能够在将来支持较高的密度。NOR闪存的随机存取时间为0.12ms,而NAND闪存的第一字节随机存取速度要慢得多以2Gb NAND器件为例,它由2048个区块组成,每个区块有64个页2GB NAND闪存包含2,048个区块

nor flash 和nand flash 的区别

简单说明:NAND FLASH内部结构是用与非门组成存储单元的。有非易失性,读写速度快,而且比较容易做到大容量。目前单片NAND FLASH存储容量可以达到8Gbit(1GByte)。NOR FLASH也有非易失性。随机存储速度比NAND FLASH 快得多。所以一般用NOR FLASH 用做内存片,或者叫做数据缓冲。而NAND FLASH则一般用来做存储数据用。比方说,U盘.MP3等。
详细说明:
FLASH存储器又称闪存,主要有两种:NorFlash和NandFlash,下面我们从多个角度来对比介绍一下。在实际开发中,设计者可以根据产品需求来进行闪存的合理选择。

1、接口对比

NorFlash带有通用的SRAM接口,可以轻松地挂接在CPU的地址、数据总线上,对CPU的接口要求低。NorFlash的特点是芯片内执行(XIP,eXecute In Place),这样应用程序可以直接在flash闪存内运行,不必再把代码读到系统RAM中。如uboot中的ro段可以直接在NorFlash上运行,只需要把rw和zi段拷贝到RAM中运行即可。

NandFlash器件使用复杂的I/O口来串行地存取数据,8个引脚用来传送控制、地址和数据信息。由于时序较为复杂,所以一般CPU最好集成NAND控制器。另外由于NandFlash没有挂接在地址总线上,所以如果想用NandFlash作为系统的启动盘,就需要CPU具备特殊的功能,如s3c2410在被选择为NandFlash启动方式时会在上电时自动读取NandFlash的4k数据到地址0的SRAM中。如果CPU不具备这种特殊功能,用户不能直接运行NandFlash上的代码,那可以采取其他方式,比如好多使用NandFlash的开发板除了使用NandFlash以外,还用上了一块小的NorFlash来运行启动代码。

2、容量和成本对比

相比起NandFlash来说,NorFlash的容量要小,一般在1~16MByte左右,一些新工艺采用了芯片叠加技术可以把NorFlash的容量做得大一些。在价格方面,NorFlash相比NandFlash来说较高,如目前市场上一片4Mbyte的AM29lv320 NorFlash零售价在20元左右,而一片128MByte的k9f1g08 NandFlash零售价在30元左右。

NandFlash生产过程更为简单,NAND结构可以在给定的模具尺寸内提供更高的容量,这样也就相应地降低了价格。

3、可靠性性对比

NAND器件中的坏块是随机分布的,以前也曾有过消除坏块的努力,但发现成品率太低,代价太高,根本不划算。NAND器件需要对介质进行初始化扫描以发现坏块,并将坏块标记为不可用。在已制成的器件中,如果通过可靠的方法不能进行这项处理,将导致高故障率。而坏块问题在NorFlash上是不存在的。

在Flash的位翻转(一个bit位发生翻转)现象上,NAND的出现几率要比NorFlash大得多。这个问题在Flash存储关键文件时是致命的,所以在使用NandFlash时建议同时使用EDC/ECC等校验算法。

4、寿命对比

在NAND闪存中每个块的最大擦写次数是一百万次,而NOR的擦写次数是十万次。闪存的使用寿命同时和文件系统的机制也有关,要求文件系统具有损耗平衡功能。

5、升级对比

NorFlash的升级较为麻烦,因为不同容量的NorFlash的地址线需求不一样,所以在更换不同容量的NorFlash芯片时不方便。通常我们会通过在电路板的地址线上做一些跳接电阻来解决这样的问题,针对不同容量的NorFlash。

而不同容量的NandFlash的接口是固定的,所以升级简单。

6、读写性能对比

写操作:任何flash器件的写入操作都只能在空或已擦除的单元内进行。NAND器件执行擦除操作是十分简单的,而NOR则要求在进行擦除前先要将目标块内所有的位都写为1。擦除NOR器件时是以64~128KB的块进行的,执行一个擦除/写入操作的时间约为5s。擦除NAND器件是以8~32KB的块进行的,执行一个擦除/写入操作最多只需要4ms。

读操作:NOR的读速度比NAND稍快一些。

7、文件系统比较

Linux系统中采用MTD来管理不同类型的Flash芯片,包括NandFlash和NorFlash。支持在Flash上运行的常用文件系统有cramfs、jffs、jffs2、yaffs、yaffs2等。cramfs文件系统是只读文件系统。如果想在Flash上实现读写操作,通常在NorFlash上我们会选取jffs及jffs2文件系统,在NandFlash上选用yaffs或yaffs2文件系统。Yaffs2文件系统支持大页(大于512字节/页)的NandFlash存储器。


如何实现nand flash的读,写,擦除操作

  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
  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
  ……
  #ifdef CONFIG_MTD_NAND_ECC
  u_char ecc_code_buf[6];
  u_char reserved[2];
  #endif
  #endif
  };
  纵观对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 CONFIGURATION (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_DAT_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_DAT_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;),有兴趣的可以读读代码,看看这是怎么实现的,我的感觉就是关于寄存器的清置读起来都比较晕。

  

  

  

  基于三星K8F2G08U0M存储芯片的读写操作,如命令、地址、数据的读写时序,读芯片ID、页读、页写、随机读、随机写,坏块的检测、标记及处理。

  (1)写命令子函数

  void Write_Command(unsigned char Com)
  {
  FLASH_CLE = 1;
  FLASH_ALE = 0;
  
  FLASH_WE = 0;
  XBYTE[XP] = Com;
  FLASH_WE = 1;
  }

  (2)写地址子函数

  void Write_Address(unsigned char Addr)
  {
  FLASH_CLE = 0;
  FLASH_ALE = 1;

  FLASH_WE = 0;
  XBYTE[XP] = Addr;
  FLASH_WE = 1;

  }

  (3)写数据子函数

  void Write_Data(unsigned char dat)
  {
  FLASH_CLE = 0;
  FLASH_ALE = 0;
  FLASH_RE = 1;

  FLASH_WE = 0;
  XBYTE[XP] = dat;
  FLASH_WE = 1;
  }

  (4)读数据子函数

  unsigned char Read_Data(void)
  {
  unsigned char dat;

  FLASH_CLE = 0;
  FLASH_ALE = 0;
  FLASH_WE = 1;

  FLASH_RE = 0;
  dat = XBYTE[XP];
  FLASH_RE = 1;

  return dat;
  }

  (5) 读ID函数

  FLASH_CEN = 0; //读ID
  Write_Command(0x90);
  Write_Address(0x00);

  AA1 = Read_Data(); //0xEC
  AA2 = Read_Data(); //0xDA
  AA3 = Read_Data(); //无所谓
  AA4 = Read_Data();
  FLASH_CEN = 1;


上一篇:定向生是什么意思啊

下一篇:饺的拼音