OpenEdv-开源电子网

 找回密码
 立即注册
正点原子全套STM32/Linux/FPGA开发资料,上千讲STM32视频教程免费下载...
查看: 2509|回复: 0

求助mini板MP3问题

[复制链接]

1

主题

1

帖子

0

精华

新手入门

积分
25
金钱
25
注册时间
2015-5-29
在线时间
0 小时
发表于 2015-5-29 18:45:21 | 显示全部楼层 |阅读模式
5金钱
[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音乐播放器历程的歌曲切换和暂停功能,我现在想外接两按键实现音量大小的调节,该怎么弄啊?求各位大神帮帮忙!

正点原子逻辑分析仪DL16劲爆上市
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则



关闭

原子哥极力推荐上一条 /2 下一条

正点原子公众号

QQ|手机版|OpenEdv-开源电子网 ( 粤ICP备12000418号-1 )

GMT+8, 2025-7-28 23:51

Powered by OpenEdv-开源电子网

© 2001-2030 OpenEdv-开源电子网

快速回复 返回顶部 返回列表