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

📄 vs1003.c

📁 用atmega64+vs1003(音频解码芯片)+SD制成的板子
💻 C
字号:
#include <avr/io.h>
#include <avr/delay.h>
#define uchar unsigned char
#define uint unsigned int
#define MP3_DDR        DDRB
#define MP3_DDRE	   DDRE
#define MP3_DDRF 	   DDRF

#define MP3_PORT       PORTB
#define MP3_PORTE  	   PORTE
#define MP3_PORTF  	   PORTF
//#define MP3_PIN        PINB

#define MP3_CMD_CS     0x04  //PF2
#define MP3_DATA_CS    0x08  //PF3
#define MP3_DATA_REQ   0x02  //PE1   
#define MP3_DATA_REST  0x04  //PE2
#define MP3_SI		   0x04  //PB2
#define MP3_SCK		   0x02  //PB1

void delay_nnus(unsigned int n)
	{
	unsigned int  b;
		for (b = 0; b<n; b++)
			;
	}

//SPI initialize
void spi_init(void)
{
//	 DDRB = 0xBF;    //SI输入,SO,SCK,SS输出
	 SPCR = 0x53;  //setup SPI
	 SPSR = 0x01;  //setup SPI
}
void mp3_port_init()
{
	spi_init();
	MP3_DDR|= MP3_SI | MP3_SCK;
 	MP3_DDRE|= MP3_DATA_REST;
 	MP3_DDRF|= MP3_CMD_CS | MP3_DATA_CS;
 	MP3_DDRE&=~MP3_DATA_REQ;
 	MP3_PORTF|= MP3_DATA_CS |MP3_CMD_CS;
 	MP3_PORTE|= MP3_DATA_REST;
}
void Write_Byte_SPI(unsigned char byte)
{   
    SPDR = byte;
    while (!(SPSR & (1<<SPIF)));
}
unsigned char Read_Byte_SPI(void)
{   
    SPDR = 0xFF;
    while (!(SPSR &(1<<SPIF)));
    return SPDR;
}

void vs1003_cmd_write(uchar address,uint data)
{ 
/*==============新增
  while(!(PINE&MP3_DATA_REQ))  ;
	SPCR = 0x53;  //
	SPSR = 0x00;  //低速度spi
//============== */
	MP3_PORTF|=MP3_DATA_CS;       //MP3_DATA_CS=1;
	MP3_PORT&=~MP3_CMD_CS;       //MP3_CMD_CS=0;
	Write_Byte_SPI(0x02);      //VS1011的写命令
	Write_Byte_SPI(address);   //地址
	Write_Byte_SPI(data>>8);
	Write_Byte_SPI(data);
	MP3_PORTF|=MP3_CMD_CS;       //MP3_CMD_CS=1;
/*==============以下新增
	SPCR = 0x50;  //
	SPSR = 0x01;  //高速spi
//========================= */
} 

void vs1003_data_write(uchar data)
{
	MP3_PORTF&=~MP3_DATA_CS;         //MP3_DATA_CS=0;
	Write_Byte_SPI(data);
	MP3_PORTF|=MP3_DATA_CS;         //MP3_DATA_CS=1;
	MP3_PORTF|=MP3_CMD_CS;         //MP3_CMD_CS=1; 
}

uint vs1003_read(uchar address)
{
	uchar temp1=0;
	uint temp=0; 
  while(!(PINE&MP3_DATA_REQ))  ;

	MP3_PORTF|=MP3_DATA_CS;        //MP3_DATA_CS=1;
	MP3_PORTF&=~MP3_CMD_CS;        //MP3_CMD_CS=0;
	Write_Byte_SPI(0x03);      //VS1011的读命令
	Write_Byte_SPI(address);   //地址
	temp=Read_Byte_SPI();
	temp=temp<<8;
	temp1=Read_Byte_SPI();
	temp=temp|temp1; 
	MP3_PORTF|=MP3_CMD_CS;       //MP3_CMD_CS=1;
 return temp;

}                                 
void ResetDecodeTime(void)
{
	vs1003_cmd_write(0x04,0x0000);
	vs1003_cmd_write(0x04,0x0000);
} 
uint  GetDecodeTime(void)
{
   return  vs1003_read(0x04);	
}
void vs1003_init(void)
{
	vs1003_cmd_write(0x00,0x0800);     //NEW MODE    
//	vs1003_cmd_write(0x02,0X1fff);       //BASS  
	vs1003_cmd_write(0x03,0X6000);     //CLOCK F
  vs1003_cmd_write(0x0b,0x2020);  //设音量
	
}

 
void vs1003_Reset()
{ 
    unsigned  char i=0;
 	while(1){   
		if(PINE&MP3_DATA_REQ) {
		   vs1003_data_write(0x00);
			 if(--i==0) break;
		}
	}
	 vs1003_cmd_write(0x00,0x0804);
	_delay_ms(1.5);
}

⌨️ 快捷键说明

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