📄 vs1003.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 + -