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

📄 vs1003.c

📁 VS1003_MP3_SPI_SDHC_FAT32
💻 C
字号:
#include "VS1003.h"
//#include "MusicDataMP3.c"

extern uint8_t music[512];

/*************软件模拟SPI读、写字符****************/
void SPI_write_byte(uint8_t ch)	                     	 //SPI 写字符
{

//	while(SPI_I2S_GetFlagStatus(SPI2, SPI_I2S_IT_TXE) == RESET); //等待直到发送结束
	while((SPI2->SR &SPI_I2S_FLAG_TXE)==RESET);
//	SPI2->DR = ch;
	SPI_I2S_SendData(SPI2,ch);
//	while(SPI_I2S_GetFlagStatus(SPI2, SPI_I2S_IT_RXNE) == RESET); //等待直到接收结束
	while((SPI2->SR &SPI_I2S_FLAG_RXNE)==RESET);
//	temp = (SPI2->DR);
	SPI_I2S_ReceiveData(SPI2);
}

uint8_t SPI_read_byte()	                     	//SPI 读字符
{
	uint8_t temp;
//	while(SPI_I2S_GetITStatus(SPI2, SPI_I2S_IT_TXE) == RESET); //等待直到发送结束
	while((SPI2->SR &SPI_I2S_FLAG_TXE)==RESET);
	SPI_I2S_SendData(SPI2,0xff);
//	while(SPI_I2S_GetITStatus(SPI2, SPI_I2S_IT_RXNE) == RESET); //等待直到接收结束
	while((SPI2->SR &SPI_I2S_FLAG_RXNE)==RESET);
	temp = SPI_I2S_ReceiveData(SPI2);
	return temp;
}

void VS_write_reg(uint8_t add,uint8_t h_dat,uint8_t l_dat) 	//写寄存器
{
	//VS_DERQ_SET()		;			   //DERQ = 1
	//delay_us(1)		;
	while(VS_DERQ_STATUS() == 0);	   //if DERQ ==1 begin write
	
    VS_XDCS_SET();				  //XDCS = 1
	VS_XCS_RESET();				   //XCS = 0

	SPI_write_byte(VS_WRITE_COMMAND); //发送写寄存器命令
	SPI_write_byte(add);             //发送寄存器的地址
	SPI_write_byte(h_dat);           //发送待写数据的高8位
	SPI_write_byte(l_dat);           //发送待写数据的低8位

	VS_XCS_SET();				   //XCS = 1

	//delay_ms(1);
}

uint16_t VS_read_reg(uint8_t add)		                    //读寄存器 返回16位值
{
	uint16_t tmp	;
// 	VS_DERQ_SET()		;			   //DERQ = 1
	//delay_us(1)		;
	while(VS_DERQ_STATUS() == 0);	   //if DERQ ==1 begin write
	
    VS_XDCS_SET();				  //XDCS = 1
	VS_XCS_RESET();				   //XCS = 0

	SPI_write_byte(VS_READ_COMMAND); //发送写寄存器命令
	SPI_write_byte(add);             //发送寄存器的地址

	tmp =  SPI_read_byte();
	tmp <<= 8;
	tmp |= SPI_read_byte();

	VS_XCS_SET();				   //XCS = 1

	//delay_ms(1);

	return tmp;
}

void  VS_reset()								   //VS 硬件复位 软件复位
{
	//硬件复位
	VS_RESET_SET();										   //RESET = 1
	delay_ms(10);	
	VS_RESET_RESET();									   //RESET = 0	开始复位
	delay_ms(10);
	VS_RESET_SET();										   //RESET = 1
	VS_XCS_SET();										   //XCS = 1
	VS_XDCS_SET();										   //XDCS = 1
	while(VS_DERQ_STATUS() == 0);
	//delay_ms(10);
	//VS_write_reg(SPI_VOL,0x00,0x00);				  //设置音量  软件复位无法改变音量 根据datasheet

	//软件复位
	VS_write_reg(SPI_MODE, 0x08, 0x04);               	
	delay_ms(1);
	while(VS_DERQ_STATUS() == 0);					   //等待复位结束
	//delay_ms(10);

	
}


