目前我使用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函数。
-----------------
十分需要你们的帮助!!期待回复