51内核单片机管理NAND FLASH的方法
作者:石险峰 翁斌
来源:《物联网技术》2014年第01期
摘 要:阐述了NAND FLASH的工作原理和访问方式,提出了一种基于51内核单片机存储、读取NAND FLASH的实现方法,给出了K9F2G08UXA与单片机的接口电路,同时给出了对K9F2GO8UXA芯片进行读操作、页编程和块擦除等软件操作的响应例程。 关键词:51内核;NAND FLASH;块擦除;页编程
中图分类号:TP39 文献标识码:A 文章编号:2095-1302(2014)01-0063-03 0 引 言
闪速存储器(Flash Memory) 是一种不挥发性Non-Volatile内存,在没有电流供应的条件下也能够长久地保持数据,其存储特性相当于硬盘,同时其还具有低功耗、密度高、体积小等优点,这些特性正使得闪存成为各类便携型数字设备的存储介质的基础,而超大容量的闪存芯片更是受到了广大开发者的青睐。NOR和NAND是现在市场上两种主要的非易失闪存技术,NOR FLASH带有SRAM接口,有足够的地址引脚来寻址,可以很容易地存取其内部的每一个字节;NAND器件使用复杂的I/O口来串行地存取数据,各个产品或厂商的方法可能各不相同,8个引脚用来传送控制、地址和数据信息。51内核的单片机因受寻址能力的限制,在进行大容量存储应用时,都会选择NAND FLASH来作为存储器件。 1 K9F2G08UXA Flash Memory简介
K9F2G08UXA是韩国三星公司生产的256 M×8 b,并带有8 M×8位后备区域的NAND(“与非”)闪速存储器。NAND FLASH结构具有快速重写、高存储容量、回写速度快以及芯片面积小等特点,因此是高数据存储密度的理想解决方案。NAND FLASH型的单元排列是串行的,存储单元被分成页,由页组成块。根据不同容量,块和页的大小有所不同,而组成块的页的数量也会不同。应用NAND的困难在于FLASH的管理和需要特殊的系统接口。
K9F2G08UXA就是具有这些特点的FLASH Memory,它的典型编程时间为200 μs/页(2 048 B /页),擦除时间为1.5 ms/块(64页/块=128 KB/块)。页顺序读取时间最小为25 ns,随机读取时间最小为25 μs;其地址复用8个I/O引脚,作为地址输入、输出口和命令输入;片内的写控制器自动完成编程/擦除功能,包括所需的脉冲循环重复、内部校验及数据的加注。 2 硬件原理
2.1 K9F2G08UXA的结构特点
龙源期刊网 http://www.qikan.com.cn
K9F2G08UXA是由131 072行×2 112列组成的2112Mb存储器,其中64 Mb位的后备区域的列地址范围是2 048~2 111。2 112 B的数据寄存器连接着存储器单元阵列,在页读和页编程期间提供了I/O缓冲和内存之间的传送。存储器阵列由以串行方式连接成NAND结构的32个单元构成,每块中有1 081 344个这样的结构。这些单元均驻留在不同的页上。块是由2个NAND结构形成的64页组成,共有2 048个分立的可擦写的128 KB块。
闪存芯片的主要命令操作有读、编程和擦除,其中读、编程操作以页为基础,擦除必须以块为单位进行,且不允许逐位擦除。FLASH操作大都需要2个总线周期,如块擦除需要2个总线周期,一个周期是擦除建立,另一个周期是在块地址装入后执行擦除命令。256 MB的物理空间需要29位地址线,因此需要5个周期的字节寻址,其顺序是:低位列地址、高位列地址、低位行地址、中位行地址、高位行地址。 页读和页编程在命令输入后都跟着同样的5个地址周期。由于擦除是以块(1块有64页)为单位的,所以在块擦除操作中仅需要3个行地址周期。以上的操作都是通过写特殊的命令到命令寄存器中。特殊命令集定义如表l所列。 K9F2G08UXA芯片内有1个状态寄存器,命令70 h就是读这个状态寄存器的。通过它可以查询编程或擦除操作是否完成,以及查看这些操作完成的正确与否。在写70 h命令到命令寄存器中后,且在/CE或/RE的下降沿时,状态寄存器的内容就可以在1个读周期内输出到I/O引脚上。读状态寄存器的定义如表2所列。 表1 特殊命令集
功能 第一周期 第二周期 在忙态时可接受命令 读 00 h 30 h 读后备区域 00 h 35 h 读 ID 90 h - 复位 FF h - ο 页编程 80 h 10 h 块擦除 60 h D0 h 读状态 70 h ο
表2 读状态寄存器定义 I/O 状态 定义
龙源期刊网 http://www.qikan.com.cn
I/O.0 编程/擦除 0:编程/擦除成功 1:编程/擦除错误 I/O.1 预留 0 I/O.2 0 I/O.3 0 I/O.4 0 I/O.5 0
I/O.6 芯片操作 0:忙;1:准备好 I/O.7 写保护 0:保护;1:不保护 2.2 K9F2G08UXA各引脚功能 K9F2G08UXA的各引脚功能如下:
I/O0~I/O7:用于输入命令、地址和数据。在读操作时输出数据,当未选中芯片或输出禁止时浮空为高阻。
CLE:地址锁存使能。为高时,命令在/WE的上升沿通过I/O口锁存在命令寄存器中。 ALE:地址锁存使能。当为高时,地址在/WE的上升沿被锁存在地址寄存器中 。 /CE:芯片使能。在读操作期间,/CE为高时芯片返回standby模式。但是当在编程或擦除时处于忙状态时,则不理睬/CE,芯片也不返回standby模式。
/RE:读使能,低电平有效。有效时把数据驱动到I/O总线上,在/RE的下降沿后tREA处数据有效,并使内部列地址计数器加1 。
/WE:写使能,低电平有效。命令、地址和数据均是在/WE上升沿锁存。
/WP:写保护,低电平有效。在上电时,它提供写擦除保护,有效时,内部高电压产生器被复位。
R/B:准备好/忙输出,反映芯片的操作状态。为低时,表示正在进行编程、擦除或随机读操作,完成后返回高状态。若是开漏输出,当未选中芯片或输出禁止时不浮空为高阻态。
龙源期刊网 http://www.qikan.com.cn
2.3 K9F2G08UXA与单片机的接口电路
由于K9F2GO8UXA的I/O引脚为8位,因此可以很方便地选取51系列8位单片机。因51系列8位单片机的工作电压为5 V,图1中用VCC表示,K9F2GO8UXA闪存芯片的工作电压为3.3 V,所以单片机与闪存间不能直接相连,中间必须增加电平转换芯片进行隔离,如图1中74LVC4245。将K9F2GO8UXA的8位I/O引脚通过电平转换芯片与单片机的数据总线端口D0~D8位相连。K9F2GO8UXA的读使能(/RE)、写使能(/WE)则分别通过电平转换芯片与单片机的P3.6(/RD)和P3.5(/WE)相连, 其他控制信号如CLE、/CE、R/B等则通过电平转换芯片与单片机的P1口相连,并通过软件编程来完成对这些信号的控制。闪速存储芯片与单片机的连接电路如图1所示。 3 软件编程 3.1 读操作
闪速存储器上电后就处于读存储单元状态,K9F2GO8UXA芯片默认为读模式,也可以直接写00H到命令寄存器中完成该存储单元操作。读操作有3种类型:随机读、串行页读和连续行读。当改变页地址时,使能随机读模式。被选中的页在l0 μs内就传送到数据寄存器中,系统控制器可以通过R/B引脚监测数据传送的完成与否。一旦页中的数据被装入到寄存器中,数据就可以在60 ns的周期内,在连续的/RE脉冲读出。读操作流程如图2所示。 3.2 页编程
编程操作以页为单位,但它允许在1个页编程周期内进行1个字节或连续的直到2 112字节的多分页编程。在没有阻碍擦除操作的同一页内,连续分页编程操作的个数主阵列不能超过 2个,后备阵列不能超过3个。数据装入阶段开始于数据输入命令(80 h),接着是4个周期的地址输入和数据装入,非编程字节不需要装入。一旦编程操作开始,且/RE和/WE为低时,就可以读状态寄存器中的状态位(I/O6)。系统控制器也可以通过R/B引脚输出来监测编程操作周期的完成与否。在编程过程中只有读状态命令和复位命令有效。页编程操作完成后,可以查看状态位(I/O0),为“0”表明编程成功;为“1”则编程出错。页编程流程如图3所示。 3.3 块擦除
任何FLASH器件的写入操作都只能在空的或已擦除的单元内进行。所以大多数情况下, 当新数据写入一个扇区时,FLASH都必须进行擦除。擦除操作以块为单位,流程如下:首先启动块擦除建立命令(60 h);接着装入需要3个周期完成的块地址,其中只有A18~A28地址有效,而忽略A0~A17地址;最后是擦除确认命令(D0h),至此完成内部擦除过程。在输入擦除确认命令后的/WE的上升沿,内部写控制器进行擦除操作和擦除校验。当擦除操作完成后可以校验写状态位(I/O0)。块擦除操作流程如图4所示。 图3 页编程流程图 图4 块擦除流程图
龙源期刊网 http://www.qikan.com.cn
3.4 程序实例
下面的程序是用Keil C51编写的读操作程序。其他操作如块擦除、页编程均可参照文中介绍的流程图进行编程。但应注意根据闪速存储的时间参数来调整这些操作的时间。 #include #include #include #include #include #include #include
#define FLASH_BLOCK_ERASE_1ST 0x60 #define FLASH_BLOCK_ERASE_2ND 0xD0 unsigned char bdata outregister_2; sbit flash_cle =outregister_2^5; sbit flash_ale =outregister_2^6; sbit flash_wp =outregister_2^7;
void flash_read_commond(void); //FLASH进入读模式(输入指令) void flash_read_address(void); //FLASH进入读模式(输入地址) void flash_write_commond(void); //FLASH进入写模式(输入指令) void flash_write_address(void); //FLASH进入写模式(输入地址) void flash_data_in(void); //FLASH进入数据输入模式 void flash_data_out(void); //FLASH进入数据输出模式
龙源期刊网 http://www.qikan.com.cn
void flash_inefficacy(void); //FLASH进入写保护状态
void flash_write_data_in(unsigned char data_in); //向FLASH中写入数据 unsigned char flash_read_data_out(void); //从FLASH中读出数据 void flash_setup_address_5cycle(void); //设置5周期地址
void flash_setup_block_address_3cycle(void); //设置3周期地址(块地址) void flash_block_erase_handle(unsigned int temp_int); //块擦除操作 // FLASH块擦除子函数
// 入口参数:unsigned int temp_int 块地址
void flash_block_erase_handle(unsigned int temp_int){ flash_page_address=0;
flash_block_address=temp_int; //要擦除块的地址
flash_write_commond(); //FLASH进入写模式(输入指令) flash_write_data_in(FLASH_BLOCK_ERASE_1ST); //输入0x60h flash_write_address(); //FLASH进入写模式(输入地址) flash_setup_block_address_3cycle(); //输入要擦除块的地址 flash_write_commond(); //FLASH进入写模式(输入指令) flash_write_data_in(FLASH_BLOCK_ERASE_2ND); //输入0xD0h while(!RBOUT); //等待擦除完成
flash_inefficacy(); //FLASH进入写保护状态 } 4 结 语
龙源期刊网 http://www.qikan.com.cn
本文介绍一种51内核管理NAND FLASH的方法,并给出基于该方法硬件实现和C语言源代码,该硬件电路和软件代码已经在笔者参与研制的总线式消防电话系统中得到成功应用,实现了对语音信息的长时间存储功能,工作稳定、可靠。 参 考 文 献
[l] SAMSUNG Electronics Corp. K9F2GO8UXA flash memory [R]. Revision No. 1.3. Korea: SAMSUNG, 2007.
[2] NXP Semiconductors Corp. P89V51RB2/RC2/RD2 Product data [R]. Revision No. 0.3. Germany: NXP, 2004.
[3] 马忠梅,籍顺心,张凯,等.单片机的C语言应用程序设计[M].北京:北京航空航天大学出版社,1999.
[4] GB16806-2006:消防联动系统[S].北京:中国标准出版社,2007.
[5] 刘芳,赵振华.NAND FLASH芯片K9F1208在uPSD3234A上的应用[J]. 单片机与嵌入式系统应用, 2007(3): 43-46.
因篇幅问题不能全部显示,请点此查看更多更全内容