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

📄 vs1003.c

📁 用串口来显示和操作的基于ucos的以sd卡为存储介质的mp3源码
💻 C
字号:
#define IN_VS1003
#include "User.h"


#define SPI_EN 1

extern OS_EVENT *VS_Operation;
extern OS_EVENT *Uart0_Receive_data;


INT8U VS_OP;
INT32U ReadFlen;
INT8U LVolume=20,RVolume=20;
INT8U BassEnhanceValue=0x00,TrebleEnhanceValue=0x00;
extern INT8U MP3Handle;


/**********************************************************/
/*  函数名称 :   SPI_Init                                */
/*  函数功能 : 初始化SPI接口,设置为主机。               */
/*  参数     :  无                                        */
/*  返回值   :  无                                        */
/*--------------------------------------------------------*/
void  SPI_Init(void)
{  
	#if SPI_EN > 0
	
	PINSEL0 = (PINSEL0 & 0xFFFF00FF) | 0x00001500;	//选择 SPI 
    	                        
 	S0SPCR = (0x00 << 3) |			// CPHA = 0, 
 		     (0x00 << 4) |			// CPOL = 0, 
 		     (0x01 << 5) |			// MSTR = 1,SPI  处于主模式
 		     (0x00 << 6) |			// LSBF = 0,SPI据传输MSB(bit7)在先
 	         (0x00 << 7);			// SPIE = 0,SPI中断禁止
	
 	S0SPCCR = 8;	  	//SPI 时钟预分频(PCLK/8)
 	
	#else 
	
	IODIR0 |= SCLK | MOSI ; 
	IODIR0 &= (~ MISO);
	
	#endif		
}

/**********************************************************/
/*  函数名称 :  InitPortVS1003                            */
/*  函数功能 : MCU与vs1003接口的初始化                   */
/*  参数     :  无                                        */
/*  返回值   :  无                                        */
/*--------------------------------------------------------*/
void  InitPortVS1003(void)
{
	SPI_Init();//SPI口的初始化
	SPI_SendData(0xff);
	IODIR0 &=(~ MP3_DREQ);   //其他接口线的设置,其中dreq 为输入口
	IODIR0 |= MP3_XRESET | MP3_XCS | MP3_XDCS;//xRESET,xCS,xDS均为输出口
	IOSET0 |= MP3_XRESET | MP3_XCS | MP3_XDCS;//xRESET,xCS,xDS默认输出高电平
}


/**********************************************************/
/*  函数名称 :  SPI_SendData                              */
/*  函数功能 : 通过SPI发送一个字节的数据并接收一字节     */
/*  参数     :  待发送的字节数据                          */
/*  返回值   :  接收到的数据                              */
/*--------------------------------------------------------*/
INT8U SPI_SendData(INT8U data)
{      
	#if SPI_EN == 0
	
	INT8U i,j,temp,rev_data;
	
	temp = data;
	for(i = 0; i <= 7; i++)
    {
		IO0SET |= SCLK;
		if(temp & 0x80)
			IO0SET |= MOSI; 
		else
			IO0CLR |= MOSI;
		rev_data <<=1;
		if(IO0PIN & MISO)
			rev_data |= 0x01;
		else
			rev_data &= 0xFE;
		for(j=8;j>0;j--);
		IO0CLR |= SCLK;
		for(j=8;j>0;j--);
		temp <<= 1;
	}
	IO0SET |= SCLK;
	return(rev_data) ;
	
	#else
	
	S0SPDR = data;
	while((S0SPSR & 0x80) == 0);	 //等待SPI将数据发送完毕
	return(S0SPDR);
	
	#endif
}


/**********************************************************/
/*  函数名称 :  Mp3SetVolume                              */
/*  函数功能 : 设置左右声道音量                          */
/*  参数     :  leftchannel-左声道 rightchannel-右声道  */
/*  返回值   :  无                                        */
/*--------------------------------------------------------*/
void Mp3SetVolume(INT8U leftchannel,INT8U rightchannel) 
{ 
	Mp3WriteRegister(SPI_VOL,(leftchannel),(rightchannel));
}
		

/**********************************************************/
/*  函数名称 :  Mp3SoftReset                              */
/*  函数功能 : vs1003软件复位                            */
/*  参数     :  无                                        */
/*  返回值   :  无                                        */
/*--------------------------------------------------------*/
void Mp3SoftReset(void)
{
	Mp3WriteRegister (SPI_MODE, 0x08, 0x04); //软件复位
	OSTimeDly(OS_TICKS_PER_SEC/100); //延时10ms
	while (IOPIN0 & MP3_DREQ == 0); //等待软件复位结束
	Mp3WriteRegister(SPI_CLOCKF, 0x98, 0x00);//设置vs1003的时钟,3倍频
	Mp3WriteRegister (SPI_AUDATA, 0xBB, 0x81); //采样率48k,立体声
	Mp3WriteRegister(SPI_BASS, TrebleEnhanceValue, BassEnhanceValue);//设置重音
	Mp3SetVolume(LVolume,RVolume);//设置音量
    OSTimeDly(OS_TICKS_PER_SEC/100); //延时10ms
    	
    //向vs1003发送4个字节无效数据,用以启动SPI发送
    Mp3SelectData();
	SPI_SendData(0);
	SPI_SendData(0);
	SPI_SendData(0);
	SPI_SendData(0);
	Mp3DeselectData();
}
/**********************************************************/
/*  函数名称 :  Mp3Reset                                  */
/*  函数功能 : vs1003硬件复位                            */
/*  参数     :  无                                        */
/*  返回值   :  无                                        */
/*--------------------------------------------------------*/
void Mp3Reset(void)
{	
	Mp3PutInReset();//xReset = 0   复位vs1003      
	OSTimeDly(OS_TICKS_PER_SEC/100);//延时10ms
	Mp3DeselectControl();   //xCS = 1
	Mp3DeselectData();     //xDCS = 1
	Mp3ReleaseFromReset(); //xRESET = 1
	OSTimeDly(OS_TICKS_PER_SEC/100);//延时10ms
	while (IOPIN0 & MP3_DREQ == 0);//等待DREQ为高
    OSTimeDly(OS_TICKS_PER_SEC/10);//延时100ms 
    Mp3SoftReset();//vs1003软复位
}

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

