本原创教程由芯驿电子科技(上海)有限公司(ALINX)创作,版权归本公司所有,如需转载,需授权并注明出处。
适用于板卡型号:
PGL22G/PGL12G
在其他实验中我们已经完成了单独的SD卡读写和音频模块的录音播放,本实验通过搜索SD卡中WAV音乐文件,然后送到音频模块播放,完成一个简单音乐播放器的功能。
本实验一个关键是在没有文件系统的情况下,搜索SD卡每个扇区的内容,匹配出WAV文件,这里有一个假设:假设每一个文件都是从一个扇区第一个字节开始而且文件是连续存储的,经过大量实验,发现FAT32文件格式中的文件确实如此。
WAV文件格式
大部分的文件都有文件头,WAV也不例外,我们通过分析SD卡一个扇区的前几个字节,判断这个文件是否为WAV文件。
WAV文件作为多媒体中使用的声波文件格式之一,它是以RIFF格式为标准的。RIFF是英文Resource Interchange File Format的缩写,每个WAV文件的头四个字节便是“RIFF”,所以本实验就简单的以每个扇区的前4个字节是否为“RIFF”判断该文件是否为WAV文件,紧接着4个字节表示文件的大小,这样我们就可以确定要读取的数据量。WAV文件头大小是88字节,在播放时要把前88个字节的文件头去掉。
wav文件头格式
例程中通过wav_read搜寻SD卡中的WAV文件,并将WAV文件读取出来写入FIFO,最后再从FIFO中将数据输出并写入音频模块。
由于在前面的例程中已经讲过其他模块的原理及使用这里不再赘述,仅说明wav_read模块。
wav_read模块完成了从SD卡中搜索wav文件,读取wav文件,状态机如下,如果有搜索请求(按键按下),则进入搜索状态“S_FIND”,如果搜索到WAV文件,进入“S_PLAY_WAIT”状态,检查FIFO的剩余空间是否够512个字节,如果有512个字节空间,就进入“S_PLAY”状态读取wav的一个扇区内容。
wav_read模块状态机
在程序设计中,搜寻SD卡里图片的文件头是按每8个扇区地址(4K字节)搜寻一次的形式操作,所以在一次搜寻结束后,下一次搜寻时需要将地址左移3位对齐以保证下一次搜寻的地址和图片在SD卡中存储的地址一致。
说明:因为SD卡格式化的时候按最小单元4K格式化,音乐文件的头文件一般都是在SD卡的4K分区的起始位置开始放置。
wav_read模块的管脚说明:
信号名称 | 方向 | 说明 |
clk | in | 时钟输入 |
rst | in | 异步复位输入,高复位 |
ready | out | 空闲状态指示 |
find | in | 搜索播放请求 |
sd_init_done | in | sd卡初始化完成 |
state_code | out | 状态码0,表示sd还在初始化1,sd卡初始化完成,等待按键按下2,正在搜索WAV文件3,找到WAV文件,正在播放 |
sd_sec_read | out | sd卡读请求 |
sd_sec_read_addr | out | sd卡读请求扇区地址 |
sd_sec_read_data | in | sd卡读到的数据 |
sd_sec_read_data_valid | in | sd卡读数据有效 |
sd_sec_read_end | in | sd卡读请求完成 |
fifo_wr_cnt | in | fifo写端口已经使用量 |
wav_data_wr_en | out | wav文件写使能 |
wav_data | out | wav文件的音频数据 |
1)格式化sd卡(fat32格式),sd卡必须是2.0以上的版本(容量大于4G)
2)我们已经在demo的目录下为大家准备了一下的2个wav文件,把wav格式文件放到sd卡中,注意:这里的wav文件是立体声双声道,48K采样率,16bit的音频文件。
3)将准备好的sd卡注入开发板的sd卡槽(sd卡不能带电插拔),音频模块接开发板J9扩展口,上电,下载实验程序,等待LED1灭、LED2、LED3、LED4亮(4'b0001)时,按下KEY2,这个时候等待LED1亮、LED2灭、LED3、LED4亮(4'b0010),表示正在搜索wav文件,如果找到LED1、LED2灭、LED3、LED4亮,这时候就可以听到音乐了。
全部0条评论
快来发表一下你的评论吧 !