关于I2S2和I2S3同时开启录音的问题

2019-07-20 01:55发布

我通过f4的录音例程添加了I2S3(PA15为WS,PB3为CLK,PB4为ext_sd,)

//进入PCM 录音模式                   
void recoder_enter_rec_mode(void)
{
       
  I2S2_Init(I2S_Standard_Phillips,I2S_Mode_MasterTx,I2S_CPOL_Low,I2S_DataFormat_16b);                        //飞利浦标准,主机发送,时钟低电平有效,16位帧长度
        I2S2ext_Init(I2S_Standard_Phillips,I2S_Mode_SlaveRx,I2S_CPOL_Low,I2S_DataFormat_16b);                //飞利浦标准,从机接收,时钟低电平有效,16位帧长度       
        I2S2_SampleRate_Set(16000);        //设置采样率
        I2S2_TX_DMA_Init((u8*)&i2splaybuf[0],(u8*)&i2splaybuf[1],1);                 //配置TX DMA
        DMA1_Stream4->CR&=~(1<<4);        //关闭传输完成中断(这里不用中断送数据)
        I2S2ext_RX_DMA_Init(i2srecbuf1,i2srecbuf2,I2S_RX_DMA_BUF_SIZE/2);         //配置RX DMA
       

       
       
        I2S3_Init(I2S_Standard_Phillips,I2S_Mode_MasterTx,I2S_CPOL_Low,I2S_DataFormat_16b);                        //飞利浦标准,主机发送,时钟低电平有效,16位帧长度
        I2S3ext_Init(I2S_Standard_Phillips,I2S_Mode_SlaveRx,I2S_CPOL_Low,I2S_DataFormat_16b);                //飞利浦标准,从机接收,时钟低电平有效,16位帧长度       
        I2S3_SampleRate_Set(16000);        //设置采样率
  I2S3_TX_DMA_Init((u8*)&i2splaybuf[0],(u8*)&i2splaybuf[1],1);                 //配置TX DMA
        DMA1_Stream5->CR&=~(1<<4);        //关闭传输完成中断(这里不用中断送数据)
        I2S3ext_RX_DMA_Init(i2s3recbuf1,i2s3recbuf2,I2S3_RX_DMA_BUF_SIZE/2);         //配置RX DMA
       
       
        i2s_rx_callback=rec_i2s_dma_rx_callback;//回调函数指wav_i2s_dma_callback
        i2s3_rx_callback=rec_i2s3_dma_rx_callback;
       
        I2S2_Play_Start();        //开始I2S数据发送(主机)
        I2S2_Rec_Start();         //开始I2S数据接收(从机)
        I2S3_Play_Start();        //开始I2S数据发送(主机)
        I2S3_Rec_Start();         //开始I2S数据接收(从机)
        //recoder_remindmsg_show(0);
}  


回调函数内容如下
//录音 I2S_DMA接收中断服务函数.在中断里面写入数据
void rec_i2s_dma_rx_callback(void)
{   
        u16 bw;
        u8 res;
        if(rec_sta==0X80)//录音模式
        {  
                if(DMA1_Stream3->CR&(1<<19))
                        {
                        res=f_write(f_rec,i2srecbuf1,I2S_RX_DMA_BUF_SIZE,(UINT*)&bw);//写入文件
                        if(res)
                        {
                                printf("write error:%d ",res);
                        }
                         
                }else
                {
                        res=f_write(f_rec,i2srecbuf2,I2S_RX_DMA_BUF_SIZE,(UINT*)&bw);//写入文件
                        if(res)
                        {
                                printf("write error:%d ",res);
                        }
                }
                wavsize+=I2S_RX_DMA_BUF_SIZE;
               

        }
}
void rec_i2s3_dma_rx_callback(void)
{   
        u16 bw;
        u8 res;
        if(rec_sta==0X80)//录音模式
        {
                        if(DMA1_Stream0->CR&(1<<19))
                {
                        res=f_write(f_rec,i2s3recbuf1,I2S3_RX_DMA_BUF_SIZE,(UINT*)&bw);//写入文件
                        if(res)
                        {
                                printf("write error:%d ",res);
                        }
                         
                }else
                {
                        res=f_write(f_rec,i2s3recbuf2,I2S3_RX_DMA_BUF_SIZE,(UINT*)&bw);//写入文件
                        if(res)
                        {
                                printf("write error:%d ",res);
                        }
                }
                wavsize+=I2S3_RX_DMA_BUF_SIZE;
        }
}



我现在的两个都可以录音,但是录出来的效果是那种空灵效果,请问下该怎么解决这个问题
友情提示: 此问题已得到解决,问题已经关闭,关闭后问题禁止继续编辑,回答。
该问题目前已经被作者或者管理员关闭, 无法添加新回复
15条回答
不良苏
1楼-- · 2019-07-21 17:33
正点原子 发表于 2018-1-20 02:23
最好用硬件的方式去混音,你同时路i2s2,i2s3,就得自己做混音,影响速率。

原子哥  是不是想要把两路录音合成一个音频文件,就必须得做混音是吧?
正点原子
2楼-- · 2019-07-21 23:07
不良苏 发表于 2018-1-22 10:09
原子哥  是不是想要把两路录音合成一个音频文件,就必须得做混音是吧?

是的啊
13372533333
3楼-- · 2019-07-22 00:08
 精彩回答 2  元偷偷看……

一周热门 更多>