在MCU上实现音频的输出不外乎这样几种方法,即: 1)不借助外部器件,只凭MCU内部的DAC,外加功放的方式来实现。由于音频输出的数据量较大,故多需要依托于文件管理系统的支持,将音频数据存放于SD卡上。例如基于KL26Z开发板的语音故事书就是采用的这种方法。 2)利用语音芯片来来实现音频录放,它是在外围器件的辅助下将音频信号存放到芯片内部的存储单元,当播放时再按顺序从存储单元读出以还原音频。如ISD1760就是此类芯片,其不足之处是音频数据的大小要受器件容量的限制,通常最多也就能播放几分钟的内容,多用于报站器或参数播报上。 3)利用编解码芯片配以外围器件来实现,其音频数据的存储也基本是依托于SD卡,目前在许多中高挡的开发板上常采用该方式。由于此类芯片的引脚比较多,在自行增加该功能时,多采用购置功能模块的方式来实现。此外,它对技术水平的要求也相对高一些。 4)采用MP3功能模块来实现,相对来讲,它从技术要求、价格、尺寸规格等方面都是首选的目标,故这里就主要介绍它的性能与用法。 MP3播放模块的外观及引脚排列顺序如图1所示,其音频数据是由mini型SD卡来存储,存储形式为MP3格式的文件,在文件读取时是由模块内部来处理,无需使用者进行干预。该模块有2种工作模式,即简单的独立操控模式和基于通讯的指令操控模式。 图1 Mini MP3播放模块
该模块各引脚的功能如表1所示。 当MP3播放模块以简单模式工作时,其线路原理图如图2所示。 图2简单控制方式 可见在独立操控模式下,只需配置几个小按键就可对它进行控制,所对应的操作有播放第一首、下一首、上一首、增加音量、减小音量等。在配置相应电阻的情况下,还可通过电位的变化来实现播放顺序的指定。 在KL25的控制下,可通过菜单来显示当前歌曲的名称,并通过发送短脉冲的方式来控制歌曲的播放,而以发送长脉冲来调节播放的音量。 由于独立操控模式无法实现歌曲的跳跃式的点播,所以要想增强操控的灵活性,就必须采用指令操控模式。其实现的方法是利用UART0的TXD引脚来连接MP3模块的RX引脚,进行控制指令的传送,其通讯波特率为9600bps。 在KL25中, 串口通讯的初始化语句为 uart0Init(9600,0,0,8,1); 在指令操控模式下,常用的指令为: 播放:7E FF 06 0D 00 00 00 FE EE EF 暂停:7E FF 06 0E 00 00 00 FE ED EF 上一首:7E FF 06 01 00 00 00 FE FA EF 下一首:7E FF 06 02 00 00 00 FE F9 EF 结束:7E FF 06 16 00 00 00 FE E5 EF 按歌曲序号播放歌曲的函数如下: - unsigned char cmd3[] = {0X7E, 0xFF, 0x06, 0X03, 0x00, 0x00, 0x01, 0xFE, 0xF7, 0XEF};
- void playn(unsigned int index) //play index
- { // index为歌曲顺序号:0~2999
- u8 i;
- u8 checksum = 0;
- cmd3[5] = (u8)(index >> 8);
- cmd3[6] = (u8)(index);
- for(i=2; i<8; i++)
- {
- checksum += cmd3[i]; //计算校验和
- }
- cmd3[8] = (u8)~checksum;
- }
复制代码控制播放音量的函数如下: - unsigned char cmd6[] = {0X7E, 0xFF, 0x06, 0X06, 0x00, 0x00, 0x10, 0xFE, 0xE5, 0XEF}; //set Volume
- void setVolume(u8 index) //play index
- { // index为音量等级:0~30
- u8 i;
- u8 checksum = 0;
- cmd6[6] = (u8)(index);
- for (i=2; i<8; i++)
- {
- checksum += cmd6[i];
- }
- cmd6[8] = (u8)~checksum;
- }
复制代码
|