U盘在使用USB传输时使用的是块传输方式,操作相对比较复杂。除了最基本的USB协议之外,还需要实现许多其它相关协议,比如Mass Storage、Bulk-Only、SCSI-2、UFI等。但对USB接口芯片ISP1362而言,需要完成的仅是按照协议规定进行数据的传送。
相关描述符和设置
U盘一般使用Mass Storage协议进行通信。然而在使用Mass Storage协议通信之前,应首先关注传输协议和U盘的端点描述符。
Mass Storage中的传输协议常用Bulk_Only,然而在这种传输方式下又可分多种指令集,而U盘常用SCSI指令集。 Bulk_Only的传输方式在通信时应首先读取端点描述符来获取Bulk_In和Bulk_Out这两个端点号,之后才能进行USB的正常通信。
FAT文件系统
由于现在U盘的容量普遍较大,对U盘的操作往往都是按块来进行的,其大小一般均为512B。但实际U盘上的数据是以文件系统的方式来存储的,目前U盘常用的文件系统有FAT16和FAT32。而这两种文件系统在很多内容方面都是相同的,因此,在实际访问中可以对其简单的区分,然后分别进行不同的操作,就能实现对不同文件系统的U盘进行访问,提高通用性。
播放MP3文件
播放一个MP3文件需要经过以下几个环节:解析U盘的文件系统,获取MP3文件的信息,从U盘中读取指定的MP3文件,将文件中的数据送至AT89C51SND1C内嵌的MP3解码器,解码后的数据经音频输出接口调整格式后输出两个声道的串行数据,再经过DAC芯片CS4330将数字信号转换为模拟信号,最后经集成运放MC33202将信号放大输出。
初始化相关芯片
对主控器AT89C51SND1C和USB接口芯片ISP1362的初始化是至关重要的,除了上述一些需要初始化设置的地方,还应注意单片机和ISP1362复位要同步。另外还应对MP3解码器音量控制的相关寄存器进行初始化,默认情况下它们都是0,即处于静音状态。
获取MP3文件中的数据
从U盘中获取MP3文件是一个相对烦琐的过程,首先应能按照USB的相关协议读取U盘上指定块的数据,之后还要根据得到的数据解析文件系统,从而得到指定MP3文件的起始块地址,然后通过查FAT表的方法得到后继的数据。并且还应将得到的数据存储在AT89C51SND1C内部开设的数据缓存中,等待MP3解码器缺少数据时使用。由于MP3解码器内部的数据缓存较小,因而就要求获取MP3文件数据的时间要尽可能的少,这就需要该部分的代码要尽量精简。
MP3解码器解码
启动MP3解码器之前应先对读取来的MP3数据的帧头进行解析,根据解析得到的采样率设置音频输出接口的时钟。从U盘中读取的数据也应先暂存在AT89C51SND1C内部开设的数据缓存中,开始播放之前需要先通过MP3DAT向MP3解码器的数据缓存中送满1KB的数据,之后待MP3解码器出现缺少数据的状态(MP3STA1寄存器中的MPFREQ=1),再将AT89C51SND1C内部数据缓存中的数据写入MP3解码器中。当数据缓存中的数据全部用完后,就应立即再次读取U盘,如此往复直到整个MP3文件都播放完毕为止。
结语
本系统很好地实现了对U盘的识别和读取,突破了传统MP3播放器中解码器与存储器一体化的限制,只需使用更大容量的U盘就可以在原有硬件基础上增加存储容量,在音响和汽车电子方面具有良好的应用前景。
参考文献
1. Atmel Corporation. Single-Chip Flash Microcontroller with MP3 Decoder and Human Interface, 2003
2. Philips Electronics. ISP1362 Single-Chip Universal Serial Bus On-The-Go controller, 2004
3. USB Implementers Forum, inc. On-The-Go Supplement to the USB 2.0 specification Revision 1.0a, 2003