野火电子论坛

 找回密码
 注册

QQ登录

只需一步,快速开始

查看: 14754|回复: 6

用wm8978使作为声音采集。咪头输入正常,线输入采集不到数据

[复制链接]
发表于 2018-8-22 21:29:24 | 显示全部楼层 |阅读模式
     如题,将开发板历程【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;
                        }                       
                }
               
        }



左面耳机,右面麦克风

左面耳机,右面麦克风

耳机和麦克风接口类型

耳机和麦克风接口类型
回复

使用道具 举报

发表于 2018-8-23 08:49:32 | 显示全部楼层
应该是麦克风接口不符合规格
回复 支持 反对

使用道具 举报

发表于 2018-8-23 08:58:29 | 显示全部楼层
要用三段式的,你这是四段的
回复 支持 反对

使用道具 举报

 楼主| 发表于 2018-8-23 09:59:33 | 显示全部楼层
换成这样的是不是可以了

手机电脑转换接口

手机电脑转换接口
回复 支持 反对

使用道具 举报

发表于 2018-8-23 14:26:32 | 显示全部楼层
直接用电脑那种耳麦就好
回复 支持 反对

使用道具 举报

 楼主| 发表于 2018-8-28 16:52:18 | 显示全部楼层
买回来一个转接头,接上还是不能用。用万用表测了一下,接口应该是没有问题了,感觉可能是程序出了问题。有没有大佬能发一下自己调试过的程序,然后确定下程序没有问题。我用的是429开发板-挑战者开发板。多谢多谢
回复 支持 反对

使用道具 举报

 楼主| 发表于 2018-8-28 16:54:25 | 显示全部楼层
随风 发表于 2018-8-23 14:26
直接用电脑那种耳麦就好

大佬,能发下你调过的程序,我确定下程序没有问题吗。买回来一个转换头。用万用表测了耳麦接口和line in接口与单片机上的那个接口是匹配的。但是还是不能用。
多谢多谢
回复 支持 反对

使用道具 举报

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

本版积分规则

联系站长|手机版|野火电子官网|野火淘宝店铺|野火电子论坛 ( 粤ICP备14069197号 ) 大学生ARM嵌入式2群

GMT+8, 2024-11-24 08:21 , Processed in 0.047443 second(s), 26 queries , Gzip On.

Powered by Discuz! X3.4

Copyright © 2001-2021, Tencent Cloud.

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