电路原理图如下:

<ignore_js_op>

基于51单片机的vs1003 MP3模块原理图+测试程序_High

 <ignore_js_op>

基于51单片机的vs1003 MP3模块原理图+测试程序_High_02

 <ignore_js_op>

基于51单片机的vs1003 MP3模块原理图+测试程序_High_03



单片机源程序如下:

    1. /*
    2. * MP3模块测试程序
    3. *
    4. * 用途:MP3模块测试程序
    5. *       vs1003 的硬件测试程序,主控芯片为STC12LE5A60S2
    6. *       其他的微处理器(带SPI接口的)只需稍加修改即可适用
    7. *       对于不带硬SPI接口的微处理器可以用IO进行SPI的时序模拟
    8. *
    9. * 作者                                        日期                                备注
    10. * Huafeng Lin                        20010/09/10                        新增
    11. * Huafeng Lin                        20010/09/10                        修改
    12. *
    13. */
    14. 
    15. #include "vs1003.h"
    16. #include "MusicDataMP3.c"
    17. 
    18. 
    19. #include <intrins.h>
    20. 
    21. #define uchar unsigned char
    22. #define uint unsigned int
    23. #define ulong unsigned long
    24. #define bool bit
    25. #define true 1
    26. #define flase 0
    27. 
    28. 
    29. //针对SD卡读写板调整引脚
    30. #define uint8 unsigned char
    31. 
    32. sbit  MP3_XRESET  = P3^2;
    33. 
    34. #define Mp3PutInReset()  { MP3_XRESET = 0; }
    35. 
    36. #define Mp3ReleaseFromReset()  { MP3_XRESET =1; }
    37. 
    38. sbit MP3_XCS = P3^3;
    39. 
    40. #define Mp3SelectControl()  { MP3_XCS = 0; }
    41. 
    42. #define Mp3DeselectControl()  { MP3_XCS = 1; }
    43. 
    44. sbit MP3_XDCS  = P3^4;
    45. 
    46. #define Mp3SelectData()                { MP3_XDCS = 0; }
    47. 
    48. #define Mp3DeselectData()        { MP3_XDCS = 1; }
    49. 
    50. sbit MP3_DREQ = P3^5;
    51. 
    52. sbit c_SPI_SI = P1^5;
    53. sbit c_SPI_SO = P1^6;
    54. sbit c_SPI_CLK = P1^7;
    55. 
    56. #define Macro_Set_SI_High()          c_SPI_SI = 1
    57. #define Macro_Set_SI_Low()          c_SPI_SI = 0
    58. #define Macro_Set_CLK_High()          c_SPI_CLK = 1
    59. #define Macro_Set_CLK_Low()          c_SPI_CLK = 0
    60. 
    61. void LCD_write_english_string(unsigned char X,unsigned char Y,char *s);
    62. 
    63. //#define SPIWait()        { while((S0SPSR & 0x80) == 0); }//等待SPI将数据发送完毕
    64. 
    65. //#define SPI_RESULT_BYTE  S0SPDR
    66. 
    67. //extern long volatile timeval; //用于延时的全局变量
    68. //1ms Delayfunction
    69. //void Delay(uchar ucDelayCount)
    70. void wait(uchar ucDelayCount)
    71. {
    72.         uchar ucTempCount;
    73.         uchar uci;
    74. 
    75.         for(ucTempCount=0; ucTempCount<ucDelayCount; ucTempCount++)
    76.         {
    77. //                uci = 200;        //Err
    78. //                uci = 250;        //OK
    79.                 uci = 230;
    80.                 while(uci--)
    81.                 {
    82.                         _nop_();
    83.                    }
    84.         }
    85. }
    86. 
    87. //#define wait(x) Delay(x)
    88. /**********************************************************/
    89. /*  函数名称 :   MSPI_Init                                */
    90. /*  函数功能 : 初始化SPI接口,设置为主机。               */
    91. /*  参数     :  无                                        */
    92. /*  返回值   :  无                                        */
    93. /*--------------------------------------------------------*/
    94. void  MSPI_Init(void)
    95. {  
    96. /*
    97.         PINSEL0 = (PINSEL0 & 0xFFFF00FF) | 0x00005500;        //选择 SPI
    98.         S0SPCCR = 0x08;                                        // SPI 时钟设置
    99.          S0SPCR  = (0 << 3) |                                // CPHA = 0,
    100.                    (0 << 4) |                                // CPOL = 0,
    101.                    (1 << 5) |                                // MSTR = 1,
    102.                    (0 << 6) |                                // LSBF = 0,
    103.                    (0 << 7);                                // SPIE = 0,
    104. */
    105.         c_SPI_SO = 1;
    106.         MP3_DREQ = 1;
    107. 
    108. }
    109. 
    110. /**********************************************************/
    111. /*  函数名称 :  InitPortVS1003                            */
    112. /*  函数功能 : MCU与vs1003接口的初始化                   */
    113. /*  参数     :  无                                        */
    114. /*  返回值   :  无                                        */
    115. /*--------------------------------------------------------*/
    116. void  InitPortVS1003(void)
    117. {
    118.         MSPI_Init();//SPI口的初始化
    119. //        IODIR &= 0xfffeffff;   //其他接口线的设置,其中dreq 为输入口
    120. //        IODIR |= MP3_XRESET | MP3_XCS | MP3_XDCS;//xRESET,xCS,xDS均为输出口
    121. //        IOSET |= MP3_XRESET | MP3_XCS | MP3_XDCS;//xRESET,xCS,xDS默认输出高电平        
    122.         MP3_DREQ = 1;                //置为输入
    123. 
    124.         MP3_XRESET = 1;
    125.         MP3_XCS = 1;
    126.         MP3_XDCS = 1;
    127. }
    128. 
    129. //uint8 SD_SPI_ReadByte(void);
    130. //void SD_SPI_WriteByte(uint8 ucSendData);
    131. 
    132. //#define SPI_RecByte()  SD_SPI_ReadByte()
    133. //#define SPIPutChar(x) SD_SPI_WriteByte(x)
    134. 
    135. #if 1
    136. /**********************************************************/
    137. /*  函数名称 :  SPIPutChar                                */
    138. /*  函数功能 : 通过SPI发送一个字节的数据                 */
    139. /*  参数     :  待发送的字节数据                          */
    140. /*  返回值   :  无                                        */
    141. /*--------------------------------------------------------*/
    142. void  SPIPutChar(unsigned char ucSendData)
    143. {      
    144. //        S0SPDR = c;
    145. //        while((S0SPSR & 0x80) == 0);         //等待SPI将数据发送完毕
    146.         uchar ucCount;
    147.         uchar ucMaskCode;
    148. 
    149.         ucMaskCode = 0x80;
    150.         for(ucCount=0; ucCount<8; ucCount++)
    151.         {
    152.                 Macro_Set_CLK_Low();
    153. 
    154.                 if(ucMaskCode & ucSendData)
    155.                 {
    156.                         Macro_Set_SI_High();
    157.                 }
    158.                 else
    159.                 {
    160.                         Macro_Set_SI_Low();
    161.                 }
    162. 
    163.                 Macro_Set_CLK_High();
    164.                 ucMaskCode >>= 1;
    165. 
    166.         }
    167. }
    168. 
    169. /*******************************************************************************************************************
    170. ** 函数名称: INT8U SPI_RecByte()                                Name:          INT8U SPI_RecByte()
    171. ** 功能描述: 从SPI接口接收一个字节                                Function: receive a byte from SPI interface
    172. ** 输   入: 无                                                                        Input:          NULL
    173. ** 输   出: 收到的字节                                                        Output:          the byte that be received
    174. ********************************************************************************************************************/
    175. static uchar SPI_RecByte(void)
    176. {
    177.         uchar ucReadData;
    178.         uchar ucCount;
    179. 
    180.         ucReadData = 0;
    181.         Macro_Set_SI_High();
    182. 
    183.         for(ucCount=0; ucCount<8; ucCount++)
    184.         {
    185.                 ucReadData <<= 1;
    186.                         //降低时钟频率
    187.                 Macro_Set_CLK_Low();
    188. 
    189.         
    190.                 if(c_SPI_SO)
    191.                 {
    192.                         ucReadData |= 0x01;
    193.                 }
    194.                 Macro_Set_CLK_High();
    195. 
    196.         }
    197. 
    198.         return(ucReadData);
    199. }
    200. 
    201. #endif
    202. 
    203. /*************************************************************/
    204. /*  函数名称 :  Mp3WriteRegister                             */
    205. /*  函数功能 : 写vs1003寄存器                               */
    206. /*  参数     :  寄存器地址,待写数据的高8位,待写数据的低8位 */
    207. /*  返回值   :  无                                           */
    208. /*-----------------------------------------------------------*/
    209. void Mp3WriteRegister(unsigned char addressbyte, unsigned char highbyte, unsigned char lowbyte)
    210. {
    211.         Mp3DeselectData();
    212.         Mp3SelectControl();//XCS = 0
    213.         SPIPutChar(VS_WRITE_COMMAND); //发送写寄存器命令
    214.         SPIPutChar(addressbyte);      //发送寄存器的地址
    215.         SPIPutChar(highbyte);         //发送待写数据的高8位
    216.         SPIPutChar(lowbyte);          //发送待写数据的低8位
    217.         Mp3DeselectControl();
    218. }
    219. 
    220. /*************************************************************/
    221. /*  函数名称 :  Mp3ReadRegister                              */
    222. /*  函数功能 : 写vs1003寄存器                               */
    223. /*  参数     :  寄存器地址                                     */
    224. /*  返回值   :  vs1003的16位寄存器的值                       */
    225. /*-----------------------------------------------------------*/
    226. unsigned int Mp3ReadRegister(unsigned char addressbyte)
    227. {
    228.         unsigned int resultvalue = 0;
    229.         uchar ucReadValue;
    230. 
    231.         Mp3DeselectData();
    232.         Mp3SelectControl();//XCS = 0
    233.         SPIPutChar(VS_READ_COMMAND); //发送读寄存器命令
    234.         SPIPutChar((addressbyte));         //发送寄存器的地址
    235. 
    236. //        SPIPutChar(0xff);                 //发送读时钟
    237. //        resultvalue = (SPI_RESULT_BYTE) << 8;//读取高8位数据
    238.         ucReadValue = SPI_RecByte();
    239.         resultvalue = ucReadValue<<8;
    240. //        SPIPutChar(0xff);                   //发送读时钟
    241. //        resultvalue |= (SPI_RESULT_BYTE);  //读取低8位数据
    242.         ucReadValue = SPI_RecByte();
    243.         resultvalue |= ucReadValue;
    244. 
    245.         Mp3DeselectControl();              
    246.         return resultvalue;                 //返回16位寄存器的值
    247. }
    248. 
    249. /**********************************************************/
    250. /*  函数名称 :  Mp3SoftReset                              */
    251. /*  函数功能 : vs1003软件复位                            */
    252. /*  参数     :  无                                        */
    253. /*  返回值   :  无                                        */
    254. /*--------------------------------------------------------*/
    255. void Mp3SoftReset(void)
    256. {
    257.         Mp3WriteRegister (SPI_MODE, 0x08, 0x04); //软件复位
    258. 
    259.         wait(1); //延时1ms
    260.         while (MP3_DREQ == 0); //等待软件复位结束
    261.         Mp3WriteRegister(SPI_CLOCKF, 0x98, 0x00);//设置vs1003的时钟,3倍频
    262.         Mp3WriteRegister (SPI_AUDATA, 0xBB, 0x81); //采样率48k,立体声
    263.         Mp3WriteRegister(SPI_BASS, 0x00, 0x55);//设置重音
    264.         Mp3SetVolume(10,10);//设置音量
    265.     wait(1); //延时1ms
    266.             
    267.             //向vs1003发送4个字节无效数据,用以启动SPI发送
    268.            Mp3SelectData();
    269.         SPIPutChar(0);
    270.         SPIPutChar(0);
    271.         SPIPutChar(0);
    272.         SPIPutChar(0);
    273.         Mp3DeselectData();
    274. 
    275. }
    276. /**********************************************************/
    277. /*  函数名称 :  Mp3Reset                                  */
    278. /*  函数功能 : vs1003硬件复位                            */
    279. /*  参数     :  无                                        */
    280. /*  返回值   :  无                                        */
    281. /*--------------------------------------------------------*/
    282. void Mp3Reset(void)
    283. {        
    284.         Mp3PutInReset();//xReset = 0   复位vs1003      
    285.         wait(200);//延时100ms
    286.         SPIPutChar(0xff);//发送一个字节的无效数据,启动SPI传输
    287.         Mp3DeselectControl();   //xCS = 1
    288.         Mp3DeselectData();     //xDCS = 1
    289.         Mp3ReleaseFromReset(); //xRESET = 1
    290.         wait(200);            //延时100ms
    291.         while (MP3_DREQ == 0);//等待DREQ为高
    292. 
    293.     wait(200);            //延时100ms
    294.          Mp3SetVolume(50,50);  
    295.     Mp3SoftReset();//vs1003软复位
    296. }
    297. 
    298. 
    299. bool CheckVS1003B_DRQ(void)
    300. {
    301.         bool bResult;
    302. 
    303.         bResult =MP3_DREQ;
    304.         return(bResult);
    305. }
    306. 
    307. /***********************************************************/
    308. /*  函数名称 :  VsSineTest                                 */
    309. /*  函数功能 : vs1003正弦测试,将该函数放在while循环中,  */
    310. /*              如果能持续听到一高一低的声音,证明测试通过 */                           
    311. /*  参数     :  无                                         */
    312. /*  返回值   :  无                                         */
    313. /*---------------------------------------------------------*/
    314. void VsSineTest(void)
    315. {
    316.         Mp3PutInReset();  //xReset = 0   复位vs1003
    317.         wait(200);        //延时100ms        
    318.         SPIPutChar(0xff);//发送一个字节的无效数据,启动SPI传输
    319.         Mp3DeselectControl();  
    320.         Mp3DeselectData();     
    321.         Mp3ReleaseFromReset();
    322.         wait(200);                       
    323.         Mp3SetVolume(50,50);  
    324. 
    325.          Mp3WriteRegister(SPI_MODE,0x08,0x20);//进入vs1003的测试模式
    326.         while (MP3_DREQ == 0);     //等待DREQ为高
    327.          Mp3SelectData();       //xDCS = 1,选择vs1003的数据接口
    328.          
    329.          //向vs1003发送正弦测试命令:0x53 0xef 0x6e n 0x00 0x00 0x00 0x00
    330.          //其中n = 0x24, 设定vs1003所产生的正弦波的频率值,具体计算方法见vs1003的datasheet
    331.            SPIPutChar(0x53);      
    332.         SPIPutChar(0xef);      
    333.         SPIPutChar(0x6e);      
    334.         SPIPutChar(0x24);      
    335.         SPIPutChar(0x00);      
    336.         SPIPutChar(0x00);
    337.         SPIPutChar(0x00);
    338.         SPIPutChar(0x00);
    339. //        wait(500);
    340.         wait(250);
    341.         wait(250);
    342.         Mp3DeselectData();//程序执行到这里后应该能从耳机听到一个单一频率的声音
    343.   
    344.         //退出正弦测试
    345.         Mp3SelectData();
    346.         SPIPutChar(0x45);
    347.         SPIPutChar(0x78);
    348.         SPIPutChar(0x69);
    349.         SPIPutChar(0x74);
    350.         SPIPutChar(0x00);
    351.         SPIPutChar(0x00);
    352.         SPIPutChar(0x00);
    353.         SPIPutChar(0x00);
    354. //        wait(500);
    355.         wait(250);
    356.         wait(250);
    357. 
    358.         Mp3DeselectData();
    359. 
    360.         //再次进入正弦测试并设置n值为0x44,即将正弦波的频率设置为另外的值
    361.     Mp3SelectData();      
    362.         SPIPutChar(0x53);      
    363.         SPIPutChar(0xef);      
    364.         SPIPutChar(0x6e);      
    365.         SPIPutChar(0x44);      
    366.         SPIPutChar(0x00);      
    367.         SPIPutChar(0x00);
    368.         SPIPutChar(0x00);
    369.         SPIPutChar(0x00);
    370. //        wait(500);
    371.         wait(250);
    372.         wait(250);
    373. 
    374.         Mp3DeselectData();
    375. 
    376.         //退出正弦测试
    377.         Mp3SelectData();
    378.         SPIPutChar(0x45);
    379.         SPIPutChar(0x78);
    380.         SPIPutChar(0x69);
    381.         SPIPutChar(0x74);
    382.         SPIPutChar(0x00);
    383.         SPIPutChar(0x00);
    384.         SPIPutChar(0x00);
    385.         SPIPutChar(0x00);
    386. //        wait(500);
    387.         wait(250);
    388.         wait(250);
    389. 
    390.         Mp3DeselectData();
    391. }
    392. 
    393. void test_1003_PlayMP3File();
    394. 
    395. void TestVS1003B(void)
    396. {
    397.         Mp3Reset();
    398.         VsSineTest();
    399.         Mp3SoftReset();
    400.         test_1003_PlayMP3File();
    401. }
    402. 
    403. //写寄存器,参数,地址和数据
    404. void VS1003B_WriteCMD(unsigned char addr, unsigned int dat)
    405. {
    406. /*
    407.         VS1003B_XDCS_H();
    408.         VS1003B_XCS_L();
    409.         VS1003B_WriteByte(0x02);
    410.         //delay_Nus(20);
    411.         VS1003B_WriteByte(addr);
    412.         VS1003B_WriteByte(dat>>8);
    413.         VS1003B_WriteByte(dat);
    414.         //delay_Nus(200);
    415.         VS1003B_XCS_H();
    416. */
    417.         Mp3WriteRegister(addr,dat>>8,dat);
    418. }
    419. 
    420. //读寄存器,参数 地址 返回内容
    421. unsigned int VS1003B_ReadCMD(unsigned char addr)
    422. {
    423. /*
    424.         unsigned int temp;
    425.         unsigned char temp1;
    426.         VS1003B_XDCS_H();
    427.         VS1003B_XCS_L();
    428.         VS1003B_WriteByte(0x03);
    429.         //delay_Nus(20);
    430.         VS1003B_WriteByte(addr);
    431.         temp=  VS1003B_ReadByte();
    432.         temp=temp<<8;
    433.         temp1= VS1003B_ReadByte();
    434.         temp=temp|temp1;;
    435.         VS1003B_XCS_H();
    436.         return temp;
    437. */
    438.         return(Mp3ReadRegister(addr));
    439. }
    440. 
    441. //写数据,音乐数据
    442. void VS1003B_WriteDAT(unsigned char dat)
    443. {
    444. //        VS1003B_XDCS_L();
    445. //        VS1003B_WriteByte(dat);
    446. //        VS1003B_XDCS_H();
    447. //        VS1003B_XCS_H();
    448. 
    449.            Mp3SelectData();
    450.         SPIPutChar(dat);
    451.         Mp3DeselectData();
    452.         Mp3DeselectControl();
    453. 
    454. }
    455. 
    456. //开启环绕声
    457. void VS1003B_SetVirtualSurroundOn(void)
    458. {
    459.         uchar ucRepeatCount;
    460.         uint uiModeValue;
    461. 
    462.         ucRepeatCount =0;
    463. 
    464.         while(1)//写时钟寄存器
    465.         {
    466.                 uiModeValue = VS1003B_ReadCMD(0x00);
    467.                 if(uiModeValue & 0x0001)
    468.                 {
    469.                         break;
    470.                 }
    471.                 else
    472.                 {
    473.                         uiModeValue |= 0x0001;
    474.                         VS1003B_WriteCMD(0,uiModeValue);
    475.                 }
    476.                 ucRepeatCount++;
    477.                 if(ucRepeatCount++ >10 )break;
    478.         }
    479. 
    480. }
    481. 
    482. //关闭环绕声
    483. void VS1003B_SetVirtualSurroundOff(void)
    484. {
    485.         uchar ucRepeatCount;
    486.         uint uiModeValue;
    487. 
    488.         ucRepeatCount =0;
    489. 
    490.         while(1)//写时钟寄存器
    491.         {
    492.                 uiModeValue = VS1003B_ReadCMD(0x00);
    493.                 if(uiModeValue & 0x0001)
    494.                 {
    495.                         break;
    496.                 }
    497.                 else
    498.                 {
    499.                         uiModeValue |= 0x0001;
    500.                         VS1003B_WriteCMD(0,uiModeValue);
    501.                 }
    502.                 ucRepeatCount++;
    503.                 if(ucRepeatCount++ >10 )break;
    504.         }
    505. 
    506. }
    507. 
    508. //增强重音
    509. //入口参数        1.强度0-15
    510. //                        2.频率0-15 (X10Hz)
    511. void VS1003B_SetBassEnhance(uchar ucValue, ucFrequencyID)
    512. {
    513.         uchar ucRepeatCount;
    514.         uint uiWriteValue;
    515.         uint uiReadValue;        
    516. 
    517.         ucRepeatCount =0;
    518. 
    519.         uiWriteValue = VS1003B_ReadCMD(0x02);
    520. 
    521.         uiWriteValue &= 0xFF00;
    522.         uiWriteValue |= ucValue<<4;
    523.         uiWriteValue &= (ucFrequencyID & 0x0F);
    524. 
    525.         while(1)//写时钟寄存器
    526.         {
    527. 
    528.                 VS1003B_WriteCMD(2,uiWriteValue);
    529.                 uiReadValue = VS1003B_ReadCMD(0x02);
    530.                
    531.                 if(uiReadValue == uiWriteValue)
    532.                 {
    533.                         break;
    534.                 }
    535.                 ucRepeatCount++;
    536.                 if(ucRepeatCount++ >10 )break;
    537.         }
    538. 
    539. }
    540. 
    541. 
    542. uint uiVolumeCount;                //当前音量值
    543. 
    544. //VS1003初始化,0成功 1失败
    545. unsigned char VS1003B_Init()
    546. {
    547.         unsigned char retry;
    548. /*
    549.         PORT_INI();
    550.         DDRB|=0xa0;
    551.         VS1003B_DDR &=~(1<<VS1003B_DREQ);
    552.         //delay_Nus(50);
    553.         VS1003B_XCS_H();
    554.         VS1003B_XDCS_H();
    555.         VS1003B_XRESET_L();
    556.         VS1003B_Delay(0xffff);
    557.         VS1003B_XRESET_H();//使能芯片
    558.         VS1003B_SPI_Low();//先以低频操作
    559.         VS1003B_Delay(0xffff);//延时
    560. */
    561. Mp3Reset();
    562. 
    563.         retry=0;
    564.         while(VS1003B_ReadCMD(0x00) != 0x0800)//写mode寄存器
    565.         {
    566.                 VS1003B_WriteCMD(0x00,0x0800);
    567.                 if(retry++ >10 )break;//{PORTB|=_BV(PB1);break;}
    568.         }
    569.         retry=0;
    570.         /*while(VS1003B_ReadCMD(0x02) != 0x75)//写mode寄存器
    571.         {
    572.                 VS1003B_WriteCMD(0x02,0x75);
    573.                 if(retry++ >10 )break;//{PORTB|=_BV(PB1);break;}
    574.         }*/
    575.         retry=0;
    576.         while(VS1003B_ReadCMD(0x03) != 0x9800)//写时钟寄存器
    577.         {
    578.                 VS1003B_WriteCMD(0x03,0x9800);
    579.                 if(retry++ >10 )break;
    580.         }
    581. ……………………
    582. 
    583. …………限于本文篇幅 余下代码请从51黑下载附件…………
    584.