初级会员

- 积分
- 112
- 金钱
- 112
- 注册时间
- 2021-6-15
- 在线时间
- 19 小时
|
使用F4+INMP441硅麦(I2S接口)录音,并存储到SD卡中,发现录音文件数据缺失,比如录音三分钟,但录音文件只有两分四十几秒,因为数据缺失,听起来是倍速的感觉。
SD卡时钟速度差不多最大了,24MHz(最大不超过25MHz),并且是四线传输,cubemx生成的代码。
经过测试,发现是f_write函数写入速度过慢,导致数据写入期间一些数据没有采集到。
测试方法:只读取音频数据,不写入SD卡,即注释掉f_write函数,发现读取到的数据量符合理论计算;读取数据并写入SD卡,就会出现数据缺失的情况;
但是对比正点原子例程VS1053录音实验,使用的是同样的方法,但是为什么不存在这个问题,求解!!!!!!!
我的代码:
//通过I2S读取音频数据并存储
void RS_I2SData(void)
{
uint16_t i;
uint16_t w[4];
uint16_t rxbuf[256];
New_Pathname();
HAL_GPIO_WritePin(GPIOB, LED1_Pin, GPIO_PIN_RESET);
while(!dmastopflag)
{
while(start_left()!=1);
for(i=0;i<256;i++)
{
I2S_Receive(&hi2s1,w,4); //接收4个uint16_t,即一个左右声道数据
rxbuf[i]=w[0];
// rxbuf[2*i+1]=w[0];
}
f_write(&SDFile,rxbuf,512,&numRwr);
sectorsize++;
}
Write_WaveHeader(sectorsize);
f_close(&SDFile);
printf("sectorsize = %d\r\n",sectorsize);
sectorsize=0;
printf("录音完成\r\n\r\n");
HAL_GPIO_WritePin(GPIOB, LED1_Pin, GPIO_PIN_SET);
}
正点原子VS1053录音实验:
//读取数据
if(rec_sta==0X80)//已经在录音了
{
w=VS_RD_Reg(SPI_HDAT1);
if((w>=256)&&(w<896))
{
idx=0;
while(idx<512) //一次读取512字节
{
w=VS_RD_Reg(SPI_HDAT0);
recbuf[idx++]=w&0XFF;
recbuf[idx++]=w>>8;
}
res=f_write(f_rec,recbuf,512,&bw);//写入文件
if(res)
{
printf("err:%d\r\n",res);
printf("bw:%d\r\n",bw);
break;//写入出错.
}
sectorsize++;//扇区数增加1,约为32ms
}
}
|
|