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

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管理
行使您的权利
官方最新发布
STM32N6 AI生态系统
STM32MCU,MPU高性能GUI
ST ACEPACK电源模块
意法半导体生物传感器
STM32Cube扩展软件包
关注我们
微信公众号二维码 微信公众号
手机版二维码 手机版