[mw_shl_code=c,true]#include "vs10XX.h"
#include "delay.h"
#include "mmc_sd.h"
#include "spi.h"
#include "usart.h"
_vs10xx_obj vsset=
{
210,
6,
15,
10,
15,
0,
};
u8 VS_SPI_ReadWriteByte(u8 data)
{
return SPI1_ReadWriteByte(data);
}
void VS_SPI_SpeedLow(void)
{
SPI1_SetSpeed(SPI_SPEED_64);
}
void VS_SPI_SpeedHigh(void)
{
SPI1_SetSpeed(SPI_SPEED_8);
}
void VS_Init(void)
{
RCC->APB2ENR|=1<<2;
GPIOA->CRL&=0XFFF0FFFF;
GPIOA->CRL|=0X00030000;
GPIOA->CRH&=0XFFF00FF0;
GPIOA->CRH|=0X00083003;
GPIOA->ODR|=(1<<4)|(1<<8)|(1<<11)|(1<<12);
SPI1_Init();
}
void VS_Soft_Reset(void)
{
u8 retry=0;
while(VS_DQ==0);
VS_SPI_ReadWriteByte(0Xff);
retry=0;
while(VS_RD_Reg(SPI_MODE)!=0x0800)
{
VS_WR_Cmd(SPI_MODE,0x0804);
delay_ms(2);
if(retry++>100)break;
}
while(VS_DQ==0);
retry=0;
while(VS_RD_Reg(SPI_CLOCKF)!=0X9800)
{
VS_WR_Cmd(SPI_CLOCKF,0X9800);
if(retry++>100)break;
}
delay_ms(20);
}
u8 VS_HD_Reset(void)
{
u8 retry=0;
VS_RST=0;
delay_ms(20);
VS_XDCS=1;
VS_XCS=1;
VS_RST=1;
while(VS_DQ==0&&retry<200)
{
retry++;
delay_us(50);
};
delay_ms(20);
if(retry>=200)return 1;
else return 0;
}
void VS_Sine_Test(void)
{
VS_HD_Reset();
VS_WR_Cmd(0x0b,0X2020);
VS_WR_Cmd(SPI_MODE,0x0820);
while(VS_DQ==0);
VS_SPI_SpeedLow();
VS_XDCS=0;
VS_SPI_ReadWriteByte(0x53);
VS_SPI_ReadWriteByte(0xef);
VS_SPI_ReadWriteByte(0x6e);
VS_SPI_ReadWriteByte(0x24);
VS_SPI_ReadWriteByte(0x00);
VS_SPI_ReadWriteByte(0x00);
VS_SPI_ReadWriteByte(0x00);
VS_SPI_ReadWriteByte(0x00);
delay_ms(100);
VS_XDCS=1;
VS_XDCS=0;
VS_SPI_ReadWriteByte(0x45);
VS_SPI_ReadWriteByte(0x78);
VS_SPI_ReadWriteByte(0x69);
VS_SPI_ReadWriteByte(0x74);
VS_SPI_ReadWriteByte(0x00);
VS_SPI_ReadWriteByte(0x00);
VS_SPI_ReadWriteByte(0x00);
VS_SPI_ReadWriteByte(0x00);
delay_ms(100);
VS_XDCS=1;
VS_XDCS=0;
VS_SPI_ReadWriteByte(0x53);
VS_SPI_ReadWriteByte(0xef);
VS_SPI_ReadWriteByte(0x6e);
VS_SPI_ReadWriteByte(0x44);
VS_SPI_ReadWriteByte(0x00);
VS_SPI_ReadWriteByte(0x00);
VS_SPI_ReadWriteByte(0x00);
VS_SPI_ReadWriteByte(0x00);
delay_ms(100);
VS_XDCS=1;
VS_XDCS=0;//????????????
VS_SPI_ReadWriteByte(0x45);
VS_SPI_ReadWriteByte(0x78);
VS_SPI_ReadWriteByte(0x69);
VS_SPI_ReadWriteByte(0x74);
VS_SPI_ReadWriteByte(0x00);
VS_SPI_ReadWriteByte(0x00);
VS_SPI_ReadWriteByte(0x00);
VS_SPI_ReadWriteByte(0x00);
delay_ms(100);
VS_XDCS=1;
}
u16 VS_Ram_Test(void)
{
VS_HD_Reset();
VS_WR_Cmd(SPI_MODE,0x0820);
while (VS_DQ==0);
VS_SPI_SpeedLow();
VS_XDCS=0;
VS_SPI_ReadWriteByte(0x4d);
VS_SPI_ReadWriteByte(0xea);
VS_SPI_ReadWriteByte(0x6d);
VS_SPI_ReadWriteByte(0x54);
VS_SPI_ReadWriteByte(0x00);
VS_SPI_ReadWriteByte(0x00);
VS_SPI_ReadWriteByte(0x00);
VS_SPI_ReadWriteByte(0x00);
VS_XDCS=1;
delay_ms(150);
return VS_RD_Reg(SPI_HDAT0);
}
void VS_WR_Cmd(u8 address,u16 data)
{
while(VS_DQ==0);
VS_SPI_SpeedLow();
VS_XDCS=1;
VS_XCS=0;
VS_SPI_ReadWriteByte(VS_WRITE_COMMAND);
VS_SPI_ReadWriteByte(address);
VS_SPI_ReadWriteByte(data>>8);
VS_SPI_ReadWriteByte(data);
VS_XCS=1;
VS_SPI_SpeedHigh();
}
void VS_WR_Data(u8 data)
{
VS_SPI_SpeedHigh();
VS_XDCS=0;
VS_SPI_ReadWriteByte(data);
VS_XDCS=1;
}
u16 VS_RD_Reg(u8 address)
{
u16 temp=0;
while(VS_DQ==0);
VS_SPI_SpeedLow();
VS_XDCS=1;
VS_XCS=0;
VS_SPI_ReadWriteByte(VS_READ_COMMAND);
VS_SPI_ReadWriteByte(address);
temp=VS_SPI_ReadWriteByte(0xff);
temp=temp<<8;
temp+=VS_SPI_ReadWriteByte(0xff);
VS_XCS=1;
VS_SPI_SpeedHigh();
return temp;
}
u16 VS_WRAM_Read(u16 addr)
{
u16 res;
VS_WR_Cmd(SPI_WRAMADDR, addr);
res=VS_RD_Reg(SPI_WRAM);
return res;
}
void VS_Set_Speed(u8 t)
{
VS_WR_Cmd(SPI_WRAMADDR,0X1E04);
while(VS_DQ==0);
VS_WR_Cmd(SPI_WRAM,t);
}
const u16 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}
};
u16 VS_Get_HeadInfo(void)
{
unsigned int HEAD0;
unsigned int HEAD1;
HEAD0=VS_RD_Reg(SPI_HDAT0);
HEAD1=VS_RD_Reg(SPI_HDAT1);
switch(HEAD1)
{
case 0x7665:
case 0X4D54:
case 0X4154:
case 0X4144:
case 0X4D34:
case 0X4F67:
case 0X574D
case 0X664C:
HEAD1=HEAD0*2/25;
if((HEAD1%10)>5)return HEAD1/10+1;
else return HEAD1/10;
}
default:
{
HEAD1>>=3;
HEAD1=HEAD1&0x03;
if(HEAD1==3)HEAD1=1;
else HEAD1=0;
return bitrate[HEAD1][HEAD0>>12];
}
}
}
u32 VS_Get_ByteRate(void)
{
return VS_WRAM_Read(0X1E05);
}
u16 VS_Get_EndFillByte(void)
{
return VS_WRAM_Read(0X1E06);
}
u8 VS_Send_MusicData(u8* buf)
{
u8 n;
if(VS_DQ!=0)
{
VS_XDCS=0;
for(n=0;n<32;n++)
{
VS_SPI_ReadWriteByte(buf[n]);
}
VS_XDCS=1;
}else return 1;
return 0;
}
void VS_Restart_Play(void)
{
u16 temp;
u16 i;
u8 n;
u8 vsbuf[32];
for(n=0;n<32;n++)vsbuf[n]=0;
temp=VS_RD_Reg(SPI_MODE);
temp|=1<<3;
temp|=1<<2;
VS_WR_Cmd(SPI_MODE,temp);
for(i=0;i<2048;)
{
if(VS_Send_MusicData(vsbuf)==0)
{
i+=32;
temp=VS_RD_Reg(SPI_MODE);
if((temp&(1<<3))==0)break;
}
}
if(i<2048)//SM_CANCEL????
{
temp=VS_Get_EndFillByte()&0xff;
for(n=0;n<32;n++)vsbuf[n]=temp;
for(i=0;i<2052;)
{
if(VS_Send_MusicData(vsbuf)==0)i+=32;
}
}else VS_Soft_Reset();
temp=VS_RD_Reg(SPI_HDAT0);
temp+=VS_RD_Reg(SPI_HDAT1);
if(temp)
{
VS_HD_Reset();
VS_Soft_Reset();
}
}
void VS_Reset_DecodeTime(void)
{
VS_WR_Cmd(SPI_DECODE_TIME,0x0000);
VS_WR_Cmd(SPI_DECODE_TIME,0x0000);
}
u16 VS_Get_DecodeTime(void)
{
u16 dt=0;
dt=VS_RD_Reg(SPI_DECODE_TIME);
return dt;
}
void VS_Load_Patch(u16 *patch,u16 len)
{
u16 i;
u16 addr, n, val;
for(i=0;i<len;)
{
addr = patch[i++];
n = patch[i++];
if(n & 0x8000U) //RLE run, replicate n samples
{
n &= 0x7FFF;
val = patch[i++];
while(n--)VS_WR_Cmd(addr, val);
}else //copy run, copy n sample
{
while(n--)
{
val = patch[i++];
VS_WR_Cmd(addr, val);
}
}
}
}
void VS_Set_Vol(u8 volx)
{
u16 volt=0;
volt=254-volx;
volt<<=8;
volt+=254-volx;
VS_WR_Cmd(SPI_VOL,volt);
}
void VS_Set_Bass(u8 bfreq,u8 bass,u8 tfreq,u8 treble)
{
u16 bass_set=0;
signed char temp=0;
if(treble==0)temp=0;
else if(treble>8)temp=treble-8;
else temp=treble-9;
bass_set=temp&0X0F;
bass_set<<=4;
bass_set+=tfreq&0xf;
bass_set<<=4;
bass_set+=bass&0xf;
bass_set<<=4;
bass_set+=bfreq&0xf;
VS_WR_Cmd(SPI_BASS,bass_set);
}
void VS_Set_Effect(u8 eft)
{
u16 temp;
temp=VS_RD_Reg(SPI_MODE);
if(eft&0X01)temp|=1<<4;
else temp&=~(1<<5);
if(eft&0X02)temp|=1<<7;
else temp&=~(1<<7);
VS_WR_Cmd(SPI_MODE,temp);
}
void VS_Set_All(void)
{
VS_Set_Vol(vsset.mvol);
VS_Set_Bass(vsset.bflimit,vsset.bass,vsset.tflimit,vsset.treble);
VS_Set_Effect(vsset.effect);
}
按键
void KEY_Init(void)
{
RCC->APB2ENR|=1<<2;
RCC->APB2ENR|=1<<4;
JTAG_Set(SWD_ENABLE);
GPIOA->CRL&=0XFFFFFFF0;
GPIOA->CRL|=0X00000008;
GPIOA->CRH&=0X0FFFFFFF;
GPIOA->CRH|=0X80000000;
GPIOA->ODR|=1<<15;
GPIOC->CRL&=0XFF0FFFFF;
GPIOC->CRL|=0X00800000;
GPIOC->ODR|=1<<5;
}
u8 KEY_Scan(u8 mode)
{
static u8 key_up=1;
if(mode)key_up=1;
if(key_up&&(KEY0==0||KEY1==0||WK_UP==1))
{
delay_ms(10);
key_up=0;
if(KEY0==0)return KEY0_PRES;
else if(KEY1==0)return KEY1_PRES;
else if(WK_UP==1)return WKUP_PRES;
}else if(KEY0==1&&KEY1==1&&WK_UP==0)key_up=1;
return 0;
}
[/mw_shl_code]
本人刚学STM32,原子哥的mini开发板上只有4个按键,只能实现MP3音乐播放器历程的歌曲切换和暂停功能,我现在想外接两按键实现音量大小的调节,该怎么弄啊?求各位大神帮帮忙! |