MP3音乐播放器芯片VS1053B芯片使用教程MP3,MP4,数码相机曾经是奢侈品。科技发展了,这些东西也就成了普通手机的附属品了。但是作为手艺人学习这些芯片了解这些高性能芯片是很有必要的。学习了解它既拓展了自己的眼界,也可以提升自己对嵌入式系统的认识。原子战舰板上就板载了一颗高性能MP3音乐播放器芯片VS1053B芯片。通过原子源码对一些参数的修改,也能欣赏美妙的音乐。这是一款真正的数字产品。还可以作为录音机使用。VS1053是继VS1003后荷兰VLSI公司出品的又一款高性能解码芯片。该芯片可以实现对MP3/OGG/WMA/FLAC/WAV/AAC/MIDI等音频格式的解码,同时还可以支持ADPCM/OGG等格式的编码,性能相对以往的VS1003提升不少。VS1053拥有一个高性能的DSP处理器核VS_DSP,16K的指令RAM,0.5K的数据RAM,通过SPI控制,具有8个可用的通用IO口和一个串口,芯片内部还带了一个可变采样率的立体声ADC(支持咪头/咪头+线路/2线路)、一个高性能立体声DAC及音频耳机放大器。VS1053既然是高性能DSP,也就是说它本身就可以作为主机象普通MCU一样使用。同普通MCU一样DSP也具有一样的最小系统,所以在电路设计中自然就必须要晶振和复位电路。通过读datasheet知道,VS1053B也有中断功能,同样有GPIO!操作寄存器可以控制时钟频率。下面是电路图:下面是音频驱动电路图:即耳机驱动电路。这两张电路图是战舰板原理图,电路图设计是核心技术。本人对原子的电路设计只有学习和佩服的份。其中74HC4052和TDA1308分别是用作音频选择和耳机驱动,74HC4052芯片将板载的MP3,FM收音机和STM32发出的方波信号通过程序控制做出选择;也就是说将众多音频信号集于一身可以分别单独送到耳机驱动电路输出,既节约了空间也节约了成本。设计非常精妙!通过学习VS1053B,对电路分析能力也有提高。如果看不懂电路图,即便c语言代码分析的多么透彻也无济于事。通过学习类似VS1053B芯片的驱动,能真正提高手艺人的编程能力。通过数据手册,写出相应芯片的驱动程序实现一些简单功能是一个程序员的核心竞争力!这里涉及到许多c语言编程技巧。一句话,目前我是没有这个能力。也就只能好好学习别人源码的份了。有所收获就记录下来。VS1053B,LCD,RDA5802收音机芯片,ADXL345重力加速度传感器芯片等等这些芯片,它们有一个共同点:寄存器,寄存器地址,数据帧,命令字,I2C,SPI协议等等。学会这些外设芯片的驱动程序编写方法,才能真正发挥ARM处理器的强大功能。下面是单片机程序的主要部分预览:/**MP3模块测试程序**用途:MP3模块测试程序*vs1003的硬件测试程序,主控芯片为STC12LE5A60S2*其他的微处理器(带SPI接口的)只需稍加修改即可适用*对于不带硬SPI接口的微处理器可以用IO进行SPI的时序模拟**作者日期备注*HuafengLin20010/09/10新增*HuafengLin20010/09/10修改**/#includevs1003.h#includeMusicDataMP3.c#includeintrins.h#defineucharunsignedchar#defineuintunsignedint#defineulongunsignedlong#defineboolbit#definetrue1#defineflase0//针对SD卡读写板调整引脚#defineuint8unsignedcharsbitMP3_XRESET=P3^2;#defineMp3PutInReset(){MP3_XRESET=0;}#defineMp3ReleaseFromReset(){MP3_XRESET=1;}sbitMP3_XCS=P3^3;#defineMp3SelectControl(){MP3_XCS=0;}#defineMp3DeselectControl(){MP3_XCS=1;}sbitMP3_XDCS=P3^4;#defineMp3SelectData(){MP3_XDCS=0;}#defineMp3DeselectData(){MP3_XDCS=1;}sbitMP3_DREQ=P3^5;sbitc_SPI_SI=P1^5;sbitc_SPI_SO=P1^6;sbitc_SPI_CLK=P1^7;#defineMacro_Set_SI_High()c_SPI_SI=1#defineMacro_Set_SI_Low()c_SPI_SI=0#defineMacro_Set_CLK_High()c_SPI_CLK=1#defineMacro_Set_CLK_Low()c_SPI_CLK=0voidLCD_write_english_string(unsignedcharX,unsignedcharY,char*s);//#defineSPIWait(){while((S0SPSR&0x80)==0);}//等待SPI将数据发送完毕//#defineSPI_RESULT_BYTES0SPDR//externlongvolatiletimeval;//用于延时的全局变量//1msDelayfunction//voidDelay(ucharucDelayCount)voidwait(ucharucDelayCount){ucharucTempCount;ucharuci;for(ucTempCount=0;ucTempCountucDelayCount;ucTempCount++){//uci=200;//Err//uci=250;//OKuci=230;while(uci--){_nop_();}}}//#definewait(x)Delay(x)/**********************************************************//*函数名称:MSPI_Init*//*函数功能:初始化SPI接口,设置为主机。*//*参数:无*//*返回值:无*//*--------------------------------------------------------*/voidMSPI_Init(void){/*PINSEL0=(PINSEL0&0xFFFF00FF)|0x00005500;//选择SPIS0SPCCR=0x08;//SPI时钟设置S0SPCR=(03)|//CPHA=0,(04)|//CPOL=0,(15)|//MSTR=1,(06)|//LSBF=0,(07);//SPIE=0,*/c_SPI_SO=1;MP3_DREQ=1;}/**********************************************************//*函数名称:InitPortVS1003*//*函数功能:MCU与vs1003接口的初始化*//*参数:无*//*返回值:无*//*--------------------------------------------------------*/voidInitPortVS1003(void){MSPI_Init();//SPI口的初始化//IODIR&=0xfffeffff;//其他接口线的设置,其中dreq为输入口//IODIR|=MP3_XRESET|MP3_XCS|MP3_XDCS;//xRESET,xCS,xDS均为输出口//IOSET|=MP3_XRESET|MP3_XCS|MP3_XDCS;//xRESET,xCS,xDS默认输出高电平MP3_DREQ=1;//置为输入MP3_XRESET=1;MP3_XCS=1;MP3_XDCS=1;}//uint8SD_SPI_ReadByte(void);//voidSD_SPI_WriteByte(uint8ucSendData);//#defineSPI_RecByte()SD_SPI_ReadByte()//#defineSPIPutChar(x)SD_SPI_WriteByte(x)#if1/**********************************************************//*函数名称:SPIPutChar*//*函数功能:通过SPI发送一个字节的数据*//*参数:待发送的字节数据*//*返回值:无*//*--------------------------------------------------------*/voidSPIPutChar(unsignedcharucSendData){//S0SPDR=c;//while((S0SPSR&0x80)==0);//等待SPI将数据发送完毕ucharucCount;ucharucMaskCode;ucMaskCode=0x80;for(ucCount=0;ucCount8;ucCount++){Macro_Set_CLK_Low();if(ucMaskCode&ucSendData){Macro_Set_SI_High();}else{Macro_Set_SI_Low();}Macro_Set_CLK_High();ucMaskCode=1;}}/*********************************************************************************************************************函数名称:INT8USPI_RecByte()Name:INT8USPI_RecByte()**功能描述:从SPI接口接收一个字节Function:receiveabytefromSPIinterface**输入:无Input:NULL**输出:收到的字节Output:thebytethatbereceived********************************************************************************************************************/staticucharSPI_RecByte(void){ucharucReadData;ucharucCount;ucReadData=0;Macro_Set_SI_High();for(ucCount=0;ucCount8;ucCount++){ucReadData=1;//降低时钟频率Macro_Set_CLK_Low();if(c_SPI_SO){ucReadData|=0x01;}Macro_Set_CLK_High();}return(ucReadData);}#endif/*************************************************************//*函数名称:Mp3WriteRegister*//*函数功能:写vs1003寄存器*//*参数:寄存器地址,待写数据的高8位,待写数据的低8位*//*返回值:无*//*-----------------------------------------------------------*/voidMp3WriteRegister(unsignedcharaddressbyte,unsignedcharhighbyte,unsignedcharlowbyte){Mp3DeselectData();Mp3SelectControl();//XCS=0SPIPutChar(VS_WRITE_COMMAND);//发送写寄存器命令SPIPutChar(addressbyte);//发送寄存器的地址SPIPutChar(highbyte);//发送待写数据的高8位SPIPu