NANDflash详解_nand flash pagesize-程序员宅基地

技术标签: 硬件  

本文转载自:https://www.linuxidc.com/Linux/2012-10/73065.htm

Nand Flash详细分析

NAND技术在设计之初是为了数据存储应用,nand的写回速度比较快,芯片面积小,特别容量大有很大的优势

  1. NAND的地址分为三部分:块号,块内页号,页内字节号;正因为如此,NAND的一次数据访问,要经过3次寻址,先后确定块号,块内页号,页内字节号,至少占用了三个时间周期。因此:NAND FLASH的一个劣势出来了:随机字节读写速度慢。但是nand flash平均每MB成本比nor flash少了三,四倍。所有NAND FLASH的容量可以做的比较大。
  1. Nand flash 的数据是以bit的方式保存在memory cell,一个cell里面只能存储一个bit。这些cell8个或者16个为单元,连成bit line,形成所谓的byte(X8)/word(X16),这就是NAND Device的位宽。这些line会再组成pagepage又分为main area(一般用来做普通数据的存储区)spare area(一般用于在读写操作的时候存放效验码等额外数据用的),最后再又多个page形成一个block
  2. NAND flash以页为单位读写数据,而以块为单位擦除数据。按照这样的组织方式可以形成所谓的三类地址:

――Block address――page address――column address

对于NANDFLASH来说,地址,命令和数据都只能在I/O[7:0]上传递,数据宽度为8bits16bits

下面解释一下块地址,列地址,行地址,还有页寄存器(page Register)的含义:

    在擦除数据的时候块地址会被用到。

  1. 块地址block address:如果一个块有32page,一个page512byte。那么一个block32×512byte。所以块地址由A[14]以上的位来表示。32Mbytes的有32*1024*1024/32/512 = 2048block需要占用11bit,即A[24:14]

    对Nand flash的访问中,地址由列地址和行地址两部分组成。

        列地址column address:列地址表示在页内以byte(如果是X16,则以word)为单元的页内偏移量;    

        行地址(页地址)row address:指page在整个nand芯片中的索引。

    以下列举3个不同大小型号的nand flash进行说明:

SAMSUNG_K9F5608X0D(512Bytes(没有包括16Bytes spare)*32pages*2048blocks=32Mbytes)需要3个地址周期

 

列地址:A[7:0] 第一个地址周期发出,对于X8nandflash来说,如果要把A[8]也编进列地址里面去,那么整个地址传输需要4个周期完成,所以为了节省一个周期,K9F5608X0D把页内分为A(1 half array)区,B(2 half array)区。A0255字节,B256511字节。访问某页时必须通过A[8]选定特定的区,A[8]则由操作指令决定的,00h,在A区;01hB区。所以传输地址时A[8]不需要传输。对于X16nand flash来说,由于一个page main area 的容量为256word,仍相当于512byte。但是,这个时候没有所谓的1st halfpage 2nd halfpage 之分了,所以,bit8就变得没有意义了,也就是这个时候 A8 完全不用管,地址传递仍然和x8 器件相同。除了这一点之外,x16NAND使用方法和 x8 的使用方法完全相同。

行地址:A[24:9]由第23个地址周期发出;

SAMSUNG_K9F1208(512Bytes(不包括16Bytes spare)*32pages*4096blocks=64MBytes)需要4个地址周期

 

列地址:A[7:0] 第一个地址周期发出,同上;

行地址:A[25:9]由第234个地址周期发出,A[25]以上的各位必须被设置为L

SAMSUNG_K9F1G08U0B(2048Bytes(不包括64Bytes spare)*64pages*1024blocks=128MBytes)需要4个地址周期

这里有个问题2048不是用11bits就可以表示了吗?为什么还要用到A[11:0]12bits?????此处求解


 

列地址:A[11:0] 12个地址周期发出,如图*L位要置为low