/*************************************************************/
/*  函数名称 :  Mp3ReadRegister                              */
/*  函数功能 : 写vs1003寄存器                               */
/*  参数     :  寄存器地址				     				 */
/*  返回值   :  vs1003的16位寄存器的值                       */
/*-----------------------------------------------------------*/
INT16U Mp3ReadRegister(INT8U addressbyte)
{
	INT16U resultvalue = 0;
	Mp3DeselectData();
	Mp3SelectControl();//XCS = 0
	SPI_SendData(VS_READ_COMMAND); //发送读寄存器命令
	SPI_SendData((addressbyte));//发送寄存器的地址
	resultvalue = (INT16U)(SPI_SendData(0xff) << 8);//读取高8位数据
	resultvalue |= SPI_SendData(0xff);  //读取低8位数据
	Mp3DeselectControl();              
	return resultvalue;                 //返回16位寄存器的值
}

/***********************************************************/
/*  函数名称 :  VsSineTest                                 */
/*  函数功能 : vs1003正弦测试,将该函数放在while循环中,  */
/*              如果能持续听到一高一低的声音,证明测试通过 */                            
/*  参数     :  无                                         */
/*  返回值   :  无                                         */
/*---------------------------------------------------------*/
void VsSineTest(void)
{
	Mp3PutInReset();  //xReset = 0   复位vs1003
	OSTimeDly(OS_TICKS_PER_SEC/10);   //延时100ms        
	SPI_SendData(0xff);//发送一个字节的无效数据,启动SPI传输
	Mp3DeselectControl();  
	Mp3DeselectData();     
	Mp3ReleaseFromReset(); 
	OSTimeDly(OS_TICKS_PER_SEC/10);               
 	Mp3WriteRegister(SPI_MODE,0x08,0x20);//进入vs1003的测试模式
	while (IO0PIN & MP3_DREQ == 0);     //等待DREQ为高
 	Mp3SelectData();       //xDCS = 0,选择vs1003的数据接口
 	
 	//向vs1003发送正弦测试命令:0x53 0xef 0x6e n 0x00 0x00 0x00 0x00
 	//其中n = 0x24, 设定vs1003所产生的正弦波的频率值,具体计算方法见vs1003的datasheet
    SPI_SendData(0x53);      
	SPI_SendData(0xef);      
	SPI_SendData(0x6e);      
	SPI_SendData(0x24);      
	SPI_SendData(0x00);      
	SPI_SendData(0x00);
	SPI_SendData(0x00);
	SPI_SendData(0x00);
	OSTimeDly(OS_TICKS_PER_SEC/2);
	Mp3DeselectData();//程序执行到这里后应该能从个单一频率的声音
  
    //退出正弦测试				 
	Mp3SelectData();
	SPI_SendData(0x45);
	SPI_SendData(0x78);
	SPI_SendData(0x69);
	SPI_SendData(0x74);
	SPI_SendData(0x00);
	SPI_SendData(0x00);
	SPI_SendData(0x00);
	SPI_SendData(0x00);
	OSTimeDly(OS_TICKS_PER_SEC/2);
	Mp3DeselectData();

    //再次进入正弦测试并设置n值为0x44,即将正弦波的频率设置为另外的值
    Mp3SelectData();       
	SPI_SendData(0x53);      
	SPI_SendData(0xef);      
	SPI_SendData(0x6e);      
	SPI_SendData(0x44);      
	SPI_SendData(0x00);      
	SPI_SendData(0x00);
	SPI_SendData(0x00);
	SPI_SendData(0x00);
	OSTimeDly(OS_TICKS_PER_SEC/2);
	Mp3DeselectData(); 

	//退出正弦测试
	Mp3SelectData();
	SPI_SendData(0x45);
	SPI_SendData(0x78);
	SPI_SendData(0x69);
	SPI_SendData(0x74);
	SPI_SendData(0x00);
	SPI_SendData(0x00);
	SPI_SendData(0x00);
	SPI_SendData(0x00);
	OSTimeDly(OS_TICKS_PER_SEC/2);
	Mp3DeselectData();
 }

void VS_Drive(INT8U Cammand)
{
    INT8U temp;
    INT16U i;
    
    switch(Cammand)
    {
		case MP3CMD_Play:
			if(IO0PIN & MP3_DREQ)
			{
				Mp3SelectData();
				temp = ReadFileByte();
				SPI_SendData(temp);
				Mp3DeselectData();
				ReadFlen += 1;
			}
			break;
		case MP3CMD_Stop:
			for(i=0; i < 2048;)
			{
				if(IO0PIN & MP3_DREQ)
				{
					Mp3SelectData();
					SPI_SendData(0);
					Mp3DeselectData();
					i++;
				}
			}
			MP3Handle = 0;
			Mp3SoftReset();
			break;
		case MP3CMD_InitVS1003:
    		InitPortVS1003();
			Mp3Reset();
			break;
    }
}

⌨️ 快捷键说明

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