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

Samsung K9F1G08U0D SLC NAND FLASH简介(待整理)的更多相关文章

  1. 转 -- OK6410 tftp下载内核、文件系统以及nand flash地址相关整理、总结

    转载地址:http://emouse.cnblogs.com/ 飞凌官方提供了一键下载烧写linux的方式,相对来说比较方便,但是对于开发来说不够灵活,因此这篇文章把tftp相关的点介绍一下,整理下其 ...

  2. nand flash详解及驱动编写

    https://www.crifan.com/files/doc/docbook/linux_nand_driver/release/html/linux_nand_driver.html#nand_ ...

  3. 如何编写linux下nand flash驱动-4

    2.       软件方面 如果想要在Linux下编写Nand Flash驱动,那么就先要搞清楚Linux下,关于此部分的整个框架.弄明白,系统是如何管理你的nand flash的,以及,系统都帮你做 ...

  4. u-boot分析(九)----nand flash初始化|nand flash读写分析

    u-boot分析(九) 上篇博文我们按照210的启动流程,分析到了初始化串口,由于接下来的取消存储保护不是很重要,所以我们今天按照u-boot的启动流程对nand flash初始化进行分析. 今天我们 ...

  5. S5PV210 NAND Flash

    NAND Flash 关于NAND FlashS5PV210的NAND Flash控制器有如下特点:1) 支持512byte,2k,4k,8k的页大小2) 通过各种软件模式来进行NAND Flash的 ...

  6. NAND Flash内部结构简介

    介绍     1965年,在双极管被W.Shockley.W.Brattain和J.Bardeen三人发明出来之后,Intel的合作创始人Gordon Moore发现了这样一条法则:当价格不变时,集成 ...

  7. Nand flash 三种类型SLC,MLC,TLC【转】

    转自:https://blog.csdn.net/fc34235/article/details/79584758 转载自:http://diy.pconline.com.cn/750/7501340 ...

  8. Nand Flash基础知识与坏块管理机制的研究

    概述 Flash名称的由来,Flash的擦除操作是以block块为单位的,与此相对应的是其他很多存储设备,是以bit位为最小读取/写入的单位,Flash是一次性地擦除整个块:在发送一个擦除命令后,一次 ...

  9. nand flash 的oob 及坏块管理

    0.NAND的操作管理方式      NAND FLASH的管理方式:以三星FLASH为例,一片Nand flash为一个设备(device),1 (Device) = xxxx (Blocks),1 ...

随机推荐

  1. [工作问题总结]MyEclipse 打开项目

    ------------------------------ASP.Net+Android+IO开发 .Net培训 期待与您交流!------------------------------ 1.项目 ...

  2. java多态的理解----部分非原创

    所谓多态,其实就是对于同一件事情,不同的对象要采取不同的行为,或者同一个对象在不同的情况下需要采取不同的行为方式. 不同的对象要采取不同的行为: 这有两种实现方式:接口实现和子类重新父类方法.这两种实 ...

  3. BOOST 线程完全攻略 - 扩展 - 可被关闭的线程类

    本文假设读者已经基本了解boost线程库的使用方法. boost是个开源工程,线程这一块也在不断完善之中,到现在这个阶段,boost::thread仅仅实现了一个完美的技术框架,但是读者在实际使用中会 ...

  4. "git rm" 和 "rm" 的区别

    "git rm" 和 "rm" 的区别 FEB 3RD, 2013 | COMMENTS 这是一个比较肤浅的问题,但对于 git 初学者来说,还是有必要提一下的 ...

  5. DE2带的IP核ISP12362报错问题解决 Error:avalon_slave_1_irq: associatedAddressablePoint out of range

    问题来源与对友晶提供的ISP1362 IP核的使用,由于Quartus II版本问题,它提供的IP基于7.0版本,而我用的版本为11.1,在SOPC Builder中重新加载IP,就出现了上述的错误报 ...

  6. MyBatis一次执行多条SQL语句

    MyBatis一次执行多条SQL语句 有个常见的场景:删除用户的时候需要先删除用户的外键关联数据,否则会触发规则报错. 解决办法不外乎有三个:1.多条sql分批执行:2.存储过程或函数调用:3.sql ...

  7. MBTI性格测试

    INFP 哲学家型——生活在自己的理想世界 报告接收人: 才储成员4361454 日期: 2014/9/2 一.你的MBTI图形 倾向示意图表示四个维度分别的倾向程度.从中间往两侧看,绿色指示条对应下 ...

  8. 表单元素-select

    <form> <select size="2"> <option value="JMS HADEN">JMS HADEN&l ...

  9. eclipse中Java代码导入包,出现main.java前缀

    1.工程右击,按照下图指示的选择 2.按照下图,进行删除选中项,然后点击OK保存

  10. Telnet运用and Sqlserver connection failed

    今天的工作中,需要远程访问服务器上的数据库.但是,连接错误,Error code is 1326.说句实话,关于SqlServer 不能远程访问这个问题,我遇到过N次.可是每次都不认真去研究到底是什么 ...