打印
[AVR单片机]

VS1003管脚配置是否出问题了,WINAVR开发软件,大神进来看看啊

[复制链接]
2539|4
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
/*
* MP3模块测试程序
*
* 用途:MP3模块测试程序
*       vs1003 的硬件测试程序,主控芯片为STC12LE5A60S2
*       其他的微处理器(带SPI接口的)只需稍加修改即可适用
*       对于不带硬SPI接口的微处理器可以用IO进行SPI的时序模拟
*
* 作者                                        日期                                备注
* Huafeng Lin                        20010/09/10                        新增
* Huafeng Lin                        20010/09/10                        修改
*
*/


//针对SD卡读写板调整引脚


#include <avr/io.h>
#include "vs1003h.h"


#define uchar unsigned char
#define uint unsigned int
#define ulong unsigned long
#define bool bit
#define true 1
#define flase 0

#define uint8 unsigned char
//#define PORT PORTA


#define  MP3_XRESET             0
#define MP3_XCS                                 1
#define MP3_XDCS                                 2
#define MP3_DREQ                             3
#define c_SPI_SI                                  4           
#define c_SPI_SO                                  5
#define CLK                                     6

#define MP3_DREQset                (PORTA|=(1<<(MP3_DREQ)))               
#define MP3_DREQclr      (PORTA&=(~(1<<(MP3_DREQ))))

#define Mp3PutInReset  (PORTA&=(~(1<<(MP3_XRESET ))))

#define Mp3ReleaseFromReset  (PORTA|=(1<<(MP3_XRESET)))


#define Mp3SelectControl  (PORTA&=(~(1<<(MP3_XCS))))

#define Mp3DeselectControl  (PORTA|=(1<<(MP3_XCS)))



#define Mp3SelectData        (PORTA&=(~(1<<(MP3_XDCS))))

#define Mp3DeselectData        (PORTA|=(1<<(MP3_XDCS)))



#define SI_High           (PORTA|=(1<<(c_SPI_SI)))
#define SI_Low           (PORTA&=(~(1<<(c_SPI_SI))))


#define SO_High           (PORTA|=(1<<(c_SPI_SO)))
#define SO_Low           (PORTA&=(~(1<<(c_SPI_SO))))

#define CLK_High     (PORTA|=(1<<(CLK)))
#define CLK_Low           (PORTA&=(~(1<<(CLK))))
void wait(unsigned char ucDelayCount)
{
        uchar ucTempCount;
        uchar uci;

        for(ucTempCount=0; ucTempCount<ucDelayCount; ucTempCount++)
        {
//                uci = 200;        //Err
//                uci = 250;        //OK
                uci = 230;
                while(uci--)
                {
                        ;
                   }
        }
}




/**********************************************************/
/*  函数名称 :  SPIPutChar                                */
/*  函数功能 : 通过SPI发送一个字节的数据                 */
/*  参数     :  待发送的字节数据                          */
/*  返回值   :  无                                        */
/*--------------------------------------------------------*/
void  SPIPutChar(unsigned char ucSendData)
{      
        //S0SPDR = c;
        //while((S0SPSR & 0x80) == 0);         //等待SPI将数据发送完毕
        // SPDR = ucSendData;
        //while (!(SPSR & 0x80));
             uchar ucCount;
        uchar ucMaskCode;

        ucMaskCode = 0x80;
        for(ucCount=0; ucCount<8; ucCount++)
        {
                CLK_Low;

                if(ucMaskCode & ucSendData)
                {
                        SI_High;
                }
                else
                {
                        SI_Low;
                }

                CLK_High;
                ucMaskCode >>= 1;

        }
}


/*************************************************************/
/*  函数名称 :  Mp3WriteRegister                             */
/*  函数功能 : 写vs1003寄存器                               */
/*  参数     :  寄存器地址,待写数据的高8位,待写数据的低8位 */
/*  返回值   :  无                                           */
/*-----------------------------------------------------------*/
void Mp3WriteRegister(unsigned char addressbyte, unsigned char highbyte, unsigned char lowbyte)
{
        //Mp3DeselectData();
        MP3_DREQset;
        while (MP3_DREQ == 0);
        Mp3SelectControl;//XCS = 0
        SPIPutChar(0x02); //发送写寄存器命令
        SPIPutChar(addressbyte);      //发送寄存器的地址
        SPIPutChar(highbyte);         //发送待写数据的高8位
        SPIPutChar(lowbyte);          //发送待写数据的低8位
        Mp3DeselectControl; //XCS=1
}


