📄 vs1003.c
字号:
#include "vs1003.h"
uint32 num;
extern INT32U Clust;
extern INT32U FirstDataSector;
extern INT8U BUFFER[512];
extern INT8U Y;
extern INT32U fclust[20];
extern INT8U fcount;
extern void Lcd_MusicPrint(unsigned short x,unsigned short y,unsigned short color,unsigned char num);
extern void Lcd_image(unsigned short x,unsigned short y,unsigned char p);
extern INT32U fsize[20];
extern Lcd_Print(unsigned short x,unsigned short y,unsigned short color,char *c,unsigned char num);
uint16 VOL;
extern INT8U fext[10][3];
uint16 VOL_BUFFER[30] =
{
0x9191,0x8c8c,0x8787,0x8282,0x7d7d,0x7878,0x7373,0x6e6e,0x6969,0x6464,
0x5f5f,0x5a5a,0x5555,0x5050,0x4b4b,0x4646,0x4141,0x3c3c,0x3737,0x3232,
0x2d2d,0x2828,0x2323,0x1e1e,0x1919,0x1414,0x0f0f,0x0a0a,0x0505,0x0000
};
void VS1003_Delay_Nmicrosecond(uint32 t)
{
uint32 i;
for(i=0;i<=t;i++);
}
uint8 SPI0_SrByte(INT8U byte)
{
S0PDR = byte;
while(0 == (S0PSR & 0x80)); /* wait for SPI0F being set, that is, wait for finishing of data being send */
return(S0PDR);
}
void VS1003_WriteReg(uint8 addr,uint16 dat)
{
VS1003_XDCS_SET(); /*write reg of the vs1003*/
SPI0_CS_CLR(); /*slect the sleve machine*/
SPI0_SrByte(VS1003_WRITE_COM);
SPI0_SrByte(addr);
SPI0_SrByte((uint8)(dat>>8));
SPI0_SrByte((uint8)(dat));
SPI0_CS_SET(); /*free the sleve machine*/
}
uint16 VS1003_ReadReg(uint8 addr)
{
uint16 dat = 0x0000;
uint16 datL = 0x0000;
VS1003_XDCS_SET();
SPI0_CS_CLR();
SPI0_SrByte(VS1003_READ_COM);
SPI0_SrByte(addr);
dat = SPI0_SrByte(0xff);
dat = dat<<8;
datL = SPI0_SrByte(0xff);
dat =dat|datL;
SPI0_CS_SET();
return dat;
}
void VS1003_WriteDat(uint8 dat)
{
VS1003_XDCS_CLR();
SPI0_CS_CLR();
SPI0_SrByte(dat);
SPI0_CS_SET();
}
void SPI0_Init(uint8 speed)
{
SPI0_CS_GPIO();
SPI0_CS_OUT();
VS1003_XDCS_GPIO();
VS1003_XDCS_OUT();
VS1003_XRESET_GPIO();
VS1003_XRESET_OUT();
VS1003_DREQ_GPIO();
VS1003_DREQ_IN();
PINSEL0 &= ~((0x03 << 8) + (0x03 << 10) + (0x03 << 12));
PINSEL0 |= (0x01 << 8) + (0x01 << 10) + (0x01 << 12);
S0PCCR = speed; /* 设置SPI0时钟分频值为8 Set the value of dividing frequency to 8 */
S0PCR = (0 << 3) | // CPHA = 0, 数据 在SCK 的第一个时钟沿采样
(0 << 4) | // CPOL = 0, SCK 为低有效
(1 << 5) | // MSTR = 1, SPI 处于主模式
(0 << 6) | // LSBF = 0, SPI 数据传输MSB (位7)在先
(0 << 7); // SPIE = 0, SPI 中断被禁止
}
void VS1003_HwRst(void)
{
VS1003_XRESET_CLR();
VS1003_XRESET_SET();
}
void VS1003_SfRst(void)
{
while(VS1003_DREQ_STATE() != VS1003_DREQ);
VS1003_WriteReg(0x00,0x0804); //写复位
while(VS1003_DREQ_STATE() != VS1003_DREQ); //等待软件复位结束
VS1003_WriteReg(0x03,0x9800);
while(VS1003_DREQ_STATE() != VS1003_DREQ);
VS1003_WriteReg(0x05,0xB199);
while(VS1003_DREQ_STATE() != VS1003_DREQ);
VS1003_WriteReg(0x02,0x0055);
while(VS1003_DREQ_STATE() != VS1003_DREQ);
VS1003_WriteReg(VS1003_SPI_VOL ,VOL_BUFFER[VOL]);
while(VS1003_DREQ_STATE() != VS1003_DREQ);
VS1003_WriteDat(0); //向vs1003发送四个字节
VS1003_WriteDat(0); //无效数据,启动spi
VS1003_WriteDat(0);
VS1003_WriteDat(0);
}
uint8 VS1003_Init(void)
{
VOL=27;
SPI0_Init(8);
SPI0_CS_SET();
VS1003_XDCS_SET();
VS1003_XRESET_CLR();
VS1003_Delay_Nmicrosecond(99999);
VS1003_XRESET_SET(); //使能芯片
VS1003_Delay_Nmicrosecond(99999);
while(VS1003_DREQ_STATE() != VS1003_DREQ);
VS1003_WriteReg(0x00,0x0804);
while(VS1003_DREQ_STATE() != VS1003_DREQ);
VS1003_WriteReg(0x03,0x9800);
while(VS1003_DREQ_STATE() != VS1003_DREQ);
VS1003_WriteReg(0x05,0xB199);
while(VS1003_DREQ_STATE() != VS1003_DREQ);
VS1003_WriteReg(0x02,0x0055);
while(VS1003_DREQ_STATE() != VS1003_DREQ);
VS1003_WriteReg(VS1003_SPI_VOL ,VOL_BUFFER[VOL]);
while(VS1003_DREQ_STATE() != VS1003_DREQ);
return 1;
}
void VS1003_SendNull(void)
{
uint32 i=0;
do
{
if(VS1003_DREQ_STATE()== VS1003_DREQ)
{
VS1003_WriteDat(0x00);
i++;
}
}while(i<1024);
}
void VS1003_Play(void)
{
uint8 n;
uint8 i;
uint8 t=0;
uint8 min=0,sec=0,str[5];
uint16 data_pointer=0;
uint32 size=fsize[t];
num=fclust[t];
Lcd_MusicPrint( 30,Y+t*20,0x2ff2,t);
Lcd_image(6, Y+t*20,1);
while(1)
{
for(i=0;i<8;i++)
{
SD_ReadBlock(FirstDataSector+(num-2)*8+i,BUFFER);
do
{
if(VS1003_DREQ_STATE()== VS1003_DREQ)
{
for(n=0;n<32;n++)
{
VS1003_WriteDat(BUFFER[data_pointer]);
data_pointer++;
}
if( T0IR&0x01)
{
T0IR = 0x01;
sec++;
if(sec==60)
{
sec=0;
min++;
}
str[0]=48+(min/10);
str[1]=48+(min%10);
str[2]=58;
str[3]=48+(sec/10);
str[4]=48+(sec%10);
Lcd_Print(190,Y+t*20,0x2ff2,&(char)str[0],5);
}
size =size-32;
if(size<=100)
{
data_pointer = 511;
i=10;
}
}
}
while(data_pointer<511);
data_pointer=0;
}
num = fatNextCluster(num);
if(i==10) num=CLUST_EOFE;
if(num==CLUST_EOFE)
{
Lcd_MusicPrint(30,Y+t*20,0xffff,t);
Lcd_image(6, Y+t*20,2);
Lcd_Print(190,Y+t*20,0,&(char)str[0],5);
t++;
if(t>=fcount) t=0;
num=fclust[t];
size=fsize[t];
Lcd_MusicPrint(30,Y+t*20,0x2ff2,t);
Lcd_image(6, Y+t*20,1);
min=0;
sec=0;
if((fext[t][0]== 'W')||(fext[t][0]== 'w')) VS1003_SfRst();
}
}
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -