嵌入式Linux裸机开发(十一)——Nandflash

嵌入式Linux裸机开发(十一)——Nandflash

一、Nand Flash简介

    NandFlashFlash的一种,具有容量较大,改写速度快等优点,适用于大量数据的存储NandFlash没有专门的地址线发送指令地址和数据都通过8/16位宽的总线(I/O接口)到内部的寄存器。

    NandFlash分为SLC和MLC两类。SLC全称为Single-Level Cell,单层单元闪存,MLC全称为Multi-Level Cell,多层单元闪存。SLC每一个单元储存一位数据,而MLC通过使用大量的电压等级,每一个单元储存两位数据,数据密度比较大。SLC晶片生产成本较高,在效能上大幅胜于MLC。SLC晶片可重复写入次数约10万次,而MLC晶片的写入次数至少要达到1万次才算标准MLC缺点有:读写速度较慢MLC能耗比SLC高MLC理论写入次数上限相对较少MLC的价格比SLC低

二、NandFlash存储器结构

1NandFlash存储器结构

    NAND Flash存储器由block (块) 构成, block的基本单元是page (页)。每一个block由16, 32或64个page组成。大多数的NAND Flash器件每一个page (页)内包含512个字节的Data area(数据存储区域)扩展的16字节的 Spare area(备用区域)。每一个page的大小为512+16=528字节,称为small page

    大容量的(1Gbig或更多)的NAND Flash,page的容量较大, 每page内Data area(数据存储区域)的大小为2048字节, Spare area(备用区域)大小为64字节。

650) this.width=650;" src="http://s5.51cto.com/wyfs02/M00/82/8F/wKiom1daN1WQtb1kAAGdQPXMG0M416.png" title="图片1.png" alt="wKiom1daN1WQtb1kAAGdQPXMG0M416.png" />

650) this.width=650;" src="http://s5.51cto.com/wyfs02/M00/82/8D/wKioL1daOHGAIp1ZAAF89uwMxJg829.png" title="图片2.png" alt="wKioL1daOHGAIp1ZAAF89uwMxJg829.png" />

    NAND Flash的读取和烧录以页为基础, 而NORFlash以字节或字为基础。 NAND Flash的擦除操作是基于block (块)的。在NAND Flash上有三种基本的操作:读取一个页, 烧录一个页和擦除一个块。

    在一个页的读取操作中, 该页内528字节的数据首先被传输到数据寄存器中, 然后再输出。在一个页的烧录中, 该页内528字节的数据首先被写进数据寄存器, 然后再存储到存储阵列中。在一个块的擦除操作中, 一组连续的页在单独操作下被擦除。

2备用单元结构

    

NAND Flash厂商在生产制程中使用Spare area(备用区域)来标识bad block,  Spare area(备用区域)内所有的字节都可以像Data area(数据存储区域)内的字节一样被用户用来存储数据。

650) this.width=650;" src="http://s3.51cto.com/wyfs02/M01/82/8F/wKiom1daN6Dzxq5dAAM7LPfdNRw188.png" title="图片3.png" alt="wKiom1daN6Dzxq5dAAM7LPfdNRw188.png" />

650) this.width=650;" src="http://s3.51cto.com/wyfs02/M01/82/8D/wKioL1daOMLhLMecAASEp4rtkRs942.png" title="图片4.png" alt="wKioL1daOMLhLMecAASEp4rtkRs942.png" />


3Bad block (Invalid block)管理

自从NAND结构被设计用来作为低成本的多媒体存储器, 标准规范中是允许存在bad block的。只要bad block的容量小于总容量的2% 那就是允许的。一个block中如果有坏的存储区域, 那它就会被标识成bad block 。 bad block 列表可以存储在一个芯片中的一个好的block上, 也可以存储在同一系统的另外一颗芯片上。bad block列表是被要求的, 由于NAND Flash只能执行有限的读和擦除次数。由于所有的Flash存储器最终都会被磨损而且不能再使用, bad block列表需要被用来跟踪记录那些在使用中发现的bad block 。允许bad block 的存在有利于提高芯片的产量,同时也降低了成本。每个block是独立的, 而且是被bit lines隔离的, bad block 的存在并不会影响那些其他block的正常工作。

    Bad block 的一般分为两种: 生产过程中产生的; 使用过程中产生的。当block被发现是bad block , 一般是在该块的前两个page (页)的第517字节处用非FF来标识。使用过程中产生的bad block 是没有被工厂标识的

