初中生
最后登录1970-1-1
在线时间 小时
注册时间2018-3-6
|
如题,将开发板历程【I:\野火【F429开发板-挑战者】光盘资料(B盘部分)\资料盘\3-程序源码\1-固件库例程\I2S—录音与回放\Project\RVMDK(uv5)】烧录到板子里面使用咪头输入可以正确采集到声音数据。当使用用L2、R2输入信号时采集不到信号。程序中已经将Recorder.c中的Recorder.ucInput修改为1. 使用MIC作为输入时候耳机可以听到声音。能够正确采集到。当使用线输入的麦克风时耳机听不到声音。按电容按键回放的时候也听不到声音。现在不太清楚是硬件出了问题。比如麦克风接口不符合规格。还是程序有问题,比如还需要修改其他地方的值。
* @brief WAV格式音频播放主程序
* @note
* @param 无
* @retval 无
*/
void RecorderDemo(void)
{
uint8_t i;
uint8_t ucRefresh; /* 通过串口打印相关信息标志 */
DIR dir;
Recorder.ucStatus=STA_IDLE; /* 开始设置为空闲状态 */
// Recorder.ucInput=0; /* 缺省MIC输入 */
Recorder.ucInput=1; /* line输入 */
Recorder.ucFmtIdx=3; /* 缺省飞利浦I2S标准,16bit数据长度,44K采样率 */
Recorder.ucVolume=35; /* 缺省耳机音量 */
if(Recorder.ucInput==0) //MIC
{
Recorder.ucGain=50; /* 缺省MIC增益 */
rec_wav.wChannels=1; /* 缺省MIC单通道 */
}
else //LINE
{
Recorder.ucGain=7; /* 缺省线路输入增益 */
rec_wav.wChannels=2; /* 缺省线路输入双声道 */
}
rec_wav.riff=0x46464952; /* “RIFF”; RIFF 标志 */
rec_wav.size_8=0; /* 文件长度,未确定 */
rec_wav.wave=0x45564157; /* “WAVE”; WAVE 标志 */
rec_wav.fmt=0x20746d66; /* “fmt ”; fmt 标志,最后一位为空 */
rec_wav.fmtSize=16; /* sizeof(PCMWAVEFORMAT) */
rec_wav.wFormatTag=1; /* 1 表示为PCM 形式的声音数据 */
/* 每样本的数据位数,表示每个声道中各个样本的数据位数。 */
rec_wav.wBitsPerSample=16;
/* 采样频率(每秒样本数) */
rec_wav.dwSamplesPerSec=g_FmtList[Recorder.ucFmtIdx][2];
/* 每秒数据量;其值为通道数×每秒数据位数×每样本的数据位数/ 8。 */
rec_wav.dwAvgBytesPerSec=rec_wav.wChannels*rec_wav.dwSamplesPerSec*rec_wav.wBitsPerSample/8;
/* 数据块的调整数(按字节算的),其值为通道数×每样本的数据位值/8。 */
rec_wav.wBlockAlign=rec_wav.wChannels*rec_wav.wBitsPerSample/8;
rec_wav.data=0x61746164; /* “data”; 数据标记符 */
rec_wav.datasize=0; /* 语音数据大小 目前未确定*/
/* 如果路径不存在,创建文件夹 */
result = f_opendir(&dir,RECORDERDIR);
while(result != FR_OK)
{
f_mkdir(RECORDERDIR);
result = f_opendir(&dir,RECORDERDIR);
}
/* 初始化并配置I2S */
I2S_Stop();
I2S_GPIO_Config();
I2Sx_Mode_Config(g_FmtList[Recorder.ucFmtIdx][0],g_FmtList[Recorder.ucFmtIdx][1],g_FmtList[Recorder.ucFmtIdx][2]);
I2Sxext_Mode_Config(g_FmtList[Recorder.ucFmtIdx][0],g_FmtList[Recorder.ucFmtIdx][1],g_FmtList[Recorder.ucFmtIdx][2]);
I2S_DMA_TX_Callback=MusicPlayer_I2S_DMA_TX_Callback;
I2S_Play_Stop();
I2S_DMA_RX_Callback=Recorder_I2S_DMA_RX_Callback;
I2Sxext_Recorde_Stop();
ucRefresh = 1;
bufflag=0;
Isread=0;
/* 进入主程序循环体 */
while (1)
{
/* 如果使能串口打印标志则打印相关信息 */
if (ucRefresh == 1)
{
DispStatus(); /* 显示当前状态,频率,音量等 */
ucRefresh = 0;
}
if(Recorder.ucStatus == STA_IDLE)
{
/* KEY2开始录音 */
if(Key_Scan(KEY2_GPIO_PORT,KEY2_PIN)==KEY_ON)
{
/* 寻找合适文件名 */
for(i=1;i<0xff;++i)
{
sprintf(recfilename,"0:/recorder/rec%03d.wav",i);
result=f_open(&file,(const TCHAR *)recfilename,FA_READ);
if(result==FR_NO_FILE)break;
}
f_close(&file);
if(i==0xff)
{
Recorder.ucStatus =STA_ERR;
continue;
}
/* 开始录音 */
StartRecord(recfilename);
ucRefresh = 1;
}
/* TouchPAD开始回放录音 */
if(TPAD_Scan(0))
{
/* 开始回放 */
StartPlay(recfilename);
ucRefresh = 1;
}
}
else
{
/* KEY1停止录音或回放 */
if(Key_Scan(KEY1_GPIO_PORT,KEY1_PIN)==KEY_ON)
{
/* 对于录音,需要把WAV文件内容填充完整 */
if(Recorder.ucStatus == STA_RECORDING)
{
I2Sxext_Recorde_Stop();
I2S_Play_Stop();
rec_wav.size_8=wavsize+36;
rec_wav.datasize=wavsize;
result=f_lseek(&file,0);
result=f_write(&file,(const void *)&rec_wav,sizeof(rec_wav),&bw);
result=f_close(&file);
printf("录音结束\r\n");
}
ucRefresh = 1;
Recorder.ucStatus = STA_IDLE; /* 待机状态 */
I2S_Stop(); /* 停止I2S录音和放音 */
wm8978_Reset(); /* 复位WM8978到复位状态 */
}
}
/* DMA传输完成 */
if(Isread==1)
{
Isread=0;
switch (Recorder.ucStatus)
{
case STA_RECORDING: // 录音功能,写入数据到文件
if(bufflag==0)
result=f_write(&file,buffer0,RECBUFFER_SIZE*2,(UINT*)&bw);//写入文件
else
result=f_write(&file,buffer1,RECBUFFER_SIZE*2,(UINT*)&bw);//写入文件
wavsize+=RECBUFFER_SIZE*2;
break;
case STA_PLAYING: // 回放功能,读取数据到播放缓冲区
if(bufflag==0)
result = f_read(&file,buffer0,RECBUFFER_SIZE*2,&bw);
else
result = f_read(&file,buffer1,RECBUFFER_SIZE*2,&bw);
/* 播放完成或读取出错停止工作 */
if((result!=FR_OK)||(file.fptr==file.fsize))
{
printf("播放完或者读取出错退出...\r\n");
I2S_Play_Stop();
file.fptr=0;
f_close(&file);
Recorder.ucStatus = STA_IDLE; /* 待机状态 */
I2S_Stop(); /* 停止I2S录音和放音 */
wm8978_Reset(); /* 复位WM8978到复位状态 */
}
break;
}
}
}
|
-
左面耳机,右面麦克风
-
耳机和麦克风接口类型
|