当前位置:首页 > 单片机 > 单片机
[导读]NAND Flash在嵌入式系统中的地位与PC机上的硬盘类似,用于保存系统运行所必需的操作系统、应用程序、用户数据、运行过程中产生的各类数据。与内存掉电后数据丢失不同,NAND Flash中的数据在掉电后仍可永久保存。操作

NAND Flash在嵌入式系统中的地位与PC机上的硬盘类似,用于保存系统运行所必需的操作系统、应用程序、用户数据、运行过程中产生的各类数据。与内存掉电后数据丢失不同,NAND Flash中的数据在掉电后仍可永久保存。

操作NAND Flash时,先传输命令,然后传输地址,最后读/写数据,期间要检查Flash的状态。对于K9F5608U0D,它的容量为32MB,需要25位地址。发出命令后,后面要紧跟3个地址序列。比如读Flash时,发出读命令和3个地址序列后,后续的读操作就可以得到这个地址及其后续地址的数据。相应的命令字和地址序列如表1和2所示:

表1:K9F5608U0D命令设置表

表2:K9F5608U0D寻址周期表

K9F5608U0D一页的大小为512字节,分为两部分:前半页,后半页。由于列地址只有8根数据线,所以寻址宽度只有256个字节。而在这512个字节的一页中,当发出读命令为00h时,表示列地址将在前半部分寻址,命令为01h时,表示列地址将在后半部分寻址。A8被读命令00h设置为低电平,而在01时设置成高电平。

S3C2410对NAND Flash操作提供了几个寄存器来简化对NAND Flash的操作。比如要发出读命令时,只需要往NFCMD寄存器中写入0即可,而控制器会自动发出各种控制信号进行操作。以下几个寄存器,为2410专为NAND而设计的:

NFCONF:NAND Flash配置寄存器。

被用来使能/禁止NAND Flash控制器、使能/禁止控制引脚信号nFCE、初始化ECC、设置NAND Flash的时序参数等。

TACLS、TWRPH0、TWRPH1这3个参数控制的是NAND Flash信号线CLE/ALE与写控制信号n/WE的时序关系,如图1所示:

图1:S3C2410 NAND控制时序图

NFCMD:NAND Flash命令寄存器。

对于不同型号的Flash,操作命令一般不一样。

NFADDR:NAND Flash地址寄存器。

当写这个寄存器时,它将对Flash发出地址信号。

NFDATA:NAND Flash数据寄存器。

只用到低8位,读,写此寄存器将启动对NAND Flash的读数据、写数据操作。

NFSTAT:NAND Flash状态寄存器。

只用到位0,0:busy,1:ready。

在使用NAND Flash之前,需要先对NAND进行初始化:

/************************************************************************

* 名称: init_nandconf

* 功能:初始化2410内部nandflash控制寄存器

* 返回:无

************************************************************************/

void init_nandcof(void)

{

rNFCONF=0xf820;//设置NANDFLASH,各位定义如表3所示:

表3:NFCONF寄存器

[15]:设置为1,NANDFLASH 控制器开,由datasheet得到,在自动启动后,nandflash控制器会关闭,如果要使用控制器,就要手工开。

[12]:初始化ECC寄存器,设置为1

[11]:外部NAND使能,这里设置为1,先关一下。

[10:8]:TACLS设置,由表4得,ALE和CLE要求保持10ns,而现在的HCLK为100m,所以TACLS为0就可以了。

表4:AC TIMING CHARACTERISTICS FOR COMMAND / ADDRESS / DATA INPUT

[6:4]:由表4得,twp在3.3V时需要至少25ns的时间,现在在HCLK为100M的情况下,需要3个周期,所以TWRPH0为2,

[2:0]:由表4得到,tch要求时间为10ns,所以在HCLK为100M的情况下,只要1个周期就行了,所以TWRPH1为0

rNFCONF &= ~0x800;//NAND使能。CE低电平有效

rNFCMD=0xff;//重启一下NAND,由表5所示,得到复位的命令

表5:NANDFLASH命令表

while(!(rNFSTAT&0x1));//等待复位完成,由表6得,NFSTAT寄存器定义

表6:NFSTAT寄存器

}