void VS_init()                                             //VS初始化, 先硬件复位和再软件复位,进行相关寄存器配置
{
	VS_reset();											   //VS 硬件复位,软件复位

    //初始化配置
	VS_write_reg(SPI_CLOCKF, 0x98, 0x00);             //设置vs1003的时钟,3倍频
	VS_write_reg(SPI_AUDATA, 0xBB, 0x81);             //采样率48k,立体声
	VS_write_reg(SPI_BASS, 0x00, 0x00);               //设置重音
	VS_write_reg(SPI_VOL,0x00,0x00);				  //设置音量
	delay_ms(1);


    	
    //向vs1003发送4个字节无效数据,用以启动SPI发送
	VS_XDCS_RESET();										//XDCS = 0
	VS_XCS_SET();											//XCS = 1

	SPI_write_byte(0xff);
	SPI_write_byte(0xff);
	SPI_write_byte(0xff);
	SPI_write_byte(0xff);

	VS_XDCS_SET();											//XDCS = 1
	//delay_ms(1);





}



void VS_write_data(uint8_t ch)								//写入数据
{
	VS_XCS_SET();											//XCS = 1
	VS_XDCS_RESET();										//XDCS = 0
	SPI_write_byte(ch);
	VS_XDCS_SET();											//XDCS = 1
	//delay_us(1);
}

void VS_sine_test(void)										//正弦测试
{

	VS_write_reg(SPI_MODE, 0x08, 0x20);					    //选中模式寄存器的正弦测试
	while(VS_DERQ_STATUS() == 0);

	VS_XDCS_RESET();										//XDCS = 0
	VS_XCS_SET();											//XCS = 1

   /*启动正弦测试*/
	SPI_write_byte(0x53);
	SPI_write_byte(0xef);
	SPI_write_byte(0x6e);
	SPI_write_byte(0x30);	   
	SPI_write_byte(0x00);
	SPI_write_byte(0x00);
	SPI_write_byte(0x00);
	SPI_write_byte(0x00);

	delay_ms(1000);		   //进行延时,好让听到正弦的声音

	/*退出正弦测试*/
    SPI_write_byte(0x45);
	SPI_write_byte(0x78);
	SPI_write_byte(0x69);
	SPI_write_byte(0x74);	  
	SPI_write_byte(0x00);
	SPI_write_byte(0x00);
	SPI_write_byte(0x00);
	SPI_write_byte(0x00);

	delay_ms(1000);

	VS_XDCS_SET();											   //XDCS = 1


}

void VS_mp3_play()											 //播放MP3文件
{
	uint16_t data_pointer;
	uint16_t fcount;
	uint8_t i;

	fcount = 512 ;//sizeof(music);							  //字节数
	data_pointer = 0;
	
	/*软件复位
	VS_write_reg(SPI_MODE, 0x08, 0x04);               	
	delay_ms(1);
	while(VS_DERQ_STATUS() == 0);					   //等待复位结束
	*/
	VS_XCS_SET();											//XCS = 1
	VS_XDCS_RESET();
	while(fcount > 0)								  //vs1003 have 32byte data buffer
	{
		if(VS_DERQ_STATUS())
		{
			for(i=0;i<32;i++)
			{	
										//XDCS = 0
				SPI_write_byte(music[data_pointer]);
			 	//VS_write_data(music[data_pointer]);
			    data_pointer++ ;
			}
			fcount -= 32;
		}	
	}
	VS_XDCS_SET();											//XDCS = 1				

}

void delay_ms(uint32_t time)								 //毫秒延时
{
	//time *= 320;                                          //1ms	   32MHz 
	for(; time > 0; time--)
		delay_us(100);
}

void delay_us(uint32_t time)								 //微秒延时
{
	//time *= 32;                                          //1us	   32MHz 
	for(time *= 2; time > 0; time--)
	{
	__nop();
	__nop();
	}
}







⌨️ 快捷键说明

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