
大家好。请问有没有用stm32接数字麦克风做usb audio的。 我用stm32f103RE接两个数字麦克风,经pdm转成pcm后 通过usb发送到pc。整个板子相当一声卡。问题是用pc录音,出现播放速度加快,和噪音的显现。 请大家帮我分析分析到底是哪里出问题了。谢谢 两个麦克风通过一根线 接到i2s的 sd , 麦克风的clk 由i2s的sck产生。我是把i2s配置为主接收模式,用i2s来读取数据。目的是实现输出2通道16k采样。为此,我的i2s sck输出频率为 2.048M。 麦克风的输入频率为1.024M 现在不清楚到底问题出在采样阶段 还是pdm 转pcm 还是usb audio发送阶段,请大家帮忙分析下。 部分代码如下 i2s配置如下: switch(X_NUCLEO_CCA02M1_Handler.Sampling_Freq=AudioFreq){ case AUDIOFREQ_8K: { X_NUCLEO_CCA02M1_Handler.DecimationFactor=128; X_NUCLEO_CCA02M1_Handler.PdmBufferSize=256; break; } case AUDIOFREQ_16K: { X_NUCLEO_CCA02M1_Handler.DecimationFactor=64; X_NUCLEO_CCA02M1_Handler.PdmBufferSize=256; break; } case AUDIOFREQ_32K: { X_NUCLEO_CCA02M1_Handler.DecimationFactor=64; X_NUCLEO_CCA02M1_Handler.PdmBufferSize=512; break; } case AUDIOFREQ_48K: { X_NUCLEO_CCA02M1_Handler.DecimationFactor=64; X_NUCLEO_CCA02M1_Handler.PdmBufferSize=768; break; } default: { return AUDIO_ERROR; } } /* Initialize the hAudioInI2s Instance parameter */ hAudioInI2s.Instance = AUDIO_IN_I2S_INSTANCE; if(X_NUCLEO_CCA02M1_Handler.MicChannels==1) { hAudioInI2s.Init.DataFormat = I2S_DATAFORMAT_16B; } else { hAudioInI2s.Init.DataFormat = I2S_DATAFORMAT_32B; } if(AudioFreq == AUDIOFREQ_8K) { hAudioInI2s.Init.AudioFreq = 4 * AudioFreq; }else { hAudioInI2s.Init.AudioFreq = 2 * AudioFreq; } hAudioInI2s.Init.CPOL = I2S_CPOL_LOW; hAudioInI2s.Init.MCLKOutput = I2S_MCLKOUTPUT_DISABLE; hAudioInI2s.Init.Mode = I2S_MODE_MASTER_RX; hAudioInI2s.Init.Standard = I2S_STANDARD_MSB; /* Initialize the I2S peripheral with the structure above */ if(HAL_I2S_GetState(&hAudioInI2s) == HAL_I2S_STATE_RESET) { AUDIO_IN_I2S_MspInit(); } if(HAL_I2S_Init(&hAudioInI2s) != HAL_OK) { return AUDIO_ERROR; } } static void AUDIO_IN_I2S_MspInit(void) { static DMA_HandleTypeDef hdma_i2sRx; GPIO_InitTypeDef GPIO_InitStruct; I2S_HandleTypeDef *hi2s = &hAudioInI2s; /* Enable the I2S2 peripheral clock */ AUDIO_IN_I2S_CLK_ENABLE(); __HAL_RCC_AFIO_CLK_ENABLE(); /* Enable I2S GPIO clocks */ AUDIO_IN_I2S_SCK_GPIO_CLK_ENABLE(); AUDIO_IN_I2S_MOSI_GPIO_CLK_ENABLE(); GPIO_InitStruct.Pin = GPIO_PIN_13; // AUDIO_IN_I2S_SCK_PIN GPIO_InitStruct.Mode = GPIO_MODE_AF_PP; GPIO_InitStruct.Speed = GPIO_SPEED_FREQ_HIGH; // GPIO_SPEED_FREQ_HIGH; HAL_GPIO_Init(GPIOB, &GPIO_InitStruct); GPIO_InitStruct.Pin = GPIO_PIN_15; /// AUDIO_IN_I2S_MOSI_PIN GPIO_InitStruct.Mode = GPIO_MODE_INPUT; GPIO_InitStruct.Pull = GPIO_NOPULL; HAL_GPIO_Init(GPIOB, &GPIO_InitStruct); /* Enable the DMA clock */ AUDIO_IN_I2S_DMAx_CLK_ENABLE(); hdma_i2sRx.Init.Direction = DMA_PERIPH_TO_MEMORY; /* M2M transfer mode */ hdma_i2sRx.Init.PeriphInc = DMA_PINC_DISABLE; /* Peripheral increment mode Enable */ hdma_i2sRx.Init.MemInc = DMA_MINC_ENABLE; /* Memory increment mode Enable */ hdma_i2sRx.Init.PeriphDataAlignment = AUDIO_IN_I2S_DMAx_PERIPH_DATA_SIZE; /* Peripheral data alignment : Word */ hdma_i2sRx.Init.MemDataAlignment = AUDIO_IN_I2S_DMAx_MEM_DATA_SIZE; /* memory data alignment : Word */ hdma_i2sRx.Init.Mode = DMA_CIRCULAR; /* Normal DMA mode */ hdma_i2sRx.Init.Priority = DMA_PRIORITY_HIGH; /* priority level : high */ if(hi2s->Instance == AUDIO_IN_I2S_INSTANCE) { hdma_i2sRx.Instance = DMA1_Channel4; /* Configure the DMA Stream */ HAL_DMA_Init(&hdma_i2sRx); /* Associate the DMA handle */ __HAL_LINKDMA(hi2s, hdmarx, hdma_i2sRx); } /* I2S DMA IRQ Channel configuration */ HAL_NVIC_SetPriority(DMA1_Channel4_IRQn, 6, 6); HAL_NVIC_EnableIRQ(DMA1_Channel4_IRQn); } |
采集频率低,而播放快,还有通道内非音频信号被播出。可能配置的采样流程参数等有问题。建议根据例程分析修改对应参数,搞熟了应该就能分析问题在哪里了。 |