行地址:A[27:12]由第34个地址周期发出;

 

 页寄存器:由于对nand flash读取和编程操作,一般最小单位是page。所以nand在硬件设计时候,对每一片都有一个对应的区域用于存放将要写入到物理存储单元中区的或者刚从存储单元中读取出来的一页的数据,这个数据缓存区就是页缓存,也叫页寄存器。所以实际上写数据只是写到这个页缓存中,只有等你发了对应的编程第二阶段的确认命令0x10之后,实际的编程动作才开始把页缓存一点点的写到物理存储单元中去,这也就是为什么发完0x10之后需要等待一段时间的原因。


  1. 接下来解释一下一般nand flash(SAMSUNG_K9F5608X0D)管脚的说明(后面#或前面n后上面-都表示低电平有效):

 

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

CE#  :  片选管脚

CLE        : command latch enable ,命令锁存使能,在输入命令之前必须使其有效

ALE  :    Address latch enable ,地址锁存使能,在输入地址前必须使其有效

RE#    : read enable,读使能,在读数据之前要先使其有效

WR#  : Write enable,写使能,在写数据之前要先使其有效

WP#  :write Protect,写保护

R/B#   :Ready/Busy Output ,就绪/忙,主要用于在发送完编程/擦除后,检测这些操作是否完成。

Vcc     :Power,电源

Vss     :Ground,接地

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

 

以下是关SAMSUNG_K9F5608X0D注意:其它型号命令与时序图可能会有所不同,具体区别可以查阅相关芯片的datasheet命令设置表:

 

Read status读取状态寄存器命令;

 

ReadID 读芯片ID命令;ECh是制造厂商代码,Device code 是设备号

 

Read1    :读data field命令,(00h->1stfield,01h->2nd field)从写入地址开始读,读到此页最后一个byte(包括了sparefield);

 

以下是针对连续row read的时序图,连续row read不会被中止直到CE管脚被拉高(sequential row read 只对于K9F5608U0D_P,F orK9F5608B0D_P有效):

 

Read2 :读sparefield命令;

Reset  : 复位命令,当nand flash还在忙状态(随机读取,写数据或者擦除期间)的时候,如果接收到复位命令则会中止当前这些操作,并且这些正在被改变的存储单元里面的内容不再有效。之后命令寄存器会被清除用于等待下一个命令。

 

 

Page program:写命令,从写入地址开始写,写到此页最后一个byte(包括了sparefield);(这里需要注意:发写命令之前要先写入页内区域选择命令;00h->A(默认)01h->B

 

Copy-Back program:   从源地址某个区开始处把数据快速有效地拷贝到目标地址的同一个区域直到页的最后一个byte而不需要通过外部memory。

 

Block Erase:块擦除,从A[9](因为页内只有512byte故列地址占用A[8:0])以上的地址发出,但是A[13:9]将不被理睬,应该块地址是从A[14]以上位才有效的。



Nand Flash中,一个块中含有1个或多个位是坏的,就成为其为坏块。

坏块的稳定性是无法保证的,也就是说,不能保证你写入的数据是对的,或者写入对了,读出来也不一定对的。而正常的块,肯定是写入读出都是正常的。

坏块有两种:

1)一种是出厂的时候,也就是,你买到的新的,还没用过的Nand Flash,就可以包含了坏块。此类出厂时就有的坏块,被称作factory (masked)bad blockinitial bad/invalid block,在出厂之前,就会做对应的标记,标为坏块。

具体标记的地方是,对于现在常见的页大小为2KNandFlash,是块中第一个页列地址为2048的位置(旧的小页面,pagesize512B甚至256Bnandflash,坏块标记是spare area的第6个字节),如果不是0xFF,就说明是坏块。相对应的是,所有正常的块,好的块,里面所有数据都是0xFF的。

2)第二类叫做在使用过程中产生的,由于使用过程时间长了,在擦块除的时候,出错了,说明此块坏了,也要在程序运行过程中,发现,并且标记成坏块的。具体标记的位置,和上面一样。这类块叫做worn-out bad block

