加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 百科 > 正文

NAND Flash存储器相关的基本概念

发布时间:2020-12-15 20:09:32 所属栏目:百科 来源:网络整理
导读:Flash存储器是一种非易失性存储设备,其类型包括: NAND flash和NOR flash的比较 : NOR Flash的特点是片内执行 ,即它的读取操作和我们常见的SDRAM的读取是一样,用户可以直接运行装载在NOR FLASH里面的代码。但是NOR F lash比NAND Flash贵,一般适合用于存

Flash存储器是一种非易失性存储设备,其类型包括:



NAND flash和NOR flash的比较NOR Flash的特点是片内执行,即它的读取操作和我们常见的SDRAM的读取是一样,用户可以直接运行装载在NOR FLASH里面的代码。但是NORFlash比NAND Flash贵,一般适合用于存放系统的启动代码。NAND Flash不能片内执行,但它具有容量大,改写速度快的优点。且NAND Flash比较廉价,适合用于存放大量数据。但是NAND Flash比较容易出现位反转问题,在使用中一般需要进行ECC数据校验。

一、NAND Flash 组织结构

以下是K9K8G08U0A NAND Flash的组织图:


块:

? ?块是NAND Flash擦除操作的最小单位。如上图所示,该NAND芯片中总共有8192个块,每个块中又包含64页。每个块大小为(128K+4K)Byte,所以总的芯片容量为8192*(128K+4K)Byte=8448Mbits。

页:

? ?页是读写操作的最小单位。如上图所示,该芯片中每个块包含64页,总共有64*8192页。每个页大小为(2K+64)Bytes,其中2K是真正用于存放数据的区域,而64Bytes是OOB区域。

OOB区域:

? ? 00B区域是页中的空闲区,其作用是:1、存放坏块标记,2、存放ECC校验值,3、存储和文件系统相关的数据。一般的芯片中每512Bytes数据区会分配16Bytes的OOB区域,所以这里2K的数据区就分配了64Bytes的OOB区域。

常见的NAND Flash内部只有一个chip,每个chip只有一个plane。而有些复杂的容量更大的NAND Flash内部有多个chip,每个chip有多个plane。

二、NAND Flash引脚说明

1.?I/O0 ~ I/O7:用于输入地址/数据命令,输出数据

2.?CLE:Command Latch Enable,命令锁存使能,在输入命令之前,要先在模式寄存器中,设置CLE使能

3.?ALE:Address Latch Enable,地址锁存使能,在输入地址之前,要先在模式寄存器中,设置ALE使能

4.?CE#:Chip Enable,芯片使能,在操作Nand Flash之前,要先选中此芯片,才能操作

5.?RE#:Read Enable,读使能,在读取数据之前,要先使CE#有效。

6.?WE#:Write Enable,写使能,在写取数据之前,要先使WE#有效。

7.?WP#:Write Protect,写保护

8.?R/B#:Ready/BusyOutput,就绪/忙,主要用于在发送完编程/擦除命令后,检测这些操作是否完成,忙,表示编程/擦除操作仍在进行中,就绪表示操作完成.

9.?Vcc:Power,电源

10.?Vss:Ground,接地

11.?N.C:Non-Connection,未定义,未连接。

三、NAND Flash命令

? ? ? ? NAND Flash的操作都是通过发送命令来实现的,以下是某NAND Flash芯片的命令集。其中有的操作需要两个命令,如页编程操作(就是写操作),其中第一个命令实际上只是将数据写到NAND Flash的页缓冲区,需要发送第二个命令后,NAND Flash才会将数据真正的写入某个页中。


四、地址周期

? ? ?NAND Flash的地址周期需要根据具体的NAND芯片来决定,现在大的NAND Flash一般有5个地址周期,以前小的可能只有4个地址周期。物理地址=块大小*块号+页大小*页号+页内地址。如下为某NAND芯片的地址周期,其中前两个地址周期称为列地址,表示页内地址后3个地址周期称为行地址,A12~A17为页号,A18~A30为块号(具体的范围需要根据NAND 芯片决定)。


五、坏块

坏块种类:

? ??第一种是出厂时就有的坏块,称为factory bad block,在出厂前就会对其做标记。

