你的浏览器版本过低,可能导致网站不能正常访问!
为了你能正常使用网站功能,请使用这些浏览器。

stm32 usb audio 播放速度加快和噪音

[复制链接]
天空123456 提问时间:2017-6-7 16:13 /
大家好。请问有没有用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);

}


收藏 评论1 发布时间:2017-6-7 16:13

举报

1个回答
ataudio 回答时间:2017-7-3 14:38:52
采集频率低,而播放快,还有通道内非音频信号被播出。可能配置的采样流程参数等有问题。建议根据例程分析修改对应参数,搞熟了应该就能分析问题在哪里了。

所属标签

相似问题

关于意法半导体
我们是谁
投资者关系
意法半导体可持续发展举措
创新与技术
招聘信息
联系我们
联系ST分支机构
寻找销售人员和分销渠道
社区
媒体中心
活动与培训
隐私策略
隐私策略
Cookies管理
行使您的权利
关注我们
st-img 微信公众号
st-img 手机版