免费注册 查看新帖 |

Chinaunix

  平台 论坛 博客 文库
最近访问板块 发新帖
查看: 1123 | 回复: 0
打印 上一主题 下一主题

Nand Flash [复制链接]

论坛徽章:
0
跳转到指定楼层
1 [收藏(0)] [报告]
发表于 2011-12-21 08:41 |只看该作者 |倒序浏览

Nand flash

 

     Nand Flash 相当于PC上的硬盘,可用于保存操作系统、应用程序、用户数据等。

一、 nand flash的特点

   

1、  容量大:32MB~2GB

2、  XIPNAND一般用来存放代码,但是代码是不能在nand中运行的,如果要执行nand中的代码,必须把代码拷贝到SDRAM中,然后在SDRAM运行代码。

3、  访问速度:nand flash采用“块状”的读写方式,一次可以完成多个字节读写操作,访问速度很快。

4、  接口:nand flash没有地址总线和数据总线,所以一般不能接在存储器控制器上,只能接在nand flash控制器上。这样,ARM不给nand分配地址,访问nand的时候,根据nand自身的编址进行访问。

5、  访问方式:访问nand时,“地址”、“数据”和“命令”都是通过IO口进行传输。Nand有两个使能信号(ALE---地址锁存使能,CLE----命令锁存使能)来区分IO口上传输的内容(命令、地址、数据)。所以nand和硬盘类似,是一种串行访问方式。

二、nand flash的硬件设计

1、硬件设计



2nand引脚说明

 

32440nand控制器引脚


 

三、K9F1208特点

1、  结构:

Chip64MB数据区+2MB寄存器区

Block:(1chip = 4kblocks),16KB数据区+512B寄存器区

Page:(1block = 32pagesr),512B数据区+16B寄存器区

2、  数据区与寄存器区

数据区:存放有效数据。

寄存器区:存放ECC(错误校验码)、坏块标志、文件系统相关信息

3、  nand flash的地址

nand是没数据线和地址线的,但是nand本身内部是有地址的,nandflash的编址方式是按照IO口个数为单位进行编址。NandALE有效而CLE无效的时候,IO口上传输的地址,所以对nand进行寻址的时候,地址值是分周期输入的。

ChipA25~A0

Block地址:A25~A14block内地址:A13~A0

Page地址:A25~A9page内地址:A8~A0

因为nand只有8IO传输地址,所以地址分周期传输。地址如下:

400H命令和01H命令

   00H命令选中“A”区,A8=0

   01H命令选中“B”区,A8=1

四、从nand flash启动

一般一个嵌入式平台是支持从NOR flash,为了降低成本和缩小硬件体积,嵌入式处理器可以支持多种启动方式,以便节省NORNandSDSPI、网络启动。所谓从哪里驱动,就是将ARM的启动代码放在哪里。

2440nand启动的原理:

四、2440nand flash控制器

1、命令寄存器

2、地址寄存器

3、数据寄存器

4、状态寄存器

 

五、nand flash的访问

nand flash的访问包括“读”、“写”、“擦除”、“读ID

1、  nand ID

举例:

#define rNFCMD          (*(volatile unsigned *)0x4E000008)      //NAND Flash command

#define rNFADDR         (*(volatile unsigned *)0x4E00000C)      //NAND Flash address

#define rNFDATA          (*(volatile unsigned *)0x4E000010)      //NAND Flash data

int id = 0

int read_nand_id(void)

{

     rNFCMD  = 0x90;

     rNFADDR = 0x00;

     for(int i=0;i<4;i++)

       id  |=  (rNFDATA<<(8*(3-i)));

    return id;

}

2、  nand擦除操作

nand flash内写数据之前,先需要进行擦除操作,然后才可以写入数据。Nand flash擦除的单位是block,可以同时擦除几个块。

举例:

#define rNFCMD          (*(volatile unsigned *)0x4E000008)      //NAND Flash command

#define rNFADDR         (*(volatile unsigned *)0x4E00000C)      //NAND Flash address

#define rNFDATA          (*(volatile unsigned *)0x4E000010)      //NAND Flash data

//返回值0—>擦除成功

//       1-à擦除失败

//参数:block-à擦除的块号

int Erase_Nand_Block(int block)

{

int block_addr;

block_addr = block<<14;

rNFCMD = 0x60;

rNFADDR = (block_addr>>9)&0xff;

rNFADDR = (block_addr>>17)&0xff;

rNFADDR = (block_addr>>25)&0x01;

rNFCMD = 0xD0;

 

while(!(rNFSTAT & 0x01));

 

rNFCMD = 0x70;

return (rNFDATA &0x01);

}

 

3、  nand写操作

nand flash写入是page为单位。

4、  nand flash读操作

1)  读操作1   读数据区

00H命令:从1st half page开始读

              01H命令:从2nd half page开始读

2)  读方式2  读寄存器区

              命令是50H

 

5、  注意事项

nand操作的过程是一个连续的过程,中间是不能被中断打断,所以操作nand的时候,需要关闭中断,否则系统可能崩溃。

您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

北京盛拓优讯信息技术有限公司. 版权所有 京ICP备16024965号-6 北京市公安局海淀分局网监中心备案编号:11010802020122 niuxiaotong@pcpop.com 17352615567
未成年举报专区
中国互联网协会会员  联系我们:huangweiwei@itpub.net
感谢所有关心和支持过ChinaUnix的朋友们 转载本站内容请注明原作者名及出处

清除 Cookies - ChinaUnix - Archiver - WAP - TOP