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

📄 vs1003.c

📁 ARM7 lpc2132+vs1003+sdcard 制作的 MP3 此程序在ADS1.2环境下编译
💻 C
字号:
/****************************************Copyright (c)**************************************************
**                                 上海新时达电气有限公司
**                                     研  发  中  心
**                                        研发一部 
**
**                                 http://www.stepelevatar.com
**
**--------------文件信息--------------------------------------------------------------------------------
**文   件   名: vs1003.C
**创   建   人: 吕海安
**最后修改日期: 2007年05月31日
**描        述: MP3语音芯片的驱动程序
**              
**--------------历史版本信息----------------------------------------------------------------------------
** 创建人: 吕海安
** 版  本: v1.0
** 日 期: 2007.07.03
** 描 述: 原始版本
**
**--------------当前版本修订------------------------------------------------------------------------------
** 修改人: 
** 日 期: 
** 描 述: 
**
**------------------------------------------------------------------------------------------------------
********************************************************************************************************/
#include "config.h"
#include "VS1003.h"

/*****************************************************************************************
* 名称:delay_nnus
* 功能:延时一段时间
* 输入:unsigned int n
* 返回:无
*****************************************************************************************/
void delay_nnus(INT16U n)
{
    INT16U	b;
    for	(b = 0;	b<n; b++)	 ;
}

/*****************************************************************************************
* 名称:delay_nnus
* 功能:延时一段时间
* 输入:unsigned int n
* 返回:无
*****************************************************************************************/
void delay_nnms(INT16U n)
{
    INT16U	b;
    for	(b = 0;	b<n; b++)
    {
        delay_nnus(100);
    }
}

/*****************************************************************************************
* 名称:spi_init
* 功能:SPI initialize 设为SPI主机
* 输入:无
* 返回:无
*****************************************************************************************/
void  spi_init(void)
{  
	MP3_DDR = (MP3_DDR & 0xffffffff) | MP3_CMD_CS | MP3_DATA_REST | MP3_DATA_CS | SPI_SCK | SPI_MOIS | SD_CARD_CS;	
	MP3_DDR = (MP3_DDR & 0xffffffff) & (~MP3_DATA_REQ) & (~SPI_MISO);
	PINSEL0 = (PINSEL0 & 0xFFFF00FF) | 0x00005500;	//选择 SPI 
    //S0PCCR = 0x08;		                        // SPI 时钟设置
    S0PCCR = 0x08;
 	S0PCR  = (0 << 3) |				// CPHA = 0, 
 		  (1 << 4) |				// CPOL = 1, 
 		  (1 << 5) |				// MSTR = 1, 
 		  (0 << 6) |				// LSBF = 0, 
 	      (0 << 7);				// SPIE = 0, 
}

/*****************************************************************************************
* 名称:set_spi
* 功能:为SD卡和VS1003设置SPI,分别是上升沿和下降沿采样
* 输入:mode
* 返回:无
*****************************************************************************************/
void set_spi(INT8U mode)
{
	switch(mode)
	{
		case 0:     //for vs1003
			S0PCR  = (0 << 3) |				// CPHA = 0, 
 		  			 (0 << 4) |				// CPOL = 0, 
 		             (1 << 5) |				// MSTR = 1, 
 		             (0 << 6) |				// LSBF = 0, 
 	                 (0 << 7);				// SPIE = 0,
 	        break;
 	    case 1:		//for sd
 	        S0PCR  = (0 << 3) |				// CPHA = 0, 
 		  			 (1 << 4) |				// CPOL = 1, 
 		             (1 << 5) |				// MSTR = 1, 
 		             (0 << 6) |				// LSBF = 0, 
 	                 (0 << 7);				// SPIE = 0,
 	        break;
 	    default:
 	        break;
	}
}

/*void spi_init(void)
{
    MP3_DDR = (MP3_DDR & 0xffffffff) | MP3_CMD_CS | MP3_DATA_REST | MP3_DATA_CS | SPI_SCK | SPI_MOIS | SD_CARD_CS;	
	MP3_DDR = (MP3_DDR & 0xffffffff) & (~MP3_DATA_REQ) & (~SPI_MISO);
	// SI输入,SO,SCK,SS输出

	//PINSEL0 = (PINSEL0 & 0xFFFF00FF) | 0x00005500;	// 设置管脚连接SPI
	PINSEL0 = (PINSEL0 & (~(0xFF << 8))) | (0x55 << 8) ;
    S0PCCR = 0x08;		            // 设置SPI时钟分频 250K HZ (PCLK 速率 / SPCCR 值)
 	S0PCR  = (0 << 3) |				// CPHA = 0, 数据在SCK 的第一个时钟沿采样
 			 (1 << 4) |				// CPOL = 1, SCK 为低有效
 			 (1 << 5) |				// MSTR = 1, SPI 处于主模式
 			 (0 << 6) |				// LSBF = 0, SPI 数据传输MSB (位7)在先
 			 (0 << 7);				// SPIE = 0, SPI 中断被禁止
 			 
}*/

