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

📄 vs1003.c

📁 汽车仪表板开发
💻 C
字号:
#include "vs1003.h"



uint32 num; 
extern INT32U  Clust;
extern INT32U  FirstDataSector;
extern  INT8U  BUFFER[512];
extern  INT8U  Y;

extern INT32U fclust[20];
extern INT8U  fcount;
extern void Lcd_MusicPrint(unsigned short x,unsigned short y,unsigned short color,unsigned char num);
extern void Lcd_image(unsigned short x,unsigned short y,unsigned char p);
extern INT32U fsize[20];
extern Lcd_Print(unsigned short x,unsigned short y,unsigned short color,char *c,unsigned char num);
uint16  VOL; 
extern INT8U  fext[10][3];
 
uint16 VOL_BUFFER[30] =
{ 
	0x9191,0x8c8c,0x8787,0x8282,0x7d7d,0x7878,0x7373,0x6e6e,0x6969,0x6464,
	0x5f5f,0x5a5a,0x5555,0x5050,0x4b4b,0x4646,0x4141,0x3c3c,0x3737,0x3232,
	0x2d2d,0x2828,0x2323,0x1e1e,0x1919,0x1414,0x0f0f,0x0a0a,0x0505,0x0000
};



void VS1003_Delay_Nmicrosecond(uint32 t)
{
	uint32 i;
	for(i=0;i<=t;i++);
}


uint8 SPI0_SrByte(INT8U byte)
{
	
	S0PDR = byte;

	while(0 == (S0PSR & 0x80));						    /* wait for SPI0F being set, that is, wait for finishing of data being send */
	

	return(S0PDR);
}


void VS1003_WriteReg(uint8 addr,uint16 dat)
{
	VS1003_XDCS_SET();								/*write reg of the vs1003*/
	SPI0_CS_CLR();									/*slect the sleve machine*/
	
	SPI0_SrByte(VS1003_WRITE_COM);								
	
	SPI0_SrByte(addr);
	
	SPI0_SrByte((uint8)(dat>>8));
	SPI0_SrByte((uint8)(dat));
	
	SPI0_CS_SET();									/*free the sleve machine*/
}


uint16 VS1003_ReadReg(uint8 addr)
{
	uint16 dat = 0x0000;
	uint16 datL = 0x0000;
		
	VS1003_XDCS_SET();
	SPI0_CS_CLR();								

	SPI0_SrByte(VS1003_READ_COM);
	SPI0_SrByte(addr);

	dat	= SPI0_SrByte(0xff);
	dat	= dat<<8;
	datL = SPI0_SrByte(0xff);
	dat	=dat|datL;
	
	SPI0_CS_SET();
	
	return dat;
}


void VS1003_WriteDat(uint8 dat)
{
	VS1003_XDCS_CLR();
	
	SPI0_CS_CLR();

	SPI0_SrByte(dat);
	SPI0_CS_SET();
}


void SPI0_Init(uint8 speed)
{ 

	SPI0_CS_GPIO();
	SPI0_CS_OUT();

	VS1003_XDCS_GPIO();
	VS1003_XDCS_OUT();

	VS1003_XRESET_GPIO();
	VS1003_XRESET_OUT();

	VS1003_DREQ_GPIO();
	VS1003_DREQ_IN();
						
	
	PINSEL0 &= ~((0x03 << 8) + (0x03 << 10) + (0x03 << 12));
	PINSEL0 |=  (0x01 << 8) + (0x01 << 10) + (0x01 << 12);

	S0PCCR = speed;										/* 设置SPI0时钟分频值为8  Set the value of dividing frequency to 8 */
	
	S0PCR  = (0 << 3) |									// CPHA = 0, 数据 在SCK 的第一个时钟沿采样
 	(0 << 4) |											// CPOL = 0, SCK 为低有效
 	(1 << 5) |											// MSTR = 1, SPI 处于主模式
 	(0 << 6) |											// LSBF = 0, SPI 数据传输MSB (位7)在先
 	(0 << 7);											// SPIE = 0, SPI 中断被禁止
}

void VS1003_HwRst(void)
{
	VS1003_XRESET_CLR();  						
										
	VS1003_XRESET_SET();  								

}


