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

📄 vs1003.h

📁 用Mega32+VS1003做的MP3(FAT32文件系统浏览)——源代码
💻 H
字号:
//check ok
#ifndef _VS1003_INCLUDED_
#define _VS1003_INCLUDED_   
#include <mega32.h>  
#include "myspi.h"  
#include "delay.h"      
//正点原子@scut 08/09/11
//很多部分参考网友的

//treb,hfreq,bass,lfreq,vol
uchar vs1003ram[5]={0,0,0,0,250};
eeprom uchar vs1003epm[5];//音量音调寄存
 
#define LED PORTA.3  //调试用指示灯
#define MP3_DDR        DDRB
#define MP3_PORT       PORTB
#define MP3_PIN        PINB   

#define MP3_CMD_CS     0x02 //portb.1
#define MP3_DATA_REST  0x01 //portb.0
#define MP3_DATA_REQ   0x08 //portb.3 
#define MP3_DATA_CS    0x04 //portb.2      

#define Mp3Reset(){MP3_PORT&=~MP3_DATA_REST;delay_ms(10);MP3_PORT=0xff;}//MP3_DATA_REST=0
//VS1003 io口初始化
void mp3_port_init()
{
	spi_init();//初始化
	MP3_DDR|=MP3_DATA_CS |MP3_CMD_CS|MP3_DATA_REST;
	MP3_DDR&=~MP3_DATA_REQ;//REQ脚作为输入
	MP3_PORT|=MP3_DATA_CS |MP3_CMD_CS|MP3_DATA_REST|MP3_DATA_REQ;//置位 上拉
}   
//向VS1003写命令
void vs1003_cmd_write(uchar address,uint data)
{  
    while(!(PINB&MP3_DATA_REQ));//等待空闲
	SPCR = 0x53;  //低速
	SPSR = 0x00;  //低速度spi  
	 
	MP3_PORT|=MP3_DATA_CS; //MP3_DATA_CS=1;
	MP3_PORT&=~MP3_CMD_CS; //MP3_CMD_CS=0; 
	
	Write_Byte_SPI(0x02);    //VS1003的写命令
	Write_Byte_SPI(address); //地址
	Write_Byte_SPI(data>>8);
	Write_Byte_SPI(data);
	MP3_PORT|=MP3_CMD_CS;    //MP3_CMD_CS=1; 
	SPCR = 0x50;  //高速
	SPSR = 0x01;  //高速spi 
} 
//向VS1003写数据
void vs1003_data_write(uchar data)
{
	MP3_PORT&=~MP3_DATA_CS; //MP3_DATA_CS=0;
	Write_Byte_SPI(data);
	MP3_PORT|=MP3_DATA_CS;  //MP3_DATA_CS=1;
	MP3_PORT|=MP3_CMD_CS;   //MP3_CMD_CS=1; 
}                          
//check ok 08/09/05
//读VS1003
//注意不要用倍速读取,会出错
uint vs1003_read(uchar address)
{ 
	uint temp=0; 
    while(!(PINB&MP3_DATA_REQ));//非等待空闲状态 
	SPCR = 0x53;  //低速
	SPSR = 0x00;  //低速度spi  
	MP3_PORT|=MP3_DATA_CS;       //MP3_DATA_CS=1;
	MP3_PORT&=~MP3_CMD_CS;       //MP3_CMD_CS=0;
	Write_Byte_SPI(0x03);        //VS1003的读命令
	Write_Byte_SPI(address);     //地址
	temp=Read_Byte_SPI();
	temp=temp<<8;
	temp+=Read_Byte_SPI(); 
	MP3_PORT|=MP3_CMD_CS;      //MP3_CMD_CS=1; 
	SPCR = 0x50;  //高速
	SPSR = 0x01;  //高速spi 
    return temp; 
}                           
void ResetDecodeTime(void)
{
	vs1003_cmd_write(0x04,0x0000);
	vs1003_cmd_write(0x04,0x0000);
}
//FOR WAV HEAD0 :0X7761 HEAD1:0X7665    
//FOR MIDI HEAD0 :other info HEAD1:0X4D54
//FOR WMA HEAD0 :data speed HEAD1:0X574D
//FOR MP3 HEAD0 :data speed HEAD1:ID
unsigned int HEAD0;
unsigned int HEAD1;
//比特率预定值
flash uint bitrate[2][16]=
{ 
{0,8,16,24,32,40,48,56,64,80,96,112,128,144,160,0}, 
{0,32,40,48,56,64,80,96,112,128,160,192,224,256,320,0}
};
//返回Kbps的大小
//得到mp3&wma的波特率
uint GetHeadInfo(void)
{            
    HEAD0=vs1003_read(0x08); 
    HEAD1=vs1003_read(0x09);
    switch(HEAD1)
    {        
        case 0x7665:return 0;//WAV格式
        case 0X4D54:return 1;//MIDI格式 
        case 0X574D://WMA格式
        {
            HEAD1=HEAD0*2/25;
            if((HEAD1%10)>5)return HEAD1/10+1;
            else return HEAD1/10;
        }
        default://MP3格式
        {
            HEAD1>>=3;
            HEAD1=HEAD1&0x03; 
            if(HEAD1==3)HEAD1=1;
            else HEAD1=0;
            return bitrate[HEAD1][HEAD0>>12];
        }
    } 
}  
//得到mp3的播放时间n sec
uint GetDecodeTime(void)
{ 
    return vs1003_read(0x04);   
}   
//设定vs1003播放的音量和高低音 
void set1003(void)
{
    uchar t;
    uint bass=0; //暂存音调寄存器值
    uint volt=0; //暂存音量值
    uchar vset=0;//暂存音量值 
    vset=255-vs1003ram[4];//取反一下,得到最大值,表示最大的表示 
    volt=vset;
    volt<<=8;
    volt+=vset;//得到音量设置后大小
     //0,henh.1,hfreq.2,lenh.3,lfreq        
    for(t=0;t<4;t++)
    {
        bass<<=4;
        bass+=vs1003ram[t]; 
    }     
	vs1003_cmd_write(0x02,bass);//BASS   
    vs1003_cmd_write(0x0b,volt);//设音量 
}      

//VS1003初始化设置
void vs1003_init(void)
{
    uchar t;
    if(vs1003epm[0]>15)for(t=0;t<5;t++)vs1003epm[t]=vs1003ram[t]; //未初始化则初始化
    for(t=0;t<5;t++)vs1003ram[t]=vs1003epm[t];//初始化赋值   
     
	vs1003_cmd_write(0x00,0x0800);     //NEW MODE   
	set1003();//设置音效和音量
	vs1003_cmd_write(0x03,0x6000);     //CLOCK F 
}     
//VS1003复位 
void vs1003_Reset()
{    
    while(1)
    {   
        if(PINB&MP3_DATA_REQ) //等待空闲
        {
            vs1003_data_write(0x00);
            break; 
		} 
	}   
	ResetDecodeTime();
    vs1003_cmd_write(0x00,0x0804);
    delay_us(1500);  //delay 1.5ms
} 
#endif

⌨️ 快捷键说明

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