A、Skip Block method(跳过坏块方式)

    先读取存储器内的所有备用区域。那些被标识成bad block的地址都被收集起来。接下来, 数据被连续的写入目标FLASH器件。当目标地址与先前收集的bad block 地址一致时, 跳过坏块, 数据被写到下一个好的块中。然后继续保留bad block 中备用区域的标识信息。所以在程序导入执行之前, 使用者的系统通过读取Spare area(备用区域)的信息能建立一个bad block 的地址列表。

650) this.width=650;" src="http://s3.51cto.com/wyfs02/M02/82/8F/wKiom1daN9vydapOAAGFrm-uib0836.png" title="图片5.png" alt="wKiom1daN9vydapOAAGFrm-uib0836.png" />

B、Reserved Block Area method(保留块区域方式)

    bad block 在使用者的系统中能够被好block (块)所替代。

650) this.width=650;" src="http://s5.51cto.com/wyfs02/M02/82/8D/wKioL1daOQSAj_BVAAIRtlVeOPU279.png" title="图片6.png" alt="wKioL1daOQSAj_BVAAIRtlVeOPU279.png" />

C、Error Checking and Correction(错误检测和纠正)
        使用ECC纠错机制是为了让存储的数据完整无误

三、NandFlash接口

    NandFlash芯片内部有存储颗粒和内部管理接口电路,外部SoC根据NandFlash接口时序访问NandFlash芯片。S5PV210内部集成了NandFlash控制器。

650) this.width=650;" src="http://s4.51cto.com/wyfs02/M00/82/8D/wKioL1daOU7TYfi-AAEbyfwCzHU828.png" title="图片7.png" alt="wKioL1daOU7TYfi-AAEbyfwCzHU828.png" />

NandFlash引脚功能如下:

650) this.width=650;" src="http://s4.51cto.com/wyfs02/M02/82/8D/wKioL1daOW2hx0-8AAL9bE5mwVI432.png" title="图片8.png" alt="wKioL1daOW2hx0-8AAL9bE5mwVI432.png" />

NandFlash命令码:

650) this.width=650;" src="http://s1.51cto.com/wyfs02/M01/82/8D/wKioL1daOZOR8eAGAAExh35XACU365.png" title="图片9.png" alt="wKioL1daOZOR8eAGAAExh35XACU365.png" />

    NandFlash芯片内部接口电路可以接收外部SoC发送的命令,与SoC交互。外部SoC对NandFlash芯片的操作都必须按照NandFlash规定的时序进行。

三、NandFlash常见操作

1、坏块检查

    NandFlash使用前需要统一擦除(按块擦除),擦除后填充1。擦除块,将块中的每个字节与0xFF比较,如果不是0xFF,是坏块。

2、页烧录(页写操作)

    页烧录前需要擦除,如果页烧录之前没有擦除,烧录的数据将是错误的。烧时,SoC通过命令线、IO线依次发送烧录命令、烧录地址、烧录数据等进入NandFlash。NandFlash芯片接口电路接收页数据到缓冲区,再集中烧录到NandFlash的存储颗粒。烧录过程需要一定时间,SoC的NandFlash控制器需要等待NandFlash烧录完,等待过程中SoC的NandFlash控制器将会不断读取页烧录状态。SoC的NandFlash控制器收到正确的状态响应时,确认页烧录已经成功,如果一直未收到正确的状态,则认为烧录页所在的块是坏块。

650) this.width=650;" src="http://s4.51cto.com/wyfs02/M00/82/8F/wKiom1daOLbhoWJ5AACkirgxuC0773.png" title="图片10.png" alt="wKiom1daOLbhoWJ5AACkirgxuC0773.png" />

页烧录编程流程如下:

A、发出片选信号

B、发送页烧录命令第一个周期命令0x80

C、随机写页内某个地址的值

D、发送页写命令0x85

