zoukankan      html  css  js  c++  java
  • s3c2410/s3c2440 nand flash工作原理

    NAND Flash的寻址方式和NAND Flash的memory组织方式紧密相关。NAND Flash的数据是以bit的方式保存在memory cell,一般来说,一个cell中只能存储一个bit。这些cell以8个或者16个为单位,连成bit line,形成所谓的byte(x8)/word(x16),这就是NAND Device的位宽。这些Line会再组成Page,通常是528Byte/page或者264Word/page。然后,每32个page形成一个Block,Sizeof(block)=16kByte Block是NAND Flash中最大的操作单元,擦除就是按照block为单位完成的,而编程/读取是按照page为单位完成的。所以,按照这样的组织方式可以形成所谓的三类地址:

    -Block Address

    -Page Address

    -Column Address

    首先,必须清楚一点,对于NAND Flash来讲,地址和命令只能在I/O[7:0]上传递,数据宽度可以是8位或者16位,但是,对于x16的NAND Device,I/O[15:8]只用于传递数据(此点不是很认同)。清楚了这一点,我们就可以开始分析NAND Flash的寻址方式了。

    以528Byte/page 总容量512Mbit+512kbyte的NAND器件为例:因为1 block="16kbyte",512Mbit="64Mbyte",Numberof(block)=1024 1block="32page", 1page="528byte"=512byte(Main Area)+16byte(Spare Area) 用户数据保存在main area中。512byte需要9bit来表示,对于528byte系列的NAND,这512byte被分成1st half和2nd half, 各自的访问由所谓的pointer operation命令来选择,也就是选择了bit8的高低。因此A8就是halfpage pointer(这是我给出的一个名字),A[7:0]就是所谓的column address。32个page需要5bit来表示,占用A[13:9],即该page在块内的相对地址Block的地址是由A14以上的bit来表示,例如512Mb的NAND,共4096block,因此,需要12个bit 来表示,即A[25:14],如果是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即bit8是由操作指令决定的,即指令决定在哪个halfpage上进行读写,

    而真正的bit8的值是don't care的。

    第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的容量是256Mbit以下,那么,block adress最高位只到bit24,因此寻址只需要3步。

    下面,就x16的NAND flash器件稍微进行一下说明。

            由于一个page的main area的容量为256word,仍相当于512byte。但是,这个时候没有所谓的1st halfpage和2nd halfpage之分了,所以,bit8就变得没有意义了,也就是这个时候bit8完全不用管,地址传递仍然和x8器件相同。除了这一点之外,x16的NAND使用方式和x8的使用方式完全相同。

    1.1 Nand flash 芯片工作原理

    Nand flash芯片型号为Samsung K9F1208U0B,数据存储容量为64MB,采用块页式存储管理。8个I/O引脚充当数据、地址、命令的复用端口。

    1.1.1 芯片内部存储布局及存储操作特点

    一片Nand flash为一个设备(device), 其数据存储分层为:

    1设备(Device) = 4096 块(Blocks)

    1块(Block) = 32页/行(Pages/rows) ;页与行是相同的意思,叫法不一样

    1页(Page) = 528字节(Bytes) = 数据块大小(512Bytes分为前半页和和后半页) + OOB块大小(16Bytes)

    在每一页中,最后16个字节(又称OOB)用于Nand Flash命令执行完后设置状态用,剩余512个字节又分为前半部分和后半部分。可以通过Nand Flash命令00h/01h/50h分别对前半部、后半部、OOB进行定位通过Nand Flash内置的指针指向各自的首地址。

    存储操作特点:

    1. 擦除操作的最小单位是块。

    2. Nand Flash芯片每一位(bit)只能从1变为0,而不能从0变为1,所以在对其进行写入操作之前要一定将相应块擦除(擦除即是将相应块得位全部变为1).

    3. OOB部分的第六字节(即517字节)标志是否是坏块,如果不是坏块该值为FF,否则为坏块。

    4. 除OOB第六字节外,通常至少把OOB的前3个字节存放Nand Flash硬件ECC码(关于硬件ECC码请参看Nandflash 控制器一节).

    1.1.2 重要芯片引脚功能

    I/O0I/O7:复用引脚。可以通过它向nand flash芯片输入数据、地址、nand flash命令以及输出数据和操作状态信息。

    CLE(Command Latch Enable): 命令锁存允许

    ALE(Address Lactch Enable): 地址锁存允许

    CE:芯片选择

    RE:读允许

    WE:写允许

    WP:在写或擦除期间,提供写保护

    R/B:读/忙输出

    1.1.3 寻址方式

    Samsung K9F1208U0B Nand Flash 片内寻址采用26位地址形式。从第0位开始分四次通过I/O0-I/O7进行

    传送,并进行片内寻址。具体含义如下:

    0-7位:字节在上半部、下半部及OOB内的偏移地址

    8位:值为0代表对一页内前256个字节进行寻址

    值为1代表对一页内后256个字节进行寻址

    9-13位:对页进行寻址

    14-25位:对块进行寻址

    当传送地址时,从位0开始

    1.1.4 Nand flash 主要内设命令详细介绍

    Nand Flash命令执行是通过将命令字送到Nand Flash控制器的命令寄存器来执行。

    Nand Flash的命令是分周期执行的,每条命令都有一个或多个执行周期,每个执行周期都有相映代码表示该周期将要执行的动作。

    主要命令有:Read 1、Read 2、Read ID、Reset、Page Program、Block Erase、Read Status。

    详细介绍如下:

    1. Read 1:

    功能:表示将要读取Nand flash存储空间中一个页的前半部分,并且将内置指针定位到前半部分的第一个字节。

    命令代码:00h

    2. Read 2:

    功能:表示将要读取Nand flash存储空间中一个页的后半部分,并且将内置指针定位到后半部分的第一个字节。

    命令代码:01h

    3. Read ID:

    功能:读取Nand flash芯片的ID号

    命令代码:90h

    4. Reset:

    功能:重启芯片。

    命令代码:FFh

    5. Page Program:

    功能:对页进行编程命令, 用于写操作。

    命令代码:首先写入00h(A区)/01h(B区)/05h(C区), 表示写入那个区; 再写入80h开始编程模式(写入模式),接

    下来写入地址和数据; 最后写入10h表示编程结束.

    6. Block Erase

    功能:块擦除命令。

    命令代码:首先写入60h进入擦写模式,然后输入块地址; 接下来写入D0h, 表示擦写结束.

    7. Read Status

    功能:读取内部状态寄存器值命令。

    命令代码:70h

    2 Nand Flash 控制器工作原理

    对Nand Flash存储芯片进行操作, 必须通过Nand Flash控制器的专用寄存器才能完成。所以,不能对NandFlash进行总线操作。而Nand Flash的写操作也必须块方式进行。对Nand Flash的读操作可以按字节读取。

    2.1 Nand Flash 控制器特性

    1. 支持对Nand Flash芯片的读、检验、编程控制

    2. 如果支持从Nand Flash启动, 在每次重启后自动将前Nand Flash的前4KB数据搬运到ARM的内部RAM中

    3. 支持ECC校验

    2.2 Nand Flash 控制器工作原理

    Nand Flash控制器在其专用寄存器区(SFR)地址空间中映射有属于自己的特殊功能寄存器,就是通过将NandFlash芯片的内设命令写到其特殊功能寄存器中,从而实现对Nand flash芯片读、检验和编程控制的。特殊功能寄存器有:NFCONF、NFCMD、NFADDR、NFDATA、NFSTAT、NFECC。寄存详细说明见下一节。

    1. 配置寄存器(NFCONF):用于对Nand Flash控制器的配置状态进行控制。

    2. 命令寄存器(NFCMD):用于存放Nand flash芯片内设的操作命令。

    3. 地址寄存器(NFADDR):用于存放用于对Nand flash芯片存储单元寻址的地址值。

    4. 数据寄存器(NFDATA):Nand flash芯片所有内设命令执行后都会将其值放到该寄存器中。同时,读出、写入Nand flash存储空间的值也是放到该寄存器。

    5. 状态寄存器(NFSTAT):用于检测Nand flash芯片上次对其存储空间的操作是否完成。

    6. ECC校验寄存器(NFECC):ECC校验寄存器。

    3:实验代码:

    3.1:NandFlash的初始化

    void init_nand()

    {    

    //时间参数设为:TACLS=0 TWRPH0=3 TWRPH1=0

        NFCONF = 0x300;

        /* 使能NAND Flash控制器, 初始化ECC, 禁止片选 */

        NFCONT = (1<<4)|(1<<1)|(1<<0);

        

        /* 复位NAND Flash */

        NFCONT &= ~(1<<1);  //发出片选信号

        NFCMMD = 0xFF;      //复位命令

        wait_idle();//循环查询NFSTAT位0,直到它等于1

        NFCONT |= 0x2;      //取消片选信号

    }

    3.2:NandFlash的读操作

    汇编代码:

    ldr r0,  =0x30000000 @1. 目标地址=0x30000000,这是SDRAM的起始地址

    mov     r1,  #4096 @2.  源地址   = 4096,连接的时候,main.c中的代码都存在NAND Flash地址4096开始处

    mov r2,  #1024 @3.  复制长度= 1024(bytes),对于本实验的main.c,已经足够

    bl nand_read_ll @调用C函数nand_read_ll

    C部分:

    /*buf:为目的地址;start_addr:为起始地址;size为复制的长度*/

    void nand_read_ll(unsigned char *buf, unsigned long start_addr, int size)

    {

        int i, j;

        if ((start_addr & NAND_BLOCK_MASK) || (size & NAND_BLOCK_MASK)) {

            return ;    /* 地址或长度不对齐 */

        }

        NFCONT &= ~(1<<1);  //发出片选信号

        for(i=start_addr; i < (start_addr + size);){

            NFCMMD = 0; //发出READ0命令

            s3c2440_write_addr(i);  //Write Address

            wait_idle();    //循环查询NFSTAT位0,直到它等于1

            for(j=0; j < NAND_SECTOR_SIZE; j++, i++){

                *buf = (unsigned char)NFDATA;

                buf++;

            }

        }

        NFCONT |= 0x2;      //取消片选号

        return ;

    }

  • 相关阅读:
    Linux makefile教程之概述一[转]
    Valid Parentheses
    Letter Combinations of a Phone Number
    机器学习经典分类算法 —— C4.5算法(附python实现代码)
    3Sum Closest
    3Sum
    Integer to Roman
    寒假文献阅读(四)
    Longest Common Prefix
    Roman to Integer
  • 原文地址:https://www.cnblogs.com/huxingkeji/p/2733934.html
Copyright © 2011-2022 走看看