新手上路
- 积分
- 31
- 金钱
- 31
- 注册时间
- 2013-11-29
- 在线时间
- 0 小时
|
大家好!
本人最近有个项目要实现VS1053的ADPCM采集,然后通过MC13211的zigbee发送出去,有两种方式实现:
1、STM32F103采集VS1053,然后UART给MC13211,MC13211有个成熟的UART-zigbee的程序,可以直接透传。
2、MC13211 SPI采集VS1053,然后内部zigbee发送;
本人在第一种方法的实现思路如下:
VS1053的初始化、RAM检测、ADPCM的采集编码都是成功的,语音4.5kbps的码率,也试过类似微信方式说完后再发送出去,是可以的,但是受限于STM32F103的RAM大小,大约2s的声音能够听到是连续的;也试过保存到SD卡中,ADPCM的方式可以读取。实时发送的方式没有尝试成功;后来为了方便省掉一片MCU,直接用第2种方法。
第2种问题如下:
VS1053的手册大篇幅描述了解码的资料,编码的资料较少,自己的代码如下:
w=VS_RD_Reg(SPI_HDAT1); //查询是否有数据可以采集
if((w>=256)&&(w<896))
{
while((w>=256)&&(w<896)) //while是为了确保这次采集后下次数据是空的,防止采集完一组后数据又准备好,这时候如果发送zigbee的操作会导致数据采集不完全,可能会有连续的几个256个字节块
{
ram=0;
ptrRxBuf=&RIFFHeader1[Block_num*256]; //存储首地址
while (ram <256)
{
w = VS_RD_Reg(SPI_HDAT0); //保存256个字节的数据
*ptrRxBuf=w>>8;
ptrRxBuf++;
*ptrRxBuf=w&0XFF;
ptrRxBuf++;
ram+=2;
}
Block_num++;
// if(Block_num>=7) //测试用,看buffer是否会因为没有及时发送出去导致溢出
// while(1);
w=VS_RD_Reg(SPI_HDAT1); //采集完256个字节后看是否还有数据需要继续采集
}
if(w<=200) //防止数据接近256个字节,这时候发送会占用20ms左右的时间,此时间段内不去采集声音,可能会导致数据丢失
{
for(gggg=0;gggg<Block_num;gggg++)
{
TRANSMIT = LED_ON;
SendVoiceData(&RIFFHeader1[gggg*256],100); //发送256个字节
SendVoiceData(&RIFFHeader1[gggg*256+100],100); //因为底层驱动函数已经写好了,测试的时候就分开3次发送了
SendVoiceData(&RIFFHeader1[gggg*256+200],56);
TRANSMIT = LED_OFF;
}
Block_num=0;
}
}
问题描述:
声音断断续续无非是数据没有采集完整,需要采集时MCU在进行其他操作,错过了采集
1、此种查询方法是在尝试中断方式不行后改的,中断有可能会打断正在采集的操作,或者采集数据不完整,丢失部分数据;
2、经测试,上边的代码是数据流不断的发送的,但是接收端还是断断续续的声音。
请大家指教!如何数据完整,声音连续?写的有点乱,见谅!
|
|