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

📄 vs1003.c

📁 uCOS-II 2.83 带监控任务OS-VIEW
💻 C
字号:
//文件名:vs1003.c
//功能:vs1003 的底层驱动程序,主控芯片为LPC21xx;
//     其他的微处理器(带SPI接口的)只需稍加修改即可适用;
//     对于不带硬SPI接口的微处理器可以用IO进行SPI的时序模拟
 
#include "vs1003.h"
#include "..\SPI\spi.h"

/**********************************************************/
/*  函数名称 :   MSCI_Init                                */
/*  函数功能 : 初始化SPI接口,设置为主机。               */
/*  参数     :  无                                        */
/*  返回值   :  无                                        */
/*--------------------------------------------------------*/
void  MSCI_Init(void)
{  
	PINSEL0 = (PINSEL0 & (~(0xFF << 8))) | (0x15 << 8);	//选择 SPI 
    S0SPCCR = 0x10;		                // SPI 时钟设置
 	S0SPCR  = 	(0 << 3) |				// CPHA = 0, 
 		  		(0 << 4) |				// CPOL = 0, 
 		  		(1 << 5) |				// MSTR = 1, 
 		  		(0 << 6) |				// LSBF = 0, 
 	      		(0 << 7);				// SPIE = 1, 

}

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


/**********************************************************/
/*  函数名称 :  SPIPutChar                                */
/*  函数功能 : 通过SPI发送一个字节的数据                 */
/*  参数     :  待发送的字节数据                          */
/*  返回值   :  无                                        */
/*--------------------------------------------------------*/
void  SPIPutChar(uint8 c)
{     
	SPI_SEND_BYTE = c;
	SPIWait();	 //等待SPI将数据发送完毕
}


/**********************************************************/
/*  函数名称 :  Mp3SoftReset                              */
/*  函数功能 : vs1003软件复位                            */
/*  参数     :  无                                        */
/*  返回值   :  无                                        */
/*--------------------------------------------------------*/
void Mp3SoftReset(void)
{
	uint8 temp;
	Mp3WriteRegister (SCI_MODE, 0x08, 0x04); 	//软件复位
	OSTimeDly(OS_TICKS_PER_SEC / 100); 			//延时1ms
	DREQWait(); 								//等待软件复位结束
	Mp3WriteRegister(SCI_CLOCKF, 0x98, 0x00);	//设置vs1003的时钟,3倍频
	Mp3WriteRegister (SCI_AUDATA, 0xBB, 0x81); 	//采样率48k,立体声
	Mp3WriteRegister(SCI_BASS, 0x00, 0x55);		//设置重音
	Mp3SetVolume(0x00, 0x00);					//设置音量
  	OSTimeDly(OS_TICKS_PER_SEC / 100); 			//延时1ms
    	
    //向vs1003发送4个字节无效数据,用以启动SPI发送
	SPIStart();
    Mp3SelectData();
	SPIRW(&temp, 0);
	SPIRW(&temp, 0);
	SPIRW(&temp, 0);
	SPIRW(&temp, 0);
	Mp3DeselectData();
	SPIEnd();

}
/**********************************************************/
/*  函数名称 :  Mp3Reset                                  */
/*  函数功能 : vs1003硬件复位                            */
/*  参数     :  无                                        */
/*  返回值   :  无                                        */
/*--------------------------------------------------------*/
void Mp3Reset(void)
{
	uint8 temp;	
	Mp3PutInReset();//xReset = 0   复位vs1003      
	OSTimeDly(OS_TICKS_PER_SEC / 10);//延时100ms
	SPIStart();
	SPIRW(&temp, 0xFF);//发送一个字节的无效数据,启动SPI传输
	Mp3DeselectControl();   //xCS = 1
	Mp3DeselectData();     //xDCS = 1
	SPIEnd();
	Mp3ReleaseFromReset(); //xRESET = 1
	OSTimeDly(OS_TICKS_PER_SEC / 10);            //延时100ms
	DREQWait(); //等待DREQ为高
	OSTimeDly(OS_TICKS_PER_SEC / 10);            //延时100ms
	Mp3SetVolume(0xFE, 0xFE);  
	Mp3SoftReset();//vs1003软复位
}


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

    //再次进入正弦测试并设置n值为0x44,即将正弦波的频率设置为另外的值
	SPIStart();
    Mp3SelectData();       
	SPIRW(&temp, 0x53);      
	SPIRW(&temp, 0xEF);      
	SPIRW(&temp, 0x6E);      
	SPIRW(&temp, 0x44);      
	SPIRW(&temp, 0x00);      
	SPIRW(&temp, 0x00);
	SPIRW(&temp, 0x00);
	SPIRW(&temp, 0x00);
	Mp3DeselectData();
	SPIEnd();
	OSTimeDly(OS_TICKS_PER_SEC / 2);	 

	//退出正弦测试
	SPIStart();
	Mp3SelectData();
	SPIRW(&temp, 0x45);
	SPIRW(&temp, 0x78);
	SPIRW(&temp, 0x69);
	SPIRW(&temp, 0x74);
	SPIRW(&temp, 0x00);
	SPIRW(&temp, 0x00);
	SPIRW(&temp, 0x00);
	SPIRW(&temp, 0x00);
	Mp3DeselectData();
	SPIEnd();
	OSTimeDly(OS_TICKS_PER_SEC / 2);
 }

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

/*************************************************************/
/*  函数名称 :  Mp3ReadRegister                              */
/*  函数功能 : 写vs1003寄存器                               */
/*  参数     :  寄存器地址				     */
/*  返回值   :  vs1003的16位寄存器的值                       */
/*-----------------------------------------------------------*/
uint16 Mp3ReadRegister(uint8 addressbyte)
{
	uint8 temp;
	uint16 resultvalue = 0;
	SPIStart();
	Mp3DeselectData();
	Mp3SelectControl();				//XCS = 0
	SPIRW(&temp, VS_READ_COMMAND); 	//发送读寄存器命令
	SPIRW(&temp, (addressbyte));	//发送寄存器的地址
	SPIRW(&temp, 0xFF); 			//发送读时钟
	resultvalue = temp << 8;		//读取高8位数据
	SPIRW(&temp, 0xFF);		   		//发送读时钟
	resultvalue |= temp;  			//读取低8位数据
	Mp3DeselectControl(); 
	SPIEnd();             
	return (resultvalue);				//返回16位寄存器的值
}

void LoadPatch(){
	uint16 i;
	for (i=0; i < CODELEN; i++) {    
		Mp3WriteRegister(atab[i], dtab[i]>>8, dtab[i]&0xFF);
	}
	OSTimeDly(OS_TICKS_PER_SEC / 100);
}


⌨️ 快捷键说明

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