⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 vs1003.c

📁 MSP430控制VS1003播放SD卡中的音乐
💻 C
字号:

/*********************************************************

        +-----------------------------------------+
        |              VS1003模块                   |
        +-----------------------------------------+
使用UART1串口SPI模式控制SD卡存储  端口选择 P5.4=/xCS,
    P5.5=/xDCS ,P5.3=SCLK,P5.2=SO,P5.1=SI,P5.6=DREQ ,   
    P5.0=/xRESET   
vs1003的底层驱动程序,主控芯片为msp340-149;
其他的微处理器(带SPI接口的)只需稍加修改即可适用;

             ->产品咨询 QQ:461693690 
		       MSN:ly461693690@hotmail.com
	                    
说明:VS1003模块 通过测试,确保其正确性与稳定性,请放心使用,
      			  
***********************************************************/

#include "vs1003.h"
#include "patch.h"
#include "myfun.c"


void open_xt2(void)
{
  BCSCTL1 &= ~XT2OFF;
  char n;
  do
  {
    IFG1 &= ~OFIFG;
    for(n=0xee;n>0;n--)
    {
      ;
    }
  }
  while((IFG1&OFIFG)!=0);    
  BCSCTL2 |= SELM_2 + SELS;       
}
void SPI_init(void)
{ 
  open_xt2();
  UCTL1=SWRST;//开启设置
  UTCTL1=CKPH+SSEL1+STC;//选择SMCLK
  UCTL1|=CHAR+SYNC+MM;//8为数据 SPI模式
  UBR01=0x03;//波特率设置 
  UBR11=0X00;
  UMCTL1=0X00;
  UCTL1&=~SWRST;//关闭设置
  ME2|=USPIE1;//使能SPI
}
/**********************************************************/
/*  函数名称 :  InitPortVS1003                            */
/*  函数功能 : MCU与vs1003接口的初始化                   */
/*  参数     :  无                                        */
/*  返回值   :  无                                        */
/*--------------------------------------------------------*/
void  InitPortVS1003(void)
{
              P5SEL|=0X0e;//0000 1110 P5.0.1.2.3选择第二功能
              P5DIR|=0X3B;//0011 1011 接DREQ ,SO
              SPI_init();
}



/**********************************************************/
/*  函数名称 :  SPIPutChar                                */
/*  函数功能 : 通过SPI发送一个字节的数据                 */
/*  参数     :  待发送的字节数据                          */
/*  返回值   :  无                                        */
/*--------------------------------------------------------*/

SPI_Write_Byte(unsigned char byte)
 { unsigned char temp=0;
    while((IFG2&UTXIFG1)==0);//等待...直到发送中断标志位置位
         TXBUF1=byte;
    while((IFG2&URXIFG1)==0);//等待...直到接受缓存数据满  再取回数据
         temp = RXBUF1;
    return temp;
  }


/******************************************************************
 - 功能描述:向VS1003的功能寄存器中写入数据(一个字,即两个字节)
 - 隶属模块:VS1003B模块
 - 函数属性:外部,用户可调用
 - 参数说明:addr是功能寄存器的地址
             hdat是要写入的高字节
             ldat是要写入的低字节
 - 返回说明:无返回
 ******************************************************************/
void VS_Write_Reg(unsigned char addr,unsigned char hdat,unsigned char ldat)
{
     while(!(P5IN&MP3_DREQ));//VS1003的DREQ为高电平时才接收数据
     Mp3SelectControl();//打开片选,SCI有效,这样才能对功能寄存器进行读写
     SPI_Write_Byte(VS_WRITE_COMMAND);  //写入操作码0x02   00000010 (功能寄存器写操作)
     SPI_Write_Byte(addr);  //写入寄存器地址
     SPI_Write_Byte(hdat);  //写入高字节
     SPI_Write_Byte(ldat);  //写入低字节
     Mp3DeselectControl(); //关闭片选,SCI无效
}
/******************************************************************
 - 功能描述:从VS1003的功能寄存器中读取数据(一个字)
 - 隶属模块:VS1003B模块
 - 函数属性:外部,用户可调用
 - 参数说明:addr是功能寄存器的地址
 - 返回说明:返回从VS1003的功能寄存器中读到的值 
 ******************************************************************/

