大容量NANDFlashTC58DVG02A1FT00在嵌入式系统中的应用
摘要:随着嵌入式系统产品的发展,对存储设备的要求也日益增强。文章以东芝的NAND E2PROM器件TC58DVG02A1F00为例,阐述了NAND Flash的基本结构和使用方法,对比了NAND和NOR Flash的异同,介绍了容量NAND Flash在嵌入式系统中的应用方法,以及如何在Linux操作系统中加入对NAND Flash的支持。
%A
%A 关键词:嵌入式 NAND Flash Linux 内核 TC58DVG02A1F00
%A
%A 1 NAND和NOR flash
%A
%A 目前市场上的flash从结构上大体可以分为AND、NAND、NOR和DiNOR等几种。其中NOR和DiNOR的特点为相对电压低、随机读取快、功耗低、稳定性高,而NAND和AND的特点为容量大、回写速度快、芯片面积小。现在,NOR和NAND FLASH的应用最为广泛,在CompactFlash、Secure Digital、PC Cards、MMC存储卡以及USB闪盘存储器市场都占用较大的份额。
%A
%A NOR的特点是可在芯片内执行(XIP,eXecute In Place),这样应该程序可以直接在flash内存内运行,不必再把代码读到系统RAM中。NOR的传输效率很高,但写入和探险速度较低。而NAND结构能提供极高的单元密度,并且写入和擦除的速度也很快,是高数据存储密度的最佳选择。这两种结构性能上的异同步如下:
%A
%A *NOR的读速度比NAND稍快一些。
%A
%A *NAND的写入速度比NOR快很多。
%A
%A *NAND的擦除速度远比NOR快。
%A
%A *NAND的擦除单元更小,相应的擦除电路也更加简单。
%A
%A *NAND闪存中每个块的最大擦写次数量否万次,而NOR的擦写次数是十万次。
%A
%A 此外,NAND的实际应用方式要比NOR复杂得多。NOR可以直接使用,并在上面直接运行代码。而NAND需要I/O接口,因此使用时需要驱动程序。不过当今流行的操作系统对NAND Flash都有支持,如风河(拥有VxWorks系统)、微软(拥有WinCE系统)等公司都采用了TrueFFS驱动,此外,Linux内核也提供了对NAND Flash的支持。
%A
%A 2 大容量存储器TC58DCG02A1FT00
%A
%A 2.1 引脚排列和功能
%A
%A TC58DVG02A 1FT00是Toshiba公司生产的1Gbit(128M×8Bit)CMOS NAND E2PROM,它的工作电压为3.3V,内部存储结构为528 bytes×32pages×8192blocks。而大小为528字节,块大小为(16k+512)字节。其管脚排列如图1所示。各主要引脚如下:
%A
%A I/O1~I/O8:8个I/O口;
%A
%A CE:片选信号,低电平有效;
%A
%A WE:写使能信号,低电平有效;
%A
%A RE:读使能信号,低电平有效;
%A
%A CLE:命令使能信号;
%A
%A ALE:地址使能信号;
%A
%A WP:写保护信号,低电平有效;
%A
%A RY/BY:高电平时为READY信号,低电平时为BUSY信号。
%A
%A 2.2 与ARM处理器的连接
%A
%A 当前嵌入式领域的主流处理器当属ARM。图2是以ARM7处理器为例给出的NAND Flash与ARM处理器的一般连接方法。如前所述,与NOR Flash不同,NAND Flash需要驱动程序才能正常工作。
%A
%A 图中PB4,PB5,PB6是ARM处理器的GPIO口,可用来控制NAND Flash的片选信号。CS1是处理器的片选信号,低电平有效。IORD、IOWR分别是处理器的读、写信号,低电平有效。写保护信号在本电路中没有连接。
%A
%A 2.3 具体操作
%A
%A 地址输入,命令输入以及数据的输入输出,都是通过NAND Flash的CLE、ALE、CE、WE、RE引脚控制的。具体方式如表1所列。
%A
%A 表1 逻辑表
%A
%A CLE ALE CE WE RE
%A 命令输入 1 0 0 时钟上升沿 1
%A 数据输入 0 0 0 时钟上升沿 1
%A 地址输入 0 1 0 时钟上升沿 1
%A 串行数据输出 0 0 0 1 时钟下降沿
%A 待机状态 X X 1 X X
%A
%A NAND Flash芯片的各种工作模式,如读、复位、编程等,都是通过命令字来进行 控制的。部分命令如表2所列。
%A
%A 表2 命令表
%A
%A 第一周期(Hex) 第二周期(Hex)
%A 串行数据输入 80 无
%A 读模式1 00 无
%A 读模式2 01 无
%A 读模式3 50 无
%A 复位 FF 无
%A 自动编程(真) 10 无
%A 自动编程(假) 11 无
%A 自动块删除 60 D0
%A 状态读取1 70 无
%A 状态读取2 71 无
%A ID读取1 90 无
%A ID读取2 91 无
%A
%A 串行数据输入的命令80表示向芯片的IO8、IO7、IO6、IO5、IO4、IO3、IO2、IO1口发送0x80,此时除IO8为1外,其余IO口均为低电平。
%A
%A 2.4 时序分析及驱动程序
%A
%A 下面以表2中的读模式1为例分析该芯片的工作时序。由图3可知,CLE信号有效时通过IO口向命令寄存器发送命令00H。此时NAND Flash处于写状态,因此WE有铲,RE无效。发送命令后,接着发送要读的地址,该操作将占用WE的1、2、3、4个周期。注意,此时发送的是地址信息,因此CLE为低,而ALE为高电平。当信息发送完毕后,不能立刻读取数据,因为芯片此时处于BUSY(忙)状态,需要等待2~20ms。之后,才能开始真正的数据读取。此时WE为高电平而处于无效状态,同时CE片选信号也始终为低以表明选中该芯片。
%A
%A 这段时序的伪代码如下:
%A
%A Read_func(cmd,addr)
%A
%A {
%A
%A RE=1;
%A
%A ALE=0;
%A
%A CLE=1;
%A
%A WE=0;
%A
%A CE=0;
%A
%A Send_cmd(cmd);//发送命令,由参数决定,这里为00
%A
%A WE=1; //上升沿取走命令
%A
%A CE=1;
%A
%A CLE=0; //发送命令结束
%A
%A ALE=1; //开始发送地址
%A
%A For(i=0;i<4;i++)
%A
%A {
%A
%A WE=0;
%A
%A CE=0;
%A
%A Send_add(addr);//发送地址
%A
%A WE=1; /上升沿取走地址
%A
%A CE=1;
%A
%A }
%A
%A //所有数据发送结束,等待读取数据
%A
%A CE=0;
%A
%A WE=1;
%A
%A ALE=0;
%A
%A Delay(2ms);
%A
%A While(BUSY)
%A
%A Wait;//如果还忙则继续等待
%A
%A Read_data(buf);//开始读取数据
%A
%A }
%A
%A 3 Linux系统对NAND Flash的支持
%A
%A Linux操作系统虽然已经支持NAND Flash,但要使用NAND Flash设备,还必须先对内核进行设置方法如下:
%A
%A (1)在/usr/src/(内核路径名)目录中输入make menuconfig命令,再打开主菜单,进入Memory Technology Devices(MTD)选项,选中MTD支持。
%A
%A (2)进入NAND Flash Device Drivers选项,NAND设备进行配置。不过此时对NAND的支持仅限于Linux内核自带的驱劝程序,没有包含本文介绍的Toshiba芯片,为此需要对Linux内核进行修改,方法如下:
%A
%A (1)修改内核代码的drivers.in文件,添加下面一行:
%A
%A dep-tristate ‘Toshiba NAND Device Support‘CONFIG-MTD-TOSHIBA $CONFIG-MTD
%A
%A 其中CONFIG-MTD-TOSHIBA是该设备的名称,将在Makefile文件中用到。
%A
%A $CONFIG-MTD的意思是只有选有$CONFIG-MTD时,该菜单才会出现,即依赖于$CONFIG-MTD选项。宋,Toshiba的NAND设备将被加入Linux系统内核菜单中。
%A
%A (2)修改相应的Makefile文件,以便编译内核时能加入该设备的驱动程序。
%A
%A obj-$(CONFIG-MTD-TOSHIBA)+=toshiba.o
%A
%A 此行语句的意思是如果选择了该设备,编译内核时加入toshiba.o(假设驱动程序是toshiba.o),反之不编译进内核。
%A
%A
%A
%A
%A%A
%A
*博客内容为网友个人发布,仅代表博主个人观点,如有侵权请联系工作人员删除。