This thread has been locked.

If you have a related question, please click the "Ask a related question" button in the top right corner. The newly created question will be automatically linked to this question.

PCM5121: PCM5121播放音频内容,结果是噪音

Part Number: PCM5121

目前我使用STM32F405RGT6作为MCU,并且有两个外部晶振(低速的是32.768KHz,高速的是8MHz)。

然后通过I2S3传输音频数据给PCM5121。另外PCM5121我配置的是I2C模式。

目标是读取SC卡的wav文件(48KHz,24bits),并通过I2S3传输给PCM5121解码,后面还接了功放和喇叭。

我简单做了测试,可以从喇叭听到声音。但听到的声音是一段噪声,并非清晰正常的音频内容。

我做了很多检查(包括设计、焊接、时钟设置、PCM5121寄存器设置)都没能找到问题。只能求助你们。如果还是不行,我只能考虑更换DAC芯片。

下面我将提供一些相关设置:

图1:PCM5121的电路设计

图2:STM32的时钟设置

图3:STM32的I2S3设置

图4:STM32的I2S3的DMA设置

注意,我尝试过使用DMA和非DMA,都是同样的结果

以下代码是我对PCM5121的设置:

void PCM5121_Init(I2C_HandleTypeDef *hi2c)
{
  uint8_t buf[2];

  // 1. 软件重置(寄存器 0x01,写入 0x11)
  buf[0] = 0x01;
  buf[1] = 0x11;
  HAL_I2C_Master_Transmit(hi2c, PCM5121_ADDR, buf, 2, HAL_MAX_DELAY);
  HAL_Delay(10); // 重置后需等待一段时间

  // 2. 设置页为 Page 0(寄存器 0x00,写入 0x00)
  buf[0] = 0x00;
  buf[1] = 0x00;
  HAL_I2C_Master_Transmit(hi2c, PCM5121_ADDR, buf, 2, HAL_MAX_DELAY);

  // 3. 上电请求
  buf[0] = 0x02;
  buf[1] = 0x00; // 0是正常,1是待机
  HAL_I2C_Master_Transmit(hi2c, PCM5121_ADDR, buf, 2, HAL_MAX_DELAY);

  // 4. 解除静音
  buf[0] = 0x03;
  buf[1] = 0x00;
  HAL_I2C_Master_Transmit(hi2c, PCM5121_ADDR, buf, 2, HAL_MAX_DELAY);

  // 5. PLL 使能
  buf[0] = 0x04;
  buf[1] = 0x00; // 0 关闭 PLL, 1 开启(通过外部提供时钟,如果启用,则可能是使用内部时钟)
  HAL_I2C_Master_Transmit(hi2c, PCM5121_ADDR, buf, 2, HAL_MAX_DELAY);

  // 6. BCK / LRCK 配置
  buf[0] = 0x09;
  buf[1] = 0x00; // 正常外部BCK/LRCK,PCM5121是I2S从模式,从STM32接收信号
  HAL_I2C_Master_Transmit(hi2c, PCM5121_ADDR, buf, 2, HAL_MAX_DELAY);

  // 音量设置
  buf[0] = 0x3D; // 61
  buf[1] = 0x80; // 左声道最大音量(24dB)默认是0dB,中等音量,对应0x30。0x80对应更小的音量
  HAL_I2C_Master_Transmit(hi2c, PCM5121_ADDR, buf, 2, HAL_MAX_DELAY);
  buf[0] = 0x3E; // 62
  buf[1] = 0x80; // 右声道最大音量
  HAL_I2C_Master_Transmit(hi2c, PCM5121_ADDR, buf, 2, HAL_MAX_DELAY);

  // I2S设置
  buf[0] = 0x28; // 40
  buf[1] = 0x02; // 0000 0010,使用I2S标准格式,数据位宽24bits
  HAL_I2C_Master_Transmit(hi2c, PCM5121_ADDR, buf, 2, HAL_MAX_DELAY);

}

在main主函数中,我是在I2C1和I2S3等初始化完成后,再执行这个PCM5121_Init函数。

-----------------

十分需要你们的帮助!!期待回复