s3c2440之NandFlash

1 Nand flash 工作原理

S3C2410板的Nand Flash支持由两部分组成:Nand Flash控制器(集成在S3C2410 CPU)Nand Flash存储芯片(K9F1208U0B)两大部分组成。当要访问Nand Flash中的数据时,必须通过Nand Flash控制器发送命令才能完成。所以, Nand Flash相当于S3C2410的一个外设,而不位于它的内存地址区.

1.1 Nand flash 芯片工作原理

Nand flash芯片型号为Samsung K9F1208U0B,数据存储容量为64MB,采用块页式存储管理。8I/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/O0I/O7进行

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

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

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

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

913位:对页进行寻址

1425位:对块进行寻址

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

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

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

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

主要命令有:Read 1Read 2Read IDResetPage ProgramBlock EraseRead 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芯片读、检验和编程控制的。特殊功能寄存器有:NFCONFNFCMDNFADDRNFDATANFSTATNFECC。寄存详细说明见下一节。

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 ;

}

4:编译,下载测试。

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值