对于坏块的管理,在Linux系统中,叫做坏块管理(BBMBad Block Managment),对应的会有一个表去记录好块,坏块的信息,以及坏块是出厂就有的,还是后来使用产生的,这个表叫做坏块表(BBTBad Block Table)。在Linux内核MTD架构下的Nand Flash驱动,和UbootNand Flash驱动中,在加载完驱动之后,如果你没有加入参数主动要求跳过坏块扫描的话,那么都会去主动扫描坏块,建立必要的BBT的,以备后面坏块管理所使用。(这样每次使用之之前,都会自动扫描一下,建立BBT,这样就可以跳过怀块进行别的方面的处理了)

  1. 关于好的,可以使用的块的数目达到一定的数目,比如三星的K9G8G08U0M,整个flash一共有4096个块,出厂的时候,保证好的块至少大于3996个,也就是意思是,你新买到这个型号的nand flash,最坏的可能,有30963996100个坏块。不过,事实上,现在出厂时的坏块,比较少,绝大多数,都是使用时间长了,在使用过程中出现的。
    2.保证第一个块是好的,并且一般相对来说比较耐用。做此保证的主要原因是,很多Nand Flash坏块管理方法中,就是将第一个块,用来存储上面提到的BBT,否则,都是出错几率一样的块,那么也就不太好管理了,连放BBT的地方,都不好找了,^_^。一般来说,不同型号的Nand Flash的数据手册中,也会提到,自己的这个nand flash,最多允许多少个坏块。就比如上面提到的,三星的K9G8G08U0M,最多有100个坏块。 对于坏块的标记,本质上,也只是对应的flash上的某些字节的数据是非0xFF而已,所以,只要是数据,就是可以读取和写入的。也就意味着,可以写入其他值,也就把这个坏块标记信息破坏了。对于出厂时的坏块,一般是不建议将标记好的信息擦除掉的。uboot中有个命令是“nand scrub”就可以将块中所有的内容都擦除了,包括坏块标记,不论是出厂时的,还是后来使用过程中出现而新标记的。一般来说,不建议用这个。不过,我倒是经常用,其实也没啥大碍,呵呵。
    最好用“
    nand erase”只擦除好的块,对于已经标记坏块的块,不擦除。
    nand Flash中页的访问顺序】

在一个块内,对每一个页进行编程的话,必须是顺序的,而不能是随机的。比如,一个块中有128个页,那么你只能先对page0编程,再对page1编程,。。。。,而不能随机的,比如先对page3,再page1page2.page0page4.。。。

【片选无关(CEdon’t-care)技术】

没明白什么意思?很多Nand flash支持一个叫做CE don’t-care的技术,字面意思就是,不关心是否片选,那有人会问了,如果不片选,那还能对其操作吗?答案就是,这个技术,主要用在当时是不需要选中芯片却还可以继续操作的这些情况:在某些应用,比如录音,音频播放等应用中,外部使用的微秒(us)级的时钟周期,此处假设是比较少的2us,在进行读取一页或者对页编程时,是对Nand Flash操作,这样的串行(SerialAccess)访问的周期都是20/30/50ns,都是纳秒(ns)级的,此处假设是50ns,当你已经发了对应的读或写的命令之后,接下来只是需要Nand Flash内部去自己操作,将数据读取或写入进去到内部的数据寄存器中而已,此处,如果可以把片选取消,CE#是低电平有效,取消片选就是拉高电平,这样会在下一个外部命令发送过来之前,即微秒量级的时间里面,即2us50ns2us,这段时间的取消片选,可以降低很少的系统功耗,但是多次的操作,就可以在很大程度上降低整体的功耗了。

总结起来简单解释就是:由于某些外部应用的频率比较低。


版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。
本文链接:https://blog.csdn.net/qq_34127958/article/details/79608241

智能推荐

HTML5 Web SQL 数据库_方式准则的定义-程序员宅基地

文章浏览阅读1k次。1、HTML5 Web SQL 数据库 Web SQL 数据库 API 并不是 HTML5 规范的一部分,但是它是一个独立的规范,引入了一组使用 SQL 操作客户端数据库的 APIs。如果你是一个 Web 后端程序员,应该很容易理解 SQL 的操作。Web SQL 数据库可以在最新版的 Safari, Chrome 和 Opera 浏览器中工作。2、核心方法 以下是规范中定义的三个_方式准则的定义

spring Boot 中使用线程池异步执行多个定时任务_springboot启动后自动开启多个线程程序-程序员宅基地

文章浏览阅读4.1k次,点赞2次,收藏6次。spring Boot 中使用线程池异步执行多个定时任务在启动类中添加注解@EnableScheduling配置自定义线程池在启动类中添加注解@EnableScheduling第一步添加注解,这样才会使定时任务启动配置自定义线程池@Configurationpublic class ScheduleConfiguration implements SchedulingConfigurer..._springboot启动后自动开启多个线程程序

Maven编译打包项目 mvn clean install报错ERROR_mvn clean install有errors-程序员宅基地

文章浏览阅读1.1k次。在项目的target文件夹下把之前"mvn clean package"生成的压缩包(我的是jar包)删掉重新执行"mvn clean package"再执行"mvn clean install"即可_mvn clean install有errors

navacate连接不上mysql_navicat连接mysql失败怎么办-程序员宅基地

