Board logo

标题: 基于ARM920T的FLASH的读写(4) [打印本页]

作者: yuyang911220    时间: 2015-5-30 21:21     标题: 基于ARM920T的FLASH的读写(4)

3.NAND Flash的硬件设计

NAND FLASH是采用与非门结构技术的非易失存储器,有8位和16位两种组织形式,下面以8位的NAND FLASH进行讨论。

1)
接口信号

与NOR Flash相比较,其数据线宽度只有8bit,没有地址总线,I/O接口可用于控制命令和地址的输入,也可用于数据的输入和输出,多了CLE和ALE来区分总线上的数据类别。
信号

类型

描述

CLE
O
命令锁存使能
ALE
O
地址锁存使能
nFCE
O
NAND Flash片选
NFRE
O
NAND Flash读使能
nFWE
O
NAND Flash写使能
NCON
I
NAND Flash配置
R/nB
I
NAND Flash Ready/Busy

2)
地址结构

NAND FLASH主要以页(page)为单位进行读写,以块(block)为单位进行擦除。FLASH页的大小和块的大小因不同类型块结构而不同,块结构有两种:小块(图7)和大块(图8),小块NAND FLASH包含32个页,每页512+16字节;大块NAND FLASH包含64页,每页2048+64字节。



图7
小块类型NAND FLASH






图8
大块类型NAND FLASH

其中,512B(或1024B)用于存放数据,16B(64B)用于存放其他信息(包括:块好坏的标记、块的逻辑地址、页内数据的ECC校验和等)。NAND设备的随机读取得效率很低,一般以页为单位进行读操作。系统在每次读一页后会计算其校验和,并和存储在页内的冗余的16B内的校验和做比较,以此来判断读出的数据是否正确。

大块和小块NAND FLASH都有与页大小相同的页寄存器,用于数据缓存。当读数据时,先从NAND FLASH内存单元把数据读到页寄存器,外部通过访问NAND FLASH I/O端口获得页寄存器中数据(地址自动累加);当写数据时,外部通过NAND FLASH I/O端口输入的数据首先缓存在页寄存器,写命令发出后才写入到内存单元中。

3)
接口电路设计(以下以2410和K9F1208U为例)

2410处理器拥有专门针对 NAND设备的接口,可以很方便地和NAND设备对接,如图9所示。虽然NAND设备的接口比较简单,容易接到系统总线上,但2410处理器针对NAND设备还集成了硬件ECC校验,这将大大提高NAND设备的读写效率。当没有处理器的ECC支持时,就需要由软件来完成ECC校验,这将消耗大量的CPU资源,使读写速度下降。



图9 S3C2410与NAND FLASH接口电路示意图


3.NAND FLASH 的软件编写和调试


NAND设备的软件调试一般分为以下几个步骤:设置相关寄存器、NAND 设备的初始化、NAND设备的识别、NAND设备的读擦写(带ECC校验 )


NAND设备的操作都是需要通过命令来完成,不同厂家的命令稍有不同,以下一Samsung公司的K9F1208U0M命令表为例介绍NAND设备的软件编写。

表2
K9F1208U0M
Command Sets




1)
根据2410寄存器定义如下的命令宏

#define NF_CMD(cmd)
{rNFCMD=cmd;}

#define NF_ADDR(addr)
{rNFADDR=addr;}

#define NF_nFCE_L()
{rNFCONF&=~(1<<11);}

#define NF_nFCE_H()
{rNFCONF|=(1<<11);}

#define NF_RSTECC()
{rNFCONF|=(1<<12);}

#define NF_RDDATA()
(rNFDATA)

#define NF_WRDATA(data) {rNFDATA=data;}
#define NF_WAITRB()
{while(!(rNFSTAT&(1<<0)));}



//wait tWB and check F_RNB pin.


2)
NAND 设备的初始化

static void NF_Init(void)
//Flash 初始化

{
rNFCONF=(1<<15)|(1<<14)|(1<<13)|(1<<12)|(1<<11)|(TACLS<<8)|(TWRPH0<<4)|(TWRPH1<<0);

//设置NAND设备的相关寄存器


// 1
1
1
1,
1
xxx,
r xxx,
r xxx


// En 512B 4step ECCR nFCE="H" tACLS
tWRPH0
tWRPH1

   

NF_Reset();

}
static void NF_Reset(void)
//Flash重置

{

int i;

  

NF_nFCE_L();


NF_CMD(0xFF);


//reset command


for(i=0;i<10;i++);


//tWB = 100ns


NF_WAITRB();

//wait 200~500us;


NF_nFCE_H();

}




欢迎光临 电子技术论坛_中国专业的电子工程师学习交流社区-中电网技术论坛 (http://bbs.eccn.com/) Powered by Discuz! 7.0.0