对于NANDFLASH操作来说,一般有4种:1、读NAND ID,2、读NAND内容,3、写NANDFLASH,4、擦除NANDFLASH。以下分4个函数说明NANDFLASH的4种操作:

1、读NANDFLASH的ID

/************************************************************************

* 名称: nand_read_id

* 功能:读取nandflash的ID

* 输入:无

* 返回: id

************************************************************************/

static int nand_read_id(void)

{

int i,id;//i用于记录当前的,id用于记录读取的ID

/* NAND使能 */

rNFCONF &= ~0x800;使能//NANDFLASH

for(i=0; i<10; i++);//等待10个周期,等待Nand准备就绪

图2:NAND读时序图

以下部分按照图2时序图而写

rNFCMD=0x90;

for(i=0;i<5;i++);//由于FCLK为200MHz,这里5个周期为25ns

查器件手册得tAR最小需要10ns,最大没有上限

id=rNFDATA;//读出NAND的制做商编号:这里三星为0xEC

id=(id<<8)+rNFDATA

//关芯片使能,防止误操作对NAND中的数据修改

rNFCONF |= 0x800;

return id;//返回读取的ID

}

2、读NAND内容

/************************************************************************

* 名称: nand_read

* 功能:读取nandflash上一块内容到指定的地址中

* 输入: unsigned char *buf:要写入数据的首地址

unsigned long start_addr:要读取的数据在Nand上的首地址

int size:读取长度

* 返回: 0

************************************************************************/

static int nand_read(unsigned char *buf, unsigned long start_addr, int size)