unsigned int VS_Read_Reg(unsigned char addr) 
{  unsigned int temp=0,temp1;
    while(!(P5IN&MP3_DREQ));//VS1003的DREQ为高电平时才接收数据
    Mp3SelectControl();//打开片选,SCI有效
    SPI_Write_Byte(VS_READ_COMMAND);  //读出操作码0x03   00000011(功能寄存器读操作)
    temp =SPI_Write_Byte(addr);  //写入寄存器地址 并读数据
    temp1 = temp;
    temp<<=8;
    temp|=temp1;
    Mp3DeselectControl(); //关闭片选,SCI无效
    return temp;     //返回读到的值
}
/******************************************************************
 - 功能描述:VS1003复位及初始化(设置时钟频率及音量)
 - 隶属模块:VS1003B模块
 - 函数属性:外部,用户可调用
 - 参数说明:无
 - 返回说明:无
 ******************************************************************/
void VS_Reset()
{
    Mp3ReleaseFromReset();   //RES=1 
    delay(100);
    Mp3PutInReset();        //RES=0
    delay(100);
    Mp3ReleaseFromReset();    //硬件复位,XRESET低电平有效
    delay(100);

    VS_Write_Reg(SPI_MODE  ,0x08,0x04);  //软件复位,向0号寄存器写入0x0804   SM_SDINEW为1   SM_RESET为1
    VS_Write_Reg(SPI_CLOCKF,0x98,0x00);  //时钟设置,向3号寄存器写入0x9800   SC_MULT  为4   SC_ADD  为3   SC_FREQ为0
    VS_Write_Reg(SPI_VOL   ,0x30,0x30);  //音量设置,//0x00,0x00左右声道均最大音量
   
    Mp3SelectData();	     //打开数据片选,注意此时XCS(命令片选)为高电平,SDI有效
    SPI_Write_Byte(0);    //写入数据,这里写入4个0,是无关数据,用来启动数据传输
    SPI_Write_Byte(0);
    SPI_Write_Byte(0);
    SPI_Write_Byte(0);
    Mp3DeselectData();	    //关闭数据片选,SDI无效
} 
/******************************************************************
 - 功能描述:向VS1003写入一个字节的音频数据(即用于播放的数据)
             注:调用前先将VS_XDCS置为0,打开数据片选
 - 隶属模块:VS1003B模块
 - 函数属性:外部,用户可调用
 - 参数说明:dat是要写入的字节
 - 返回说明:无
 ******************************************************************/

void VS_Send_Dat(unsigned char dat) 
{ 
   
   while(!(P5IN&MP3_DREQ));  //VS1003的DREQ为高才能写入数据
   SPI_Write_Byte(dat);//通过SPI向VS1003写入一个字节的音频数据
}
/******************************************************************
 - 功能描述:向VS1003写入2048个0,用于清空VS1003的数据缓冲区
             注:在播放完一个完整的音频(如一首完整的MP3)后,调用
             此函数,清空VS1003数据缓冲区,为下面的音频数据(如下
             一首MP3)作准备。        
 - 隶属模块:VS1003B模块
 - 函数属性:外部,用户可调用
 - 参数说明:无
 - 返回说明:无
 ******************************************************************/
void VS_Flush_Buffer() 
{
  unsigned int i;
    Mp3SelectData();	   //打开数据片选,即开启SDI传输
    for(i=0;i<2048;i++)
      {
        VS_Send_Dat(0);
       }
    Mp3DeselectData();        //关闭数据片选
}



⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -