stm32 usb audio 播放速度加快和噪音
大家好。请问有没有用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_InitTypeDefGPIO_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);
}
采集频率低,而播放快,还有通道内非音频信号被播出。可能配置的采样流程参数等有问题。建议根据例程分析修改对应参数,搞熟了应该就能分析问题在哪里了。
页:
[1]