E、写入页内偏移地址

F、写入数据

G、发送页烧录命令第二个周期命令0x10

H、等待状态

I、读取状态,页烧录成功取消片选信号,失败取消片选信号

3、块擦除

650) this.width=650;" src="http://s3.51cto.com/wyfs02/M00/82/8E/wKioL1daOfOy1-lrAACmzqCZa10270.png" title="图片11.png" alt="wKioL1daOfOy1-lrAACmzqCZa10270.png" />


    擦除操作必须指定块对齐的地址。块擦除编程流程如下:

A、获取擦除块的地址(块对齐)

B、发出片选信号

C、发送擦除命令,第一个周期发命令0x60,第二个周期发块地址,第三个周期发命令0xd0 。

D、清除状态,等待状态。

E、读取状态,擦除成功则取消片选,擦除失败取消片选。

4、页读取

页读取编程流程:

650) this.width=650;" src="http://s1.51cto.com/wyfs02/M01/82/8F/wKiom1daOQqjEMroAACLGBLnSZQ395.png" title="图片12.png" alt="wKiom1daOQqjEMroAACLGBLnSZQ395.png" />

A、发出片选信号

B、发送页读取命令,第一个周期发命令0x00,第二个周期发送页地址,第三个周期发送命令0x30

C、等待状态

D、发送页读取第一个周期命令0x05

E、写入页内偏移地址

F、发送页读取第二个周期命令0xE0

G、读取数据

H、检查状态,如果读取成功,取消片选信号,读取失败取消片选信号。

五、S5PV210 NandFlash控制器

    NandFlash控制器的主要特性:

    支持512B,2KB,4KB,8KB页的NandFlash

    软件模式:能直接访问NandFlash芯片,支持读/烧录/擦除NandFlash芯片

    支持8bit的NandFlash芯片接口总线

    产生、检测、指示硬件ECC

    支持SLC/MLC类型NandFlash芯片

    支持1/4/8/12/16位的ECC

    SFR接口:支持字节、半字、字访问数据和ECC数据寄存器,字访问其他寄存器。

    SoC通过控制SFR(NandFlash控制器)

650) this.width=650;" src="http://s5.51cto.com/wyfs02/M00/82/8F/wKiom1daOTbgxbGHAAC8A5AaDoI081.png" title="图片13.png" alt="wKiom1daOTbgxbGHAAC8A5AaDoI081.png" />


NFCONFNandFlash配置寄存器

NFCONTNandFlash控制寄存器

NFCMMDNandFlash命令寄存器

NFADDRNandFlash地址寄存器

NFDATANandFlash数据寄存器

NFSBLK:烧录块起始地址

NFEBLK:烧录块结束地址

NFSTAT:状态寄存器

六、NandFlash编程实践

    Smart210的NandFlash为512MB的SLC类型。

    电路原理图查阅

    查阅核心板电路原理图有关NandFlash部分,

650) this.width=650;" src="http://s2.51cto.com/wyfs02/M01/82/8E/wKioL1daOmHimBMeAAFRLvxo7fc281.png" title="图片14.png" alt="wKioL1daOmHimBMeAAFRLvxo7fc281.png" />

    NandFlash片选信号引脚为Xm0CSn2,在核心板电路原理图搜Xm0CSn2可知,NandFlash接在Memory Port0,对应GPIO为MP01-MP03

650) this.width=650;" src="http://s2.51cto.com/wyfs02/M02/82/8F/wKiom1daOXPixvAoAADT_iqXxOk399.png" title="图片15.png" alt="wKiom1daOXPixvAoAADT_iqXxOk399.png" />


GPIO配置如下:

MP0_1CON = 0x22333322;

MP0_2CON = 0x00002222;

MP0_3CON = 0x22222222;

 

    工程源代码见附件,编译后在Smart210烧录可以正常运行,可以正常的对NnandFlash进行擦除、烧录、读取等测试操作。

参考博文:

NandFlash简介 CSDN 喝醉的毛毛虫

本文出自 “生命不息,奋斗不止” 博客,请务必保留此出处http://9291927.blog.51cto.com/9281927/1787752

你可能感兴趣的:(ARM汇编程序设计)