STM32
直播中

张伟

8年用户 1728经验值
私信 关注
[问答]

STM32F103ZET6用I2S2 DMA方式输出,声音有但是噪声很大为什么?

这几天在搞USB的声卡,用的是STM32F103ZET6,用的是Hal库生成的代码,I2S2 DMA方式输出,有以下问题,声音有,但是噪声很大,而且USB数据暂停后,I2S2上还是有数据在不停的发,感觉是USB库哪里有问题,接收看过了应该是没有问题的,就是这个同步传输的问题,红色部分,为什么每次都是从haudio->buffer[0]开始,而且长度还是固定,haudio->rd_ptr这个指针没什么作用嘛。。搞来搞去的,理论上应该是USB循环队列的读指针,但是没有起到作用,下面的函数是DMA传输完回调调用的,感觉只要这样调下去,数据永远都停止不了,I2S上肯定永远都有数据,而且只能取到前半个Buffer的长度,后半部分,永远都取不到。。不知道有没有兄弟对下面函数有什么想法?还是我应用错了?

void  USBD_AUDIO_Sync (USBD_HandleTypeDef *pdev, AUDIO_OffsetTypeDef offset)
{
  int8_t shift = 0;
  USBD_AUDIO_HandleTypeDef   *haudio;
  haudio = (USBD_AUDIO_HandleTypeDef*) pdev->pClassData;

  haudio->offset =  offset;


  if(haudio->rd_enable == 1)
  {
    haudio->rd_ptr += AUDIO_TOTAL_BUF_SIZE/2;

    if (haudio->rd_ptr == AUDIO_TOTAL_BUF_SIZE)
    {
      /* roll back */
      haudio->rd_ptr = 0;
    }
  }

  if(haudio->rd_ptr > haudio->wr_ptr)
  {
    if((haudio->rd_ptr - haudio->wr_ptr) < AUDIO_OUT_PACKET)
    {
      shift = -4;
    }
    else if((haudio->rd_ptr - haudio->wr_ptr) > (AUDIO_TOTAL_BUF_SIZE - AUDIO_OUT_PACKET))
    {
      shift = 4;
    }   

  }
  else
  {
    if((haudio->wr_ptr - haudio->rd_ptr) < AUDIO_OUT_PACKET)
    {
      shift = 4;
    }
    else if((haudio->wr_ptr - haudio->rd_ptr) > (AUDIO_TOTAL_BUF_SIZE - AUDIO_OUT_PACKET))
    {
      shift = -4;
    }  
  }

  if(haudio->offset == AUDIO_OFFSET_FULL)
  {
    ((USBD_AUDIO_ItfTypeDef *)pdev->pUserData)->AudioCmd( haudio->buffer[0],
                                                         AUDIO_TOTAL_BUF_SIZE/2 - shift,
                                                         AUDIO_CMD_PLAY);
      haudio->offset = AUDIO_OFFSET_NONE;           
  }
}



回帖(1)

张虎豹

2024-5-7 17:43:21
根据您提供的信息,我将尝试分析可能导致噪声大和数据传输问题的原因,并提供一些建议。

1. 噪声大的原因:
   a. 采样率不匹配:确保您的音频采样率与STM32F103ZET6的I2S配置相匹配。
   b. 时钟配置问题:检查I2S时钟配置是否正确,包括PLL、I2S时钟源和时钟分频。
   c. DMA配置问题:确保DMA的触发方式、数据宽度、地址增量等配置正确。
   d. 硬件问题:检查音频线路和连接器是否存在问题,如接触不良或干扰。

2. USB数据暂停后I2S2仍有数据传输的原因:
   a. USB库问题:检查USB库的实现,确保在暂停数据传输时,相关寄存器和标志位被正确设置。
   b. DMA配置问题:检查DMA的触发方式,确保在USB暂停时,DMA不会继续传输数据。

3. 关于haudio->buffer[0]和haudio->rd_ptr的问题:
   a. 检查您的代码实现,确保haudio->rd_ptr在适当的时候被更新,以便DMA传输正确的数据。
   b. 如果您的代码逻辑正确,但问题仍然存在,可能是HAL库的实现问题。您可以尝试查找相关的issue或在社区寻求帮助。

4. 解决方案:
   a. 仔细检查您的代码,确保所有配置和寄存器设置都是正确的。
   b. 使用示波器或逻辑分析仪检查I2S和USB的信号,以便找到问题所在。
   c. 如果可能,尝试使用其他音频设备或开发板进行测试,以排除硬件问题。
   d. 在STM32 HAL库的官方文档和社区中查找类似问题的解决方案。

希望这些建议能帮助您解决问题。如果问题仍然存在,请提供更多详细信息,以便进一步分析。
举报

更多回帖

发帖
×
20
完善资料,
赚取积分