? ??第二种是在使用过程中产生的坏块,称为worn-out bad block。在使用过程中进行块擦除时出错了,说明这个块坏了,这个时候就需要将这个块标记为坏块。

坏块标记:

? ? NAND Flash坏块标记的位置三种情况:每个块的第1页、第1页和第2页、最后1页。对于小页(512Bytes大小),坏块标记是在OOB区域的第6个字节。对于大页(如2K大小),坏块标记是在OOB区域的第1个字节。如果坏块标记字节是0xff,则说明这个块是好块,否则就是坏块。

坏块管理:

? ? 在linux系统中会使用坏块表(BBT)对坏块进行管理。在加载NAND驱动时,如果你没有加入参数主动要求跳过坏块扫描,那么系统都会扫描坏块,并建立BBT。使用中可以通过BBT来查询某个块是否是坏块。使用过程中如果发现坏块,也需要更新BBT。坏块表有两种存放方式第一种是存放在内存中,这就要求在每次系统上电后都要重新扫描一次NAND Flash,建立bbt。缺点是使系统启动速度变慢,优点是不需要占用NAND Flash空间。第二种是存放在NAND Flash中,这种方式就不需要在系统上电后重新扫描NAND Flash,只需要去读取就可以了。

六、ECC校验

? ? NAND Flash由于容易出现位反转现象,所以需要使用ECC校验来检测错误和纠正错误。如果NAND控制器有硬件ECC功能,那么我们就不需要关心具体的ECC算法,只要从相应的寄存器中获取ECC值就可以了。在linux的NAND Flash驱动中我们会定义一个nand_ecclayout结构体变量,用来存放ECC校验相关的信息,这个变量各成员的数值需要根据具体的NAND Flash芯片来定义。如在pl353_nand.c驱动中有如下定义:

static struct nand_ecclayout nand_oob_16 = { //16表示这个NAND Flash芯片中每页有16个字节的OOB区域
	.eccbytes = 3,//一页需要多少个字节的ECC校验值
	.eccpos = {0,1,2},//这些ECC校验值在OOB中的存放位置
	.oobfree = {//其他空闲的OOB位置
		{.offset = 8,//空闲OOB的起始位置
		 . length = 8} }//空闲OOB的长度
};

七、NAND Flash的ID

? ? 通过发送命令0x90读取NAND Flash的ID,驱动可以根据ID来获取这个NAND Flash芯片的一些基本参数,如页大小和块大小等。不同的NAND Flash的ID长度可能有点区别(有的是5个字节,有的是8个字节等),不过最重要的应该是ID的前4个字节数据。

ID的第1个字节:

代表厂商ID,即这个NAND Flash是哪家公司生产的。在linux的nand_ids.c文件中定义了一个nand_manuf_ids数组,用来存放所有厂商各自对应的厂商ID号。

ID的第2个字节:

代表设备ID,不同的设备ID对应不同的容量和物理参数的Flash。在linux的nand_ids.c文件中定义了一个nand_flash_ids的数组,用来存放目前所支持的各种类型NAND Flash的物理参数,如芯片容量、块大小、页大小等。如果这个数组中的某个设备ID没有指明页大小,那么就需要根据ID的第4个字节来获取该NAND Flash的页大小等参数。

ID的第3个字节:


Internal Chip Number-->NAND Flash内部有几颗芯片。有些型号的NAND Flash为了实现高容量,在芯片内部封装了多个芯片。

Cell Type-->芯片是SLC还是某种MLC。SLC表示一个存储单元只能存储1位数据,MLC表示一个存储单元能存储多位数据。

Number of Simultaneously Prgrammed Pages-->可以对几个页同时写。硬件上必须要有多个plane,而每个plane都要有一个页寄存器。

ID的第4个字节:


Page Size-->页大小。如果在nand_flash_ids中没有指明这个NAND Flash芯片对应的页大小,那么就需要从这个字节的ID中获取NAND Flash的参数。

Block Size-->块大小。

Redundant Area Size-->即OOB区域的大小。

Organization-->表示硬件I/O位宽(Bus Width)是8位还是16位的。

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读