/*****************************************************************************************
* 名称:mp3_port_init
* 功能:MP3硬件解码芯片初始化
* 输入:无
* 返回:无
*****************************************************************************************/
void  mp3_port_init(void)
{
	spi_init();//SPI口的初始化
	MP3_DDR	|= MP3_DATA_CS | MP3_CMD_CS | MP3_DATA_REST;
    MP3_DDR	&= ~MP3_DATA_REQ;
    MP3_PORT_SET = MP3_DATA_CS | MP3_CMD_CS | MP3_DATA_REST;	
}
/*void mp3_port_init()
{
    spi_init();
    MP3_DDR	|= MP3_DATA_CS | MP3_CMD_CS | MP3_DATA_REST;
    MP3_DDR	&= ~MP3_DATA_REQ;
    MP3_PORT_SET = MP3_DATA_CS | MP3_CMD_CS | MP3_DATA_REST;
   // vs1003_HardwareReset();
}*/

/*****************************************************************************************
* 名称:Write_Byte_SPI
* 功能:向SPI写一个字节
* 输入:INT8U	byte
* 返回:无
*****************************************************************************************/
void Write_Byte_SPI(INT8U	byte)
{		

	S0PDR = byte;							// 发送数据放入SPI数据寄存器
   
	while(0 == (S0PSR & 0x80));				// 等待SPIF置位,即等待数据发送完毕
	byte = S0PDR;
}

/*****************************************************************************************
* 名称:Read_Byte_SPI
* 功能:从SPI接口读一个字节
* 输入:无
* 返回:一个字节的数据
*****************************************************************************************/
INT8U	Read_Byte_SPI(void)
{		
	S0PDR = 0xFF;
   
 	while(0 == (S0PSR & 0x80));				//等待SPIF置位,即等待收到数据
    									// wait for SPIF being set, that is, wait for being received data
	return(S0PDR); 							//读取收到的字节 read the byte received
}

/*****************************************************************************************
* 名称:vs1003_cmd_write
* 功能:向VS1003写命令
* 输入:INT8U	address,
*       INT16U data
* 返回:无
*****************************************************************************************/
void vs1003_cmd_write(INT8U	address,INT16U data)
{	
        //S0PCCR = 0x40;
        	
		while(!(MP3_PIN & MP3_DATA_REQ));

		MP3_PORT_SET = MP3_DATA_CS;	 //	MP3_DATA_CS=1;
		MP3_PORT_CLR = MP3_CMD_CS;	 //	MP3_CMD_CS=0;
		
		Write_Byte_SPI(0x02);		 //	VS1011的写命令
		Write_Byte_SPI(address);	 //	地址
		Write_Byte_SPI((INT8U)(data >> 8));
		Write_Byte_SPI((INT8U)data);
		MP3_PORT_SET = MP3_CMD_CS|MP3_DATA_CS;   // MP3_CMD_CS=1;
		
		//S0PCCR = 0x08;
}	

/*****************************************************************************************
* 名称:vs1003_data_write
* 功能:向VS1003写数据
* 输入:INT8U data
* 返回:无
*****************************************************************************************/
void vs1003_data_write(INT8U data)
{
        MP3_PORT_CLR = MP3_DATA_CS;	 //	MP3_DATA_CS=0
		Write_Byte_SPI(data);
		MP3_PORT_SET = MP3_DATA_CS;	 //	MP3_DATA_CS=1
}

/*****************************************************************************************
* 名称:vs1003_read
* 功能:从VS1003读数据
* 输入:INT8U address
* 返回:INT16U temp
*****************************************************************************************/
INT16U vs1003_read(INT8U address)
{
    INT8U   temp1=0;
    INT16U  temp=0; 
    //S0PCCR = 0x40;
    while(!(MP3_PIN & MP3_DATA_REQ));

    MP3_PORT_SET = MP3_DATA_CS;	 //	MP3_DATA_CS=1;
    MP3_PORT_CLR = MP3_CMD_CS;	 //	MP3_CMD_CS=0;
    Write_Byte_SPI(0x03);        // VS1011的读命令
    Write_Byte_SPI(address);	 //	地址
    //Write_Byte_SPI(0xff);
    //S0PCCR = 0x08;
    temp=	Read_Byte_SPI();
    temp = temp << 8;
    //Write_Byte_SPI(0xff);
    temp1	=	Read_Byte_SPI();
    temp = temp | temp1; 
    MP3_PORT_SET = MP3_CMD_CS;   //MP3_CMD_CS=1;
    return temp;
}								