{

int i, j;//i用于记录当前的,j记录每一页中的byte地址

/* NAND使能 */

rNFCONF &= ~0x800;//使能NANDFLASH

for(i=0; i<10; i++);//等待10个周期

图3:NAND读时序图

以下部分按照图3时序图而写

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

{

/* READ0 */

rNFCMD = 0;//由表3-4-5所示,读数据区的命令为0x0或者0x1,而对于512bytes来说,0x0是从第0个字节开始读起,而0x1是从第256个字节读起。当使用NFCMD寄存器时,控制NAND的ALE会置0,CLE会置1,数据写入时,WE也会由低变高,而当WE由低变高的过程后,命令将锁存在了NAND中的命令寄存器中,而这些都是自动的

/* Write Address */

//nand的写入方法见时序图,由于向2410的NAND的NFADDR寄存器写数据,此时ALE至1,CLE至0,数据写入时,WE也会由低变高,而当WE由低变高的过程后,地址数据将锁存在了NAND中的地址寄存器中,这些全是自动的,而又因为32M的NAND只需要3个周期寻址,所以这里只向地址寄存器发3个周期的命令就可以了

rNFADDR = i & 0xff;

rNFADDR = (i >> 9) & 0xff;//(左移9位,不是8位)

rNFADDR = (i >> 17) & 0xff;//(左移17位,不是16位)

表3-4-2列出了在地址操作的3个步骤对应的NAND内部地址线,没有A8(它由读命令设置,当读命令为0时,A8=0;当读命令为1时,A8=1),所以在第二,第三次向rNFADDR寄存器发送地址时,需要再多移一位,而不是原来的8和16。

wait_idle();//由时序图得到,当输入地址完成后,NANDFLASH会进入忙状态,我个人认为是NAND内部对输入的地址进行解释。

for(j=0; j < 512; j++, i++)

{

*buf = (rNFDATA & 0xff);//读取NAND中的数据,将数据写入到指定的数据写入位置,当使用NFDATA寄存器时,控制NAND的CLE和ALE都会自动1。而buf指针是外面传进来的地址,在下面的函数调用会用到,每读取一次NFDATA寄存器,控制NAND的OE都会由高电平到低电平转变。而NANDFLASH的数据每读取一次,都会指向下一个内部的地址,而一个数据区由512bytes组成,当继续读下去的时候,将读到16bytes的ECC区,所以每对完512个字节后,要对nand的地址重新定位。

buf++;//写入地址位置+1

}

}

//关芯片使能,防止误操作对NAND中的数据修改

rNFCONF |=

本站声明: 本文章由作者或相关机构授权发布,目的在于传递更多信息,并不代表本站赞同其观点,本站亦不保证或承诺内容真实性等。需要转载请联系该专栏作者,如若文章内容侵犯您的权益,请及时联系本站删除。
换一批
延伸阅读

  引言   汽车的普及为人们的生活带来了方便,同时也给人们提出了一大难题——汽车防盗。本设计是为了解决以往汽车防盗产品的缺点和不足而开发的集成传感、报警和远程图

关键字: 数据采集 操作系统 s3c2410 汽车防盗系统

  引言   巡航控制系统(CCS)是20世纪60年代发展起来的,又称为恒速行驶系统。巡航控制系统工作时,ECU根据各种传感器输送来的信号判断汽车的运行状况,通过执行元件自动调节节气门的

关键字: ARM 三星 Linux ecu s3c2410 电子控制系统

  在过去一百年里(l906-2005),全球地表平均温度升高了0.74摄氏度,未来20年,每十年全球温度将会升高0.2摄氏度。气候变暖已成为不容忽视的、直接影响全球生产和生活问题。  

关键字: can总线 s3c2410

  在此设计的基于 GPRS 的远程安防监控系统,是采用的是摄像机传送视频信号经压缩编码后,通过内部总线传送到内置的 Web 服务器。用户在监控端可以直接通过浏览器观看 Web服务器上的摄像机视

关键字: GPRS s3c2410 安防监控

关于使用烧录器烧录Nand Flash,一直都是很多用户头疼的难点,他们强调已经使用了正确的坏块管理方案,也制定了规范的操作流程,但是烧录的良品率还是无法提高,只能每天眼睁睁看着一盘盘&ldqu

关键字: nandflash 烧录器

5月26日消息,据国外媒体报道,集邦咨询半导体研究中心(DRAMeXchange)在周一发布的一份报告中称,今年第一季度,三星在全球NAND Flash市场上的份额为33.3%,与前一季度相比,环比略

关键字: nandflash 三星 芯片

华为作为美光最大的客户之一,美国将华为列入实体名单一事对美光产生了非常严重的影响,美光业绩已经逐渐露出下滑趋势,上周五美光股价大跌近7%,南亚科、华邦电、威刚等存储器企业也纷纷走低。 近期DRAM及N

关键字: DRAM nandflash 美光 芯片

6月24日消息 日前全球第二大闪存供应商东芝位于日本三重县的闪存工厂因地震遭遇断电事故,虽然停电过程非常短,13分钟之后就恢复供电了,但是工厂却一直停产,直到21日上午才恢复,至少停工了5天时间。 根

关键字: nandflash 东芝 台积电 芯片 闪存

Nandflash芯片以其高性价比,大存储容量在电子产品中广泛应用。但是,在此量大质优的应用领域,很多客户却痛苦于批量质量问题:专用工具无法满足量产,量产工具却可能出现极大的不良品率,那么究竟要如何解决呢?

关键字: nandflash 芯片 烧录技巧

网上介绍LINUX下的一般驱动程序开发示例浩如烟海,或是因为简单,关于DMA驱动的介绍却寥寥无几;近期zhaoyang因工作需要,花了几日时间开发了某设备在S3C2410处理器Linux下DMA通信的驱动程序,有感于刚接...

关键字: Linux s3c2410 dma驱动
关闭
关闭