提出一种在单片机系统中比较简单地使用大容量NAND Flash存储器的方法。与一般方法相比,编写应用程序的程序员不需要掌握计算机文件系统的规范,只要按照NAND Flash的读、写、擦除等时序对其进行操作,把NANDFlash当成NOR Flash或SRAM来对待,这样存储器的物理地址对程序员而言是透明的,只需要在遇到坏块(BAD BLOCK)时跳过该块就可以了。
该方法降低了使用NAND Flash存储器的难度和成本,且不仅适用于EPG3231,也可以推广到一般的8位单片机系统中使用。
在从事单片机的教学中,由于学生对有声音和显示的制作项目更感兴趣一些。因此,在学习过程中这种兴趣往往能让他们完成项目,获得成就感,从而学到更多的东西。
目前在技术上,声音的存储大都使用大容量的NAND Flash,但一般按照文件系统的方式存储,这对学生有一定的难度。本声音播放器的声音文件采用非文件方式存储在NAND Flash中,这样在不需要太多背景知识的情况下,可以比较简单地使用大容量的NAND Flash存储器,降低了使用NAND Flash存储器的难度和成本。
1 声音播放器总体设计方案
声音播放器总体设计框图如图l所示。其中存储器用于存放声音文件,单片机将存储器中的声音文件名显示在显示器上,并根据按键选择要播放的声音文件,从存储器中将声音文件的数据送到内部的D/A转换器,D/A的输出通过功放放大后送到喇叭放出声音。
其中,在选择存储器时,应满足大容量、非易失、价格便宜等条件,根据上述条件,NAND Flash为最佳选择,这里选用K9G8G08型NAND Flash,其容量是1 G字节。对于WAV格式的语音信息,8 bit、22.05 kHz、单声道足以满足一般需求,而对于音乐(歌曲)来讲,44.1 kHz的采样频率也能达到较好效果,因此,该器件中能存储约800 min语音或400 min音乐;显示器采用122x32的LCM,内置控制器为SEDl520,可以显示14个汉字或28个英文字符;按键主要有放音/暂停、停止、上翻、下翻等,采用独立式按键;单片机选用ELAN的EPG3231,该器件与5l系列单片机使用相似。
设计声音播放器关键需要考虑:声音数据以何种格式、何种方式载入K9G8G08。一种可直接用一个U盘,通过计算机将数据下载到K9G8G08中,声音数据以文件方式存放。但这样必须在单片机中完成与U盘的接口连接,并且要熟悉计算机的文件格式,这对单片机的初学者来讲难度比较大。另一种是将声音数据按顺序存放在K9G8G08中(遇到坏块时跳过即可),这样数据存放的物理地址对开发者来讲是透明的,再使用下载器就可以将声音数据载入K9G8G08中。如果将下载器和声音播放器做在一起,同样可以在线下载数据。
2 声音播放器硬件电路设计
2.1 K9G8G08简介
K9G8G08是三星公司生产的1 Gx8 bit的NAND Flash存储器,工作电压为2.7~3.6 V,内部存储结构为(2 K+64)字节/页×128页/块×4096块。外部电路通过共用的8位I/0端口分时访问其命令寄存器、地址寄存器和数据寄存器,实现对器件读、写和擦除等操作。其存储器的命名方式参见文献。K9G8G08采用48引脚的TSOP封装,其引脚配置如图2所示。
2.2 EPG3231简介
EPG323l是ELAN公司的8位RISC单片机,它有11个8位并行口、1个8位电流输出型的D/A、1个10位逐次逼近型A/D、1个通用异步收发器UART、1个8,16,24位的串行外设接口SPI、3个定时器等,硬件资源丰富,还支持手写识别、语音识别、ADPCM编解码等功能。另外,EPG3-23l的速度较快,在时钟频率为16 MHz时,指令周期为125 ns。
2.3 EPG3231与K9G8G08的电路连接
图3为EPG3231与K9G8G08的电路连接图。图中没有给出K9G8G08,只给出了EPG323l的基本电路及用网络标号标出的与K9G8G08的连接引脚。K9G8G08的19引脚是写保护,在实际电路中接+3.3 V(不保护)。需要说明的是,EPG323l的D/A输出是48引脚(PBl),输出电流信号,需要将其输出转换为电压信号再送至后续的功放。其中比较简单且可行的做法是在PBl与地之间接一只电阻来完成电流与电压的转换,关键是该电阻的取值。若电阻阻值较大,输出波形的上部会出现限幅失真;若阻值较小,则不能最大限度地利用D/A的动态范围。因此确定该电阻阻值的方法是:先接一只可调电阻,写一段测试程序,向D/A反复连续地送00~FFH的数值,通过示波器观察PBl输出,调整可调电阻,使输出为不失真的锯齿波,且最高点为3.3 V(即参考电源VREX(70引脚)电压)。
另外,图3中使用EPG323l的D端口(PD0~PD7)与K9G8G08的I/O端口相连,这个端口必须是双向的,使用其他的双向端口也可以,但不要使用J端口和K端口,这两个端口适用按键的输入/输出(矩阵键盘时的扫描输出),速度比较慢,不能用于与K9G8G08的通信。还需注意的是,由于WAV文件中的编码是无符号数(即OOH是最低电平,FFH是最高电平),而EPG323l的D/A输入是有符号数(即80H是最低电平,7FH是最高电平),所以程序中应将WAV声音数据的最高位取反后送到D/A。
3 声音播放器软件设计
在声音播放器软件设计之前,应确定好K9G8G08中数据存放的格式。
首先是地址的格式。对K9G8G08内部存储单元操作的地址是分5个字节送出的,所以地址的格式最好是按这5个字节编排,如表l所示。
其次,根据NAND Flash的特点,其内部是可能有坏块(BAD BLOCK)存在的,但BLOCK 0一定是有效块(VALID BLl3CK),所以将坏块信息存在BLOCK 0中。而K9G8G08的有效块的个数在3 99* 096之间,也就是说,坏块的个数不大于100个。块地址是由A19~A30决定的,为方便程序的编写,将块地址分3个字节存储,各个地址位的安排同表1中的第3、4、5个字节,将A12~A18位放O。坏块信息存储区最多占用300个字节。
第三,将声音文件的目录也存在BLOCK O中。目录中的每条记录占用64字节,其中前5个字节是声音文件的起始地址,同样为了方便程序的编写,每字节中包含的地址位与表1一致;后面的59个字节是声音的名字,比如歌曲名等,用0表示结束,如表2所示。从表2中可知,目录区最多有4 088个记录,应该能满足一般的需要。
软件设计中最关键的是对K9G8G08的操作。该声音播放器中,程序只需对K9G8G08进行读操作即可。图4为读K9G8G08的软件设计流程。
对K9G8G08读操作的程序在定时器中断中调用。对于22.05 kHz或44.1 kHz的WAV文件,定时器的中断周期分别为45.4μs或22.7μs。对于单声道、8 bit的WAV文件,其频率可以在文件头的第18H、19H字节得到,对于22.05 kHz和44.1 kHz的WAV文件,这两个字节的值分别是22H、56H和44H、ACH,声音信息从第2CH个字节开始。需要说明:1)写入命令的操作包括送出命令字和在写(WE)控制线上产生下降沿;2)写入5字节地址的操作要按表1中的顺序向K9G8G08写入5个字节的地址。每个地址的写入包括送出地址和在写(WE)控制线上产生下降沿;3)输入数据的操作包括在读(RE)控制线上产生上升沿和读入数据。
4 结束语
由于对不同型号的NAND Flash的操作有可能略有差别,所以如果要使播放器同时能支持多种NAND Flash,应该在程序中读取器件的ID,根据其ID选择不同的读NAND Flash的程序。三星NAND Flash的ID参见文献。该声音播放器具有盒式录音机和复读机的放音功能,如果增加录音功能,它完全可以是盒式录音机和复读机的替代品,因为它有不用磁带和没有复杂的、易损坏的机械结构的优点,是前两者不能相比的。只是由于8 bit的量化分辨率略低了点,体现在播放音量较小的语音时,有点“呜呜”的噪音,这是量化误差引起的。可以采用在播放器中使用16 bit的WAV文件的方法来解决,但这会增加一倍的数据量。也可以通过使用MP3文件的方法来解决,这时它就是一台MP3播放器了,但需要增加MP3解码器(或用软件解码)。这里所提出的对NAND Flash的使用方法简单易行,基本上类似于对NOR Flash或SRAM的使用,存储器的物理地址对程序员来讲是透明的,易于理解和控制。