void VS1003_SfRst(void)
{
    while(VS1003_DREQ_STATE() != VS1003_DREQ);	
    
	VS1003_WriteReg(0x00,0x0804);								//写复位

	while(VS1003_DREQ_STATE() != VS1003_DREQ);					//等待软件复位结束

	VS1003_WriteReg(0x03,0x9800);
	
	while(VS1003_DREQ_STATE() != VS1003_DREQ);	

	VS1003_WriteReg(0x05,0xB199);
	
	while(VS1003_DREQ_STATE() != VS1003_DREQ);	

	VS1003_WriteReg(0x02,0x0055);
	
	while(VS1003_DREQ_STATE() != VS1003_DREQ);	

	VS1003_WriteReg(VS1003_SPI_VOL ,VOL_BUFFER[VOL]);
	
	while(VS1003_DREQ_STATE() != VS1003_DREQ);	
	
	VS1003_WriteDat(0);											//向vs1003发送四个字节
	VS1003_WriteDat(0);											//无效数据,启动spi
	VS1003_WriteDat(0);
	VS1003_WriteDat(0);
}

uint8 VS1003_Init(void)
{
	VOL=27;	

	SPI0_Init(8);
	
	SPI0_CS_SET();

	VS1003_XDCS_SET();
	VS1003_XRESET_CLR();
	VS1003_Delay_Nmicrosecond(99999);
	VS1003_XRESET_SET();											  //使能芯片
    VS1003_Delay_Nmicrosecond(99999);

	while(VS1003_DREQ_STATE() != VS1003_DREQ);	

	VS1003_WriteReg(0x00,0x0804);
	
	while(VS1003_DREQ_STATE() != VS1003_DREQ);	

	VS1003_WriteReg(0x03,0x9800);
	
	while(VS1003_DREQ_STATE() != VS1003_DREQ);	

	VS1003_WriteReg(0x05,0xB199);
	
	while(VS1003_DREQ_STATE() != VS1003_DREQ);	

	VS1003_WriteReg(0x02,0x0055);
	
	while(VS1003_DREQ_STATE() != VS1003_DREQ);	

	VS1003_WriteReg(VS1003_SPI_VOL ,VOL_BUFFER[VOL]);
	
	while(VS1003_DREQ_STATE() != VS1003_DREQ);	

	return 1;

}

void VS1003_SendNull(void)
{
	uint32 i=0;
	do
	{
		if(VS1003_DREQ_STATE()== VS1003_DREQ) 
		{	
			VS1003_WriteDat(0x00);
			i++;
		}
	}while(i<1024);
}


void VS1003_Play(void)
{
	uint8 n;
	uint8 i;
	uint8 t=0;
    uint8 min=0,sec=0,str[5];
	uint16 data_pointer=0; 
	
	uint32 size=fsize[t];
		
	num=fclust[t];
	Lcd_MusicPrint( 30,Y+t*20,0x2ff2,t);
    Lcd_image(6, Y+t*20,1); 
	while(1)
	{
		for(i=0;i<8;i++)
		{	
		  SD_ReadBlock(FirstDataSector+(num-2)*8+i,BUFFER);
		
			do
			{	
				if(VS1003_DREQ_STATE()== VS1003_DREQ) 
				{	
					for(n=0;n<32;n++)
					{	
						VS1003_WriteDat(BUFFER[data_pointer]);
						data_pointer++;	
						
					}
				   
				   
				   if( T0IR&0x01)		    
                     {
                       T0IR = 0x01;
                       sec++;
                       if(sec==60) 
                         {
                           sec=0;
                           min++;
                          }
                       str[0]=48+(min/10);
                       str[1]=48+(min%10);
                       str[2]=58;
                       str[3]=48+(sec/10);
                       str[4]=48+(sec%10);
                       Lcd_Print(190,Y+t*20,0x2ff2,&(char)str[0],5);
                     }
                      
                   size =size-32;  			
				   if(size<=100)
				   {
					 data_pointer = 511;
					 i=10;
					}
				}
			}
			
			while(data_pointer<511); 
			
			data_pointer=0;
						
			
		}
		
		num = fatNextCluster(num);
        
        if(i==10) num=CLUST_EOFE;
        

		if(num==CLUST_EOFE)
		{
			
			Lcd_MusicPrint(30,Y+t*20,0xffff,t);
            Lcd_image(6, Y+t*20,2);
            Lcd_Print(190,Y+t*20,0,&(char)str[0],5);
			
			t++;
			if(t>=fcount) t=0;
			
		    num=fclust[t];
			
			size=fsize[t];
			
			Lcd_MusicPrint(30,Y+t*20,0x2ff2,t);
            Lcd_image(6, Y+t*20,1);
            min=0;
            sec=0;
          if((fext[t][0]== 'W')||(fext[t][0]== 'w')) VS1003_SfRst();
			
		}

    	

	} 
	 	
}


⌨️ 快捷键说明

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