文章浏览阅读974次。Navicat连接mysql数据库时,不断报1405错误,下面是针对这个的解决办法:MySQL服务器正在运行,停止它。如果是作为Windows服务运行的服务器,进入计算机管理--->服务和应用程序------>服务。如果服务器不是作为服务而运行的,可能需要使用任务管理器来强制停止它。创建1个文本文件(此处命名为mysql-init.txt),并将下述命令置于单一行中:SET PASSW..._nvarchar链接不上数据库

Python的requests参数及方法_python requests 参数-程序员宅基地

文章浏览阅读2.2k次。Python的requests模块是一个常用的HTTP库,用于发送HTTP请求和处理响应。_python requests 参数

近5年典型的的APT攻击事件_2010谷歌网络被极光黑客攻击-程序员宅基地

文章浏览阅读2.7w次,点赞7次,收藏50次。APT攻击APT攻击是近几年来出现的一种高级攻击,具有难检测、持续时间长和攻击目标明确等特征。本文中,整理了近年来比较典型的几个APT攻击,并其攻击过程做了分析(为了加深自己对APT攻击的理解和学习)Google极光攻击2010年的Google Aurora(极光)攻击是一个十分著名的APT攻击。Google的一名雇员点击即时消息中的一条恶意链接,引发了一系列事件导致这个搜_2010谷歌网络被极光黑客攻击

随便推点

微信小程序api视频课程-定时器-setTimeout的使用_微信小程序 settimeout 向上层传值-程序员宅基地

文章浏览阅读1.1k次。JS代码 /** * 生命周期函数--监听页面加载 */ onLoad: function (options) { setTimeout( function(){ wx.showToast({ title: '黄菊华老师', }) },2000 ) },说明该代码只执行一次..._微信小程序 settimeout 向上层传值

uploadify2.1.4如何能使按钮显示中文-程序员宅基地

文章浏览阅读48次。uploadify2.1.4如何能使按钮显示中文博客分类:uploadify网上关于这段话的搜索恐怕是太多了。方法多也试过了不知怎么,反正不行。最终自己想办法给解决了。当然首先还是要有fla源码。直接去管网就可以下载。[url]http://www.uploadify.com/wp-content/uploads/uploadify-v2.1.4...

戴尔服务器安装VMware ESXI6.7.0教程(U盘安装)_vmware-vcsa-all-6.7.0-8169922.iso-程序员宅基地

文章浏览阅读9.6k次,点赞5次,收藏36次。戴尔服务器安装VMware ESXI6.7.0教程(U盘安装)一、前期准备1、下载镜像下载esxi6.7镜像:VMware-VMvisor-Installer-6.7.0-8169922.x86_64.iso这里推荐到戴尔官网下载,Baidu搜索“戴尔驱动下载”,选择进入官网,根据提示输入服务器型号搜索适用于该型号服务器的所有驱动下一步选择具体类型的驱动选择一项下载即可待下载完成后打开软碟通(UItraISO),在“文件”选项中打开刚才下载好的镜像文件然后选择启动_vmware-vcsa-all-6.7.0-8169922.iso

百度语音技术永久免费的语音自动转字幕介绍 -程序员宅基地

文章浏览阅读2k次。百度语音技术永久免费的语音自动转字幕介绍基于百度语音技术,识别率97%无时长限制,无文件大小限制永久免费,简单,易用,速度快支持中文,英文,粤语永久免费的语音转字幕网站: http://thinktothings.com视频介绍 https://www.bilibili.com/video/av42750807 ...

Dyninst学习笔记-程序员宅基地

文章浏览阅读7.6k次,点赞2次,收藏9次。Instrumentation是一种直接修改程序二进制文件的方法。其可以用于程序的调试,优化,安全等等。对这个词一般的翻译是“插桩”,但这更多使用于软件测试领域。【找一些相关的例子】Dyninst可以动态或静态的修改程序的二进制代码。动态修改是在目标进程运行时插入代码(dynamic binary instrumentation)。静态修改则是直接向二进制文件插入代码(static b_dyninst

在服务器上部署asp网站,部署asp网站到云服务器-程序员宅基地

文章浏览阅读2.9k次。部署asp网站到云服务器 内容精选换一换通常情况下,需要结合客户的实际业务环境和具体需求进行业务改造评估,建议您进行服务咨询。这里仅描述一些通用的策略供您参考,主要分如下几方面进行考虑:业务迁移不管您的业务是否已经上线华为云,业务迁移的策略是一致的。建议您将时延敏感型,有快速批量就近部署需求的业务迁移至IEC;保留数据量大,且需要长期稳定运行的业务在中心云上。迁移方法请参见如何计算隔离独享计算资源..._nas asp网站