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

📄 vs1003.c

📁 Read MP3 from sd,send vs1003 decode
💻 C
📖 第 1 页 / 共 3 页
字号:

//#include "LPC2294.h"
//#include <macros.h>
#include "vs1003.h"
//#include "Target.h"
#include "sdconfig.h"
#include "config.h"
#include "LPC2210Uart.h"
#include "common.h"

//#include "sd.h"
#include "MP3Test.h"
void vs1003_cmd_write(uint8 address,uint32 data);
void VS1003_Write(uint8 Address, int Count, unsigned int *pData);
void VS1003_Stream(uint8 *Data,uint8 Qte); 
 


/*
******************************************************************************************************************
**	VS1003 TEST PROGRAMMER 
**	MODIFIED BY JOSEPH
**	2006.09.28
**
*******************************************************************************************************************
*/


/*******************************************************************************************************************
** 函数名称: void ResetVS1003SPI()					Name:	  void SD_Power()
** 功能描述: 对卡先下电,再上电					Function: turn off the card's power, and turn on
** 输   入: 无									Input:	  NULL
** 输   出: 无									Output:	  NULL
********************************************************************************************************************/
void ResetVS1003SPI(void)
{
	//	set the communication signal to low
	
	SPI_SCK_GPIO();	
	SPI_SCK_OUT();
	SPI_SCK_CLR();								/* SCK  引脚置低   set SCK to zero */
	
	SPI_MISO_GPIO();
	SPI_MISO_OUT();
	SPI_MISO_CLR();								/* MISO 引脚置低   set MISO to zero */
	
	SPI_MOSI_GPIO();		
	SPI_MOSI_OUT();
	SPI_MOSI_CLR();								/* MOSI 引脚置低   set MOSI to zero */

	//	Set the control signal to high
		
	MP3_XCS_GPIO();								
   	MP3_XCS_OUT();								
	MP3_XCS_LOW();
	MP3_XCS_HIGH();								/* CS 引脚置低	   set CS to zero */

	MP3_DATA_CS_GPIO();
	MP3_DATA_CS_OUT();
	MP3_DATA_CS_LOW();
	MP3_DATA_CS_HIGH();

	MP3_DATA_REQ_GPIO();
	MP3_DATA_REQ_IN();

	MP3_DATA_REST_GPIO();
	MP3_DATA_REST_OUT();
	MP3_DATA_REST_LOW();
	
	ms_wait(200);		

//	SPI_CS_CLR();
	MP3_DATA_REST_HIGH();
}

//	SPI initialize
// 	clock rate: 500000hz
//
void LPC2210SPI_Init(void)
{ 
 	LPC2210SPI_CLK(128);								/* 设置SPI频率小于等于400kHZ  set frequency of SPI below 400kHZ */
	//SPI_Clk400k();
	S0PCR = (0x00 << 4) + (0x01 << 5);		/* 设置SPI接口模式,MSTR = 1,CPOL = 1,CPHA = 0,LSBF=0 */
	S0PSR = 0;
}												/* configure SPI interface */


//
//	PCLK/SPCCR = Clk,PCLK = 400k X 128
//

/*
void LPC2210SPI_CLK(uint8 Spccr_data)
{
	S0PCCR = Spccr_data;    		// Spccr_data max to 8
}
*/

/*******************************************************************************************************************
** 函数名称: void MP3_DATA_REQ_Chk()				Name:	  void SD_ChkCardWP()
** 功能描述: 检测卡写保护						Function: check weather card is write protect
** 输   入: 无									Input:	  NULL
** 输   出: 1: 卡已写保护	0: 卡未写保护	    Output:	  1: insert write protect	0: not write protect
********************************************************************************************************************/
uint8 MP3_DATA_REQ_Chk(void)
{
	if (MP3_DATA_REQ_STATUS() != 0)
		return 1;								/* 卡写保护 */
	else
		return 0;								/* 卡未写保护 */
}

void MP3_XCS_Select(void)
{
	SD_CS_HIGH();

	MP3_DATA_CS_HIGH();

	MP3_XCS_LOW();
}

void MP3_XCS_Deselect(void)
{
	SD_CS_HIGH();
	MP3_DATA_CS_HIGH();

	MP3_XCS_HIGH();
}

void MP3_XDCS_Select(void)
{
	SD_CS_HIGH();
	MP3_XCS_HIGH();
	
	MP3_DATA_CS_LOW();
}
void MP3_XDCS_Deselect(void)
{
	SD_CS_HIGH();
	MP3_XCS_HIGH();
	
	MP3_DATA_CS_HIGH();
}
//
//	Set the port connecting to CS,DCS,REST as output signal,and set to 1
//	Set the port connecting to REQ as input signal
//

void MP3_Port_Init(void)
{
	ResetVS1003SPI();

	SPI_INIT();	
	LPC2210SPI_Init();
}

/*********************************************************************************************************
** Function name:		VS1003_Init
**
** Descriptions:		initial the mainly register of vs1003 
**
** input parameters:		none
** Returned value:		none
**         
** Used global variables:	none
** Calling modules:		None
**
** Created by:			JOSEPH
** Created Date:		2006/10/19
**-------------------------------------------------------------------------------------------------------
** Modified by:
** Modified date:
**------------------------------------------------------------------------------------------------------
********************************************************************************************************/

void VS1003_Init(void)
{
	uint8 bufc[4];
	ms_wait(0);

	vs1003_cmd_write(SPI_MODE,0x0824);     //SDI NEW MODE
	ms_wait(500);
	while(!MP3_DATA_REQ_Chk());
	
	vs1003_cmd_write(SPI_MODE,0x0824);
	ms_wait(500);
	while(!MP3_DATA_REQ_Chk());

	vs1003_cmd_write(SPI_BASS,0x0055);       //BASS
	ms_wait(2);
	while(!MP3_DATA_REQ_Chk());
	
	vs1003_cmd_write(SPI_CLOCKF,0X9c03);     //CLOCK : XTALI×3.0
																		  //100  11  100  0000  0011
	ms_wait(2);
	while(!MP3_DATA_REQ_Chk());
	
	vs1003_cmd_write(SPI_VOL,0X2020);    //VOLUME
	ms_wait(2);
	while(!MP3_DATA_REQ_Chk());
	
	vs1003_cmd_write(SPI_AUDATA, 0xbb81);
	ms_wait(2);
	//SendZerosToVS10xx(4);
	bufc[0] = 0x00; 
	bufc[1] = 0x00; 
	bufc[2] = 0x00; 
	bufc[3] = 0x00; 
	while(!MP3_DATA_REQ_Chk());         // wait for DREQ 
	VS1003_Stream(&bufc[0],4); 
}
/*********************************************************************************************************
** Function name:		VS1003Init
**
** Descriptions:		continue to write data  from address
**
** input parameters:		HardReset
** Returned value:		*pdata
**         
** Used global variables:	VS_WRITE_COMMAND
** Calling modules:		None
**
** Created by:			JOSEPH
** Created Date:		2006/10/19
**-------------------------------------------------------------------------------------------------------
** Modified by:
** Modified date:
**------------------------------------------------------------------------------------------------------
********************************************************************************************************/
void VS1003Init(uint8 HardReset) 
{ 
	unsigned int buf[2]; 
	uint8 bufc[4]; 
	if (HardReset == TRUE) 
  		{ 
			MP3_Port_Init();
  			ms_wait(5);   

  			MP3_DATA_REST_LOW();	// Reset is 0 
  			ms_wait(5); 
  			MP3_DATA_REST_HIGH();	// Reset is 1 
  			ms_wait(5); 
  		} 

	while(!MP3_DATA_REQ_STATUS());         		// wait for DREQ 
	buf[0] = 0x0804; 
	VS1003_Write(SPI_MODE,1,buf); 
	ms_wait(2); 

	while(!MP3_DATA_REQ_STATUS());         // wait for DREQ 
	buf[0] = 0xac45;       
	VS1003_Write(SPI_AUDATA,1,buf);                     // 44kHz 

	while(!MP3_DATA_REQ_STATUS());         // wait for DREQ 
	VS1003_SetVolume(0,0); 

	bufc[0] = 0x00; 
	bufc[1] = 0x00; 
	bufc[2] = 0x00; 
	bufc[3] = 0x00; 
	while(!MP3_DATA_REQ_STATUS());         // wait for DREQ 
	VS1003_Stream(&bufc[0],4); 
} 



/*******************************************************************************************************************
** 函数名称: void Write_Byte_SPI()				Name:	  void SPI_SendByte()
** 功能描述: 通过SPI接口发送一个字节			Function: send a byte by SPI interface
** 输   入: uint8 byte: 发送的字节				Input:	  uint8 byte: the byte that will be send
** 输   出: 无									Output:	  NULL
********************************************************************************************************************/
void Write_Byte_SPI(uint8 byte)
{
	uint8 temp_0;

	S0PDR = byte;							/* 发送数据放入SPI数据寄存器 */
   
	while(!(S0PSR & 0x80));;				/* 等待SPIF置位,即等待数据发送完毕 */
												/* wait for SPIF being set, that is, wait for finishing of data being send */
 	temp_0 = S0PDR;
}

void vs1003_cmd_write(uint8 address,uint32 data)
{ 
//	Mp3DeselectData();
	MP3_XCS_Select();			//	()MP3_PORT&=~MP3_CMD_CS;      

	Write_Byte_SPI(VS_WRITE_COMMAND);      	//	VS1003的写命令
	//delay_nus(20);
	Write_Byte_SPI(address);  	//	地址
	Write_Byte_SPI(data>>8);
	Write_Byte_SPI(data);
	//delay_nus(200);

	MP3_XCS_Deselect();			//	()MP3_PORT|=MP3_CMD_CS;     
} 

void vs1003_data_write(uint8 data)
{
	MP3_XDCS_Select();		//	()MP3_PORT&=~MP3_DATA_CS;   
	
	Write_Byte_SPI(data);
	
	MP3_XDCS_Deselect();	//	MP3_PORT|=MP3_DATA_CS;   
//	MP3_XCS_HIGH();
}

void Mp3WriteRegister(uint8 addressbyte, uint8 highbyte, uint8 lowbyte)
{    
  	Mp3SelectControl();                                       
  	SPIPutCharWithoutWaiting(VS_WRITE_COMMAND);               
 	SPIPutChar((addressbyte));                                
  	SPIPutChar((highbyte));                                  
  	SPIPutChar((lowbyte));                                    
  	SPIWait();                                                
  	Mp3DeselectControl();
}                                     
/*********************************************************************************************************
** Function name:		VS1003_Write
**
** Descriptions:		continue to write data  from address
**
** input parameters:		address,count,*pdata
** Returned value:		*pdata
**         
** Used global variables:	VS_WRITE_COMMAND
** Calling modules:		None
**
** Created by:			JOSEPH
** Created Date:		2006/10/19
**-------------------------------------------------------------------------------------------------------
** Modified by:
** Modified date:
**------------------------------------------------------------------------------------------------------
********************************************************************************************************/
void VS1003_Write(uint8 Address, int Count, unsigned int *pData) 
{ 
	MP3_XCS_Select();       // XCS Low 
	Write_Byte_SPI(VS_WRITE_COMMAND); 
	Write_Byte_SPI(Address); 
	while(Count--) 
      		{ 
     			Write_Byte_SPI((uint8) ((*pData) >> 8)); 
      			Write_Byte_SPI((uint8) *pData); 
      		} 
	MP3_XCS_Deselect();       // XCS High 
	ms_wait(5); 
} 

/*******************************************************************************************************************
** 函数名称: uint8 Read_Byte_SPI()				Name:	  uint8 SPI_RecByte()
** 功能描述: 从SPI接口接收一个字节				Function: receive a byte from SPI interface
** 输   入: 无									Input:	  NULL
** 输   出: 收到的字节							Output:	  the byte that be received
********************************************************************************************************************/
uint8 Read_Byte_SPI(void)
{
	S0PDR = 0xFF;
   
 	while(!(S0PSR & 0x80));				/* 等待SPIF置位,即等待收到数据 */
												/* wait for SPIF being set, that is, wait for being received data */
	return(S0PDR); 							/* 读取收到的字节 read the byte received */
}

uint8 vs1003_read(uint8 address)
{
	uint8 temp1=0;
	uint32 temp_1=0; 

//	Mp3DeselectData();
	MP3_XCS_Select();			//	MP3_PORT&=~MP3_CMD_CS;    
	
	Write_Byte_SPI(VS_READ_COMMAND);      	//	VS1003的读命令
	//delay_nus(20);
	Write_Byte_SPI(address);   //	地址
	
	temp_1=Read_Byte_SPI();
	temp_1=temp_1<<8;
	temp1=Read_Byte_SPI();
	temp_1=temp_1|temp1; 
	
	MP3_XCS_Deselect();			//	MP3_PORT|=MP3_CMD_CS;     
	
	return temp_1;

}


/*********************************************************************************************************
** Function name:		Mp3ReadRegister
**
** Descriptions:		READ DATA FROM THE REGISTER OF VS1003
**
** input parameters:		THE ADDRESS OF REGISTER FROM VS1003
** Returned value:		resultvalue
**         
** Used global variables:	VS_READ_COMMAND,SPI_RESULT_BYTE
** Calling modules:		None
**
** Created by:			JOSEPH
** Created Date:		2006/10/19
**-------------------------------------------------------------------------------------------------------
** Modified by:
** Modified date:
**------------------------------------------------------------------------------------------------------
********************************************************************************************************/
 
unsigned int Mp3ReadRegister (uint8 addressbyte)
{                       
	unsigned int resultvalue = 0;                                                 
                                                                                 
	MP3_XCS_Select();
   
	SPIPutCharWithoutWaiting(VS_READ_COMMAND);                                    
	SPIPutChar((addressbyte));     
	
	SPIPutChar(0xff);                                                             
	SPIWait();  
   	resultvalue = (SPI_RESULT_BYTE) << 8;     
	
   	SPIPutCharWithoutWaiting(0xff);                                               
   	SPIWait();                                                                    
   	resultvalue |= (SPI_RESULT_BYTE); 
	
   	MP3_XCS_Deselect(); 
	
   	return resultvalue;                                                           
 }                                  

/*********************************************************************************************************
** Function name:		VS1003_Read
**
** Descriptions:		continue to read data  from address
**
** input parameters:		address,count,*pdata
** Returned value:		*pdata

⌨️ 快捷键说明

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