/*****************************************************************************************
* 名称:ResetDecodeTime
* 功能:复位记录时间
* 输入:无
* 返回:无
*****************************************************************************************/									
void ResetDecodeTime(void)
{
    //vs1003_cmd_write(0x04,0x0000);
    //vs1003_cmd_write(0x04,0x0000);
}	

/*****************************************************************************************
* 名称:GetDecodeTime
* 功能:得到记录时间
* 输入:无
* 返回:得到的时间
*****************************************************************************************/
INT16U	GetDecodeTime(void)
{
    //return	vs1003_read(0x04);	
}


/*****************************************************************************************
* 名称:vs1003_Reset
* 功能:VS1003复位
* 输入:无
* 返回:无
*****************************************************************************************/ 
void vs1003_Reset(void)
{	
    INT8U i = 0xff;
    set_spi(0);
    MP3_PORT_SET = MP3_CMD_CS;
    MP3_PORT_CLR = MP3_DATA_CS;	 //	MP3_DATA_CS=0;
	while(1)
	{		
		if((MP3_PIN & MP3_DATA_REQ))	
		{
			vs1003_data_write(0x00);
			if(--i == 0) break;
		}
	}
	MP3_PORT_SET = MP3_DATA_CS;	 //	MP3_DATA_CS = 1;
	vs1003_cmd_write(0x00,0x0804);
	delay_nnms(1000);            // 延时100ms
	 while (!(MP3_PIN & MP3_DATA_REQ)); //等待软件复位结束
	 set_spi(1);
}


/*****************************************************************************************
* 名称:vs1003_HardwareReset
* 功能:VS1003硬件复位
* 输入:无
* 返回:无
*****************************************************************************************/ 
void vs1003_HardwareReset(void)
{	
    INT16U i = 0;
    
    S0PCCR = 0x40;  
    set_spi(0);  
    Mp3PutInReset();             // xReset = 0   复位vs1003
	delay_nnms(100);            // 延时100ms        
	Write_Byte_SPI(0xff);        // 发送一个字节的无效数据,启动SPI传输
	MP3_PORT_SET = MP3_DATA_CS;  // MP3_DATA_CS=1;
    MP3_PORT_SET = MP3_CMD_CS;   // MP3_CMD_CS=1;      
	Mp3ReleaseFromReset(); 
	i = vs1003_read(0x01);
	while (!(MP3_PIN & MP3_DATA_REQ)); //等待软件复位结束
    vs1003_cmd_write(0x00,0x0800);	// NEW MODE
    delay_nnms(2000); //延时1ms
    while (!(MP3_PIN & MP3_DATA_REQ)); //等待软件复位结束
    vs1003_cmd_write(0x02, 0x0055);    //设置低音
    while (!(MP3_PIN & MP3_DATA_REQ)); //等待软件复位结束
    vs1003_cmd_write(0x03, 0X9800);    //设置vs1003的时钟,3倍频
    delay_nnms(200);
    while (!(MP3_PIN & MP3_DATA_REQ)); //等待软件复位结束
    //vs1003_cmd_write(0x05, 0xB981);    //采样率32k,立体声
    //vs1003_cmd_write(0x05, 0xBD81);    //采样率 reserved,立体声
    //vs1003_cmd_write(0x05, 0xB599);    //采样率48k,立体声
    vs1003_cmd_write(0x05, 0xB199);    //采样率44k,立体声
    //vs1003_cmd_write(0x05, 0xB181);    //采样率44k,立体声
    delay_nnms(200);
    while (!(MP3_PIN & MP3_DATA_REQ)); //等待软件复位结束
    vs1003_cmd_write(0x0b, 0x3737);    //设置音量
    while (!(MP3_PIN & MP3_DATA_REQ)); //等待软件复位结束
    S0PCCR = 0x08;	
    set_spi(1);
}

/*****************************************************************************************
*                                   END OF FILE
*****************************************************************************************/

⌨️ 快捷键说明

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