中级会员
 
- 积分
- 265
- 金钱
- 265
- 注册时间
- 2015-5-30
- 在线时间
- 85 小时
|
本帖最后由 liberate301 于 2016-9-30 17:00 编辑
最近做了一款VS1053+STM32ZET6的板子,由于项目需要要读取频谱控制彩灯变色,网上搜索了不少帖子感觉有点迷糊,摸索了半天终于成功,现在分享给大家:[mw_shl_code=c,true]///////////////////////////////////////////////////////////////////////////////
//#define SPEC_DATA_BASE 0X1810 //0X1380 for VS1011
//得到频谱数据
//*specbuf:频谱数据缓存区
//返回值:频段数.
void LoadUserCode(void)
{
int i;
for (i=0;i<CODE_SIZE;i++)
{
VS_WR_Cmd(atab, dtab);
}
}
/////////////////////////////////////////////////////////////////////////////////
u8 VS_Get_Spec(u16 *p,u16 *p2)
{
u8 bands;
u8 i;
//VS_Set_Bands();
VS_WR_Cmd(SPI_WRAMADDR,SPEC_DATA_BASE+2);
// #define SPEC_DATA_BASE 0X1810 //0X1380 for VS1011
bands=VS_RD_Reg(SPI_WRAM); //获取频段数
VS_WR_Cmd(SPI_WRAMADDR,SPEC_DATA_BASE+4);
for (i=0;i<bands;i++)
{
//读到的频谱数据分为2部分,有效位为12位.范围都是0~31
//[5:0]:当前值
//[11:6]:峰值
*p++=VS_RD_Reg(SPI_WRAM)&0x003f; //读取当前值和峰值}
return bands;
}
///////////////////////////////////////////////////////////////////////////////////
//设定新的中心频率
//buf:中心频率值
//bands:buf的大小.对VS1053最大为15
const u16 VS_NEW_BANDS_FREQ_TBL[]={50,79,126,200,317,504,800,1270,2016,3200,5080,8063,12800,20319};
void VS_Set_Bands()
{
u8 i;
VS_WR_Cmd(SPI_WRAMADDR,SPEC_DATA_BASE+0X58);//地址总是1868,对VS1053,SPEC_DATA_BASE是0X1810.所以加上0X58
for (i=0;i<14;i++)
{
VS_WR_Cmd(SPI_WRAM,VS_NEW_BANDS_FREQ_TBL);//发送频率数据
}
if(i<15)VS_WR_Cmd(SPI_WRAM,25000);//对VS1053这个最大值为15,填充25000,表示频谱表结束
VS_WR_Cmd(SPI_WRAMADDR,SPEC_DATA_BASE+1);//地址SPEC_DATA_BASE+1,为Samples Rates的起始地址
VS_WR_Cmd(SPI_WRAM,0); //开始新频率
}[/mw_shl_code]
以上是代码,直接就可以用,注意VS1053只有14个默认频率带,可以通过 VS_Set_Bands()设置中心频率,读出来的值是你所设置中心频率的声音大小(单位是DB),而不是频率高低。注意:在软件复位和硬件复位后要重新加载补丁。这里使用的是specanaappl1053b-2.c。读出来后根据频谱随意控制自己想控制的东西。
|
|