/**********************************************************/
/*  函数名称 :  Mp3Reset                                  */
/*  函数功能 : vs1003硬件复位                            */
/*  参数     :  无                                        */
/*  返回值   :  无                                        */
/*--------------------------------------------------------*/
void Mp3Reset(void)
{       
        Mp3PutInReset;//xReset = 0   复位vs1003      
        wait(200);//延时100ms
        SPIPutChar(0xff);//发送一个字节的无效数据,启动SPI传输
        Mp3DeselectControl;   //xCS = 1
        Mp3DeselectData;     //xDCS = 1
        Mp3ReleaseFromReset; //xRESET = 1
        wait(200);
        Mp3WriteRegister (0x00, 0x08, 0x04); //软件复位
        wait(200);            //延时100ms
        MP3_DREQset;
        while (MP3_DREQ == 0);  
        Mp3WriteRegister(0x03, 0x98, 0x00);//设置vs1003的时钟,3倍频
        wait(20);            //延时100ms
        Mp3WriteRegister (0x05, 0xBB, 0x81); //采样率48k,立体声
        wait(20);            //延时100ms
        Mp3WriteRegister(0x02, 0x00, 0x55);//设置重音  
        wait(20);            //延时100ms
        Mp3SetVolume(50,50);//设置音量
        wait(5); //延时1ms
                  //延时100ms
        //向vs1003发送4个字节无效数据,用以启动SPI发送
        SPIPutChar(0);
        SPIPutChar(0);
        SPIPutChar(0);
        SPIPutChar(0);
       
}
void VS1003B_WriteCMD(unsigned char addr, unsigned int dat)
{
/*
        VS1003B_XDCS_H();
        VS1003B_XCS_L();
        VS1003B_WriteByte(0x02);
        //delay_Nus(20);
        VS1003B_WriteByte(addr);
        VS1003B_WriteByte(dat>>8);
        VS1003B_WriteByte(dat);
        //delay_Nus(200);
        VS1003B_XCS_H();
*/
        Mp3WriteRegister(addr,dat>>8,dat);
}
  void VS1003B_SoftReset()
{
        VS1003B_WriteCMD(0x00,0x0804);//写复位
//        VS1003B_Delay(0xffff);//延时,至少1.35ms
        wait(2);
}

  int CheckVS1003B_DRQ(void)
{
        int bResult;

        bResult =MP3_DREQ;
        return(bResult);
}

/***********************************************************/
/*  函数名称 :  VsSineTest                                 */
/*  函数功能 : vs1003正弦测试,将该函数放在while循环中,  */
/*              如果能持续听到一高一低的声音,证明测试通过 */                           
/*  参数     :  无                                         */
/*  返回值   :  无                                         */
/*---------------------------------------------------------*/
void VsSineTest(void)
{
        Mp3PutInReset;  //xReset = 0   复位vs1003
        wait(200);        //延时100ms        
        SPIPutChar(0xff);//发送一个字节的无效数据,启动SPI传输
        Mp3DeselectControl;  //XCS=1
        Mp3DeselectData;     //XDCS=1
        Mp3ReleaseFromReset; //xReset = 1
        wait(200);                      
        Mp3SetVolume(50,50);  

        Mp3WriteRegister(0x00,0x08,0x20);//进入vs1003的测试模式
        while (MP3_DREQ == 0);     //等待DREQ为高
        Mp3SelectData;       //xDCS = 1,选择vs1003的数据接口
       
        //向vs1003发送正弦测试命令:0x53 0xef 0x6e n 0x00 0x00 0x00 0x00
        //其中n = 0x24, 设定vs1003所产生的正弦波的频率值,具体计算方法见vs1003的datasheet
           SPIPutChar(0x53);      
        SPIPutChar(0xef);      
        SPIPutChar(0x6e);      
        SPIPutChar(0x24);      
        SPIPutChar(0x00);      
        SPIPutChar(0x00);
        SPIPutChar(0x00);
        SPIPutChar(0x00);
//        wait(500);
        wait(250);
        wait(250);
        Mp3DeselectData;//程序执行到这里后应该能从耳机听到一个单一频率的声音
  
        //退出正弦测试
        Mp3SelectData;
        SPIPutChar(0x45);
        SPIPutChar(0x78);
        SPIPutChar(0x69);
        SPIPutChar(0x74);
        SPIPutChar(0x00);
        SPIPutChar(0x00);
        SPIPutChar(0x00);
        SPIPutChar(0x00);
//        wait(500);
        wait(250);
        wait(250);

        Mp3DeselectData;

        //再次进入正弦测试并设置n值为0x44,即将正弦波的频率设置为另外的值
        Mp3SelectData;      
        SPIPutChar(0x53);      
        SPIPutChar(0xef);      
        SPIPutChar(0x6e);      
        SPIPutChar(0x44);      
        SPIPutChar(0x00);      
        SPIPutChar(0x00);
        SPIPutChar(0x00);
        SPIPutChar(0x00);
//        wait(500);
        wait(250);
        wait(250);

        Mp3DeselectData;

        //退出正弦测试
        Mp3SelectData;
        SPIPutChar(0x45);
        SPIPutChar(0x78);
        SPIPutChar(0x69);
        SPIPutChar(0x74);
        SPIPutChar(0x00);
        SPIPutChar(0x00);
        SPIPutChar(0x00);
        SPIPutChar(0x00);
//        wait(500);
        wait(250);
        wait(250);

        Mp3DeselectData;
}   
/*
void open_mp3()
{
   int i=0;  
   Mp3Reset();
   MP3_XDCS=0;
   while(1)
   {
   MP3_DREQ=1;
   while(!MP3_DREQ);
   SPIPutChar(MusicData[i]);
   i++;
    }
}
       */

  



  

相关帖子

沙发
qin552011373| | 2013-4-18 23:03 | 只看该作者
帮顶

使用特权

评论回复
板凳
910200850|  楼主 | 2013-4-18 23:48 | 只看该作者
WINAVR里写void  SPIPutChar(unsigned char ucSendData)函数是不是有问题

使用特权

评论回复
地板
qin552011373| | 2013-4-20 09:32 | 只看该作者
910200850 发表于 2013-4-18 23:48
WINAVR里写void  SPIPutChar(unsigned char ucSendData)函数是不是有问题

应该没有的  怎么?

使用特权

评论回复
5
huangshuai0795| | 2013-4-28 15:54 | 只看该作者
VS1003技术问题找我, 我这边就是解决VS1003问题的    2355355260  :call:13751145915

使用特权

评论回复
发新帖 我要提问
您需要登录后才可以回帖 登录 | 注册

本版积分规则

2

主题

7

帖子

0

粉丝