`
cjc
  • 浏览: 660147 次
  • 性别: Icon_minigender_1
  • 来自: 北京
社区版块
存档分类
最新评论

NandFlash系列之二:S3C2410读写Nand Flash分析

阅读更多
<script>function StorePage(){d=document;t=d.selection?(d.selection.type!='None'?d.selection.createRange().text:''):(d.getSelection?d.getSelection():'');void(keyit=window.open('http://www.365key.com/storeit.aspx?t='+escape(d.title)+'&u='+escape(d.location.href)+'&c='+escape(t),'keyit','scrollbars=no,width=475,height=575,left=75,top=20,status=no,resizable=yes'));keyit.focus();}</script>

作者:刘洪涛,华清远见嵌入式培训中心高级讲师。

一、结构分析

S3C2410处理器集成了8位NandFlash控制器。目前市场上常见的8位NandFlash有三星公司的k9f1208、k9f1g08、k9f2g08等。k9f1208、k9f1g08、k9f2g08的数据页大小分别为512Byte、2kByte、2kByte。它们在寻址方式上有一定差异,所以程序代码并不通用。本文以S3C2410处理器和k9f1208系统为例,讲述NandFlash的读写方法。

NandFlash的数据是以bit 的方式保存在memory cell里的,一般来说,一个cell 中只能存储一个bit,这些cell 以8 个或者16 个为单位,连成bit line,形成所谓的byte(x8)/word(x16),这就是NAND Device 的位宽。这些Line 组成Page, page 再组织形成一个Block。k9f1208的相关数据如下:

1block=32page;1page=528byte=512byte(Main Area)+16byte(Spare Area)。

总容量为=4096(block数量)*32(page/block)*512(byte/page)=64Mbyte

NandFlash以页为单位读写数据,而以块为单位擦除数据。按照k9f1208的组织方式可以分四类地址: Column Address、halfpage pointer、Page Address 、Block Address。A[0:25]表示数据在64M空间中的地址。

Column Address表示数据在半页中的地址,大小范围0~255,用A[0:7]表示;

halfpage pointer表示半页在整页中的位置,即在0~255空间还是在256~511空间,用A[8]表示;

Page Address表示页在块中的地址,大小范围0~31,用A[13:9]表示;

Block Address表示块在flash中的位置,大小范围0~4095,A[25:14] 表示;

二、读操作过程

K9f1208的寻址分为4个cycle。分别是:A[0:7]、A[9:16]、A[17:24]、A[25]。

读操作的过程为: 1、发送读取指令;2、发送第1个cycle地址;3、发送第2个cycle地址;4、发送第3个cycle地址;5、发送第4个cycle地址;6、读取数据至页末。

K9f1208提供了两个读指令,‘0x00’、‘0x01’。这两个指令区别在于‘0x00’可以将A[8]置为0,选中上半页;而‘0x01’可以将A[8]置为1,选中下半页。
虽然读写过程可以不从页边界开始,但在正式场合下还是建议从页边界开始读写至页结束。下面通过分析读取页的代码,阐述读过程。
static void ReadPage(U32 addr, U8 *buf) //addr表示flash中的第几页,即‘flash地址>>9’
{
U16 i;
NFChipEn(); //使能NandFlash
WrNFCmd(READCMD0); //发送读指令‘0x00’,由于是整页读取,所以选用指令‘0x00’
WrNFAddr(0); //写地址的第1个cycle,即Column Address,由于是整页读取所以取0
WrNFAddr(addr); //写地址的第2个cycle,即A[9:16]
WrNFAddr(addr>>8); //写地址的第3个cycle,即A[17:24]
WrNFAddr(addr>>16); //写地址的第4个cycle,即A[25]。
WaitNFBusy(); //等待系统不忙
for(i=0; i<512; i++)
buf[i] = RdNFDat(); //循环读出1页数据
NFChipDs(); //释放NandFlash
}

三、写操作过程

写操作的过程为: 1、发送写开始指令;2、发送第1个cycle地址;3、发送第2个cycle地址;4、发送第3个cycle地址;5、发送第4个cycle地址;6、写入数据至页末;7、发送写结束指令

下面通过分析写入页的代码,阐述读写过程。
static void WritePage(U32 addr, U8 *buf) //addr表示flash中的第几页,即‘flash地址>>9’
{
U32 i;
NFChipEn(); //使能NandFlash
WrNFCmd(PROGCMD0); //发送写开始指令’0x80’
WrNFAddr(0); //写地址的第1个cycle
WrNFAddr(addr); //写地址的第2个cycle
WrNFAddr(addr>>8); //写地址的第3个cycle
WrNFAddr(addr>>16); 写地址的第4个cycle
WaitNFBusy(); //等待系统不忙
for(i=0; i<512; i++)
WrNFDat(buf[i]); //循环写入1页数据
WrNFCmd(PROGCMD1); //发送写结束指令’0x10’
NFChipDs(); //释放NandFlash
}

四、总结

本文以S3C2410处理器和k9f1208系统为例讲述了nand flash的读写过程。在读写过程中没有考虑到坏块问题,有关ecc及坏块处理问题将在下个专题中讲述。

分享到:
评论

相关推荐

    使用JLink间接烧写S3C2410、S3C2440开发板Nor、Nand Flash的方法

    本文使用一个间接的方法来实现对S3C2410、S3C2440开发板的Nor、Nand Flash的烧写。原理为:JLink可以很方便地读写内存、启动程序,那么可以把一个特制的程序下载到开发板上的SDRAM去,并运行它,然后使用这个程序来...

    s3c2410处理器平台下Nandflash的读写.pdf

    s3c2410处理器平台下Nandflash的读写.pdf

    nand_flash.c

    移植nand- flash驱动,让 u-boot 可以操作读写 nand flash。由于s3c2410 和s3c2440 nand flash控制器有区别,所以修改以下代码,让u-boot可以操作读写nand flash。

    J-link_V7烧写flash

    JLink的调试功能、烧写Flash的功能都很强大,但是对于S3C2410、S3C2440的Flash操作有些麻烦:烧写Nor Flash时需要设置SDRAM,否则速率很慢;烧写Nand Flash只是从理论上能够达到,但是还没有人直接实现这点。 本文...

    基于NAND FLASH的嵌入式系统启动速度的研究

    以K9F1208U0M为例,介绍了NAND FLASH的结构及原理并实现了一套基于ARM9处理器(S3C2410)的嵌入式Linux系统平台;加电后系统启动耗时过长(约为60s),不能满足系统设计要求;通过分析嵌入式系统的结构和启动流程以及对NAND ...

    S3C241032位单片机与嵌入式操作系统答疑.doc

    答案:S3C2410首先从NAND FLASH中读取前4K字节的程序到其内部自带的4K字节的SRAM中,然后,再从此RAM中开始执行此程序。在此程序中要完成的最重要的任务是初始化SDRAM和NAND FLASH读写控制器,然后把NAND FLASH中的...

    嵌入式课件

    4.4.2 S3C2410A与NAND Flash存储器的接口电路 4.5 SDRAM接口电路 4.6 CF卡接口电路 4.6.1 PCMCIA接口规范 4.6.2 S3C2410A的CF卡接口电路 4.6.3 CF卡的读写操作 4.7 SD卡接口电路 4.7.1 SD卡的接口规范 4.7.2 S3C2410...

    u-boot-2009.11

    1、同时支持S3C2410和S3C2440 (2410没板测试) 2、自动识别S3C2440的启动方式,并能够将环境变量的保存到对应的位置 3、支持网卡芯片DM9000 4、支持不同NAND Flash的读写,并自动识别所使用的nand flash是512B/page...

    uboott移植实验手册及技术文档

    S3C2410_NAND * const nand = S3C2410_GetBase_NAND(); nand-&gt;NFADDR = addr; } static inline void NF_WaitRB(void) { S3C2410_NAND * const nand = S3C2410_GetBase_NAND(); while (!(nand-&gt;NFSTAT & (1...

    FS2410裸机系统EasySystem

    FS2410裸机系统EasySystem(包括s3c2410的几乎所有裸机驱动,各种实用裸机函数,GUI窗口系统,FAT16文件系统,BMP,WAV格式读写,俄罗斯方块游戏,图片浏览器等) 你可以说一句话然后存进sd卡,然后拿到电脑上用...

    init.bin即初始化SDRAM程序

    本init程序适用于S3C2410或S3C2440,下载到其内部SRAM中初始化外接的SDRAM,同时,配合使用JLINK和一个可读写FLASH的uboot可实现间接烧写uboot到NOR或NAND FLASH中

    嵌入式Linux应用程序开发详解

    4.2.4 S3C2410处理器详解 116 4.3 嵌入式软件开发流程 121 4.3.1 嵌入式系统开发概述 121 4.3.2 嵌入式软件开发概述 122 4.4 实验内容——使用JTAG烧写NAND Flash 128 本章小结 131 思考与练习 ...

    嵌入式Linux应用程序开发标准教程(第2版全)

    4.2.4 S3C2410处理器详解 4.3 嵌入式软件开发流程 4.3.1 嵌入式系统开发概述 4.3.2 嵌入式软件开发概述 4.4 实验内容——使用JTAG烧写NandFlash 4.5 本章小结 4.6 思考与练习 第5章 嵌入式Linux开发环境的搭建 5.1 ...

Global site tag (gtag.js) - Google Analytics