Raspberry Pi 3B搭配Suptronics X920扩展板PCM5122 DAC音频播放故障求助
我来帮你一步步排查Suptronics X920(PCM5122 DAC)的音频输出问题,结合你的配置和代码,咱们先从最关键的系统配置入手:
第一步:修正树莓派设备树配置(核心问题)
你的config.txt里存在几个冲突的配置,这大概率是导致DAC无法工作的原因:
- PWM和I2S共享硬件时钟,同时启用会直接冲突
- 错误使用了
generic-i2soverlay,没有加载PCM5122对应的专用驱动 - 内置音频没有禁用,可能抢占了音频资源
请替换你的config.txt为以下精简且正确的配置(保留你需要的其他功能,比如RTC、显示屏):
kernel=u-boot-dtok.bin framebuffer_depth=16 # 禁用内置音频,优先使用外接DAC dtparam=audio=off dtparam=i2c_arm=on dtparam=spi=on # 加载PCM5122对应的DAC overlay(X920适配的标准版本) dtoverlay=hifiberry-dac # 注释掉PWM overlay,避免和I2S时钟冲突 # dtoverlay=pwm-2chan-with-clk,pin=18,func=2,pin2=13,func2=4 start_x=1 # 保留你需要的其他配置(RTC、显示屏、USB等) dtoverlay=i2c-rtc,ds3231 dtoverlay=rpi-ft5406 hdmi_force_hotplug=1 framebuffer_swap=0 max_usb_current=1 hdmi_group=2 hdmi_mode=87 hdmi_cvt 1024 600 60 6 0 0 0 hdmi_drive=1 enable_uart=1 core_freq=400
注:如果
hifiberry-dac无效,可以尝试dtoverlay=suptronics-x920(部分定制固件支持这个专用overlay)
第二步:验证DAC设备是否被系统识别
修改配置后重启树莓派,通过adb命令确认系统是否正确识别到DAC:
# 查看所有音频输出设备 adb shell dumpsys audio | grep -A 5 "Output Devices"
你应该能看到类型为TYPE_BUS的设备,且产品名称包含PCM5122或X920的标识。如果看不到,说明系统没识别到DAC,需要检查硬件接线或固件版本。
第三步:调整Android播放代码的设备选择逻辑
你的代码里存在两个潜在问题:
- 没有确认
TYPE_BUS设备是否存在,空指针会导致使用默认设备 preferredDevice优先级低于系统默认,建议直接指定设备
请修改代码如下:
fun playSound(file: File) { val audioEncoding = AudioFormat.ENCODING_PCM_16BIT val sampleRate = 16000 val audioOutputFormat = AudioFormat.Builder() .setChannelMask(AudioFormat.CHANNEL_OUT_MONO) .setEncoding(audioEncoding) .setSampleRate(sampleRate) .build() val audioOutputBufferSize = AudioTrack.getMinBufferSize(sampleRate, audioOutputFormat.channelMask, audioEncoding) // 查找BUS设备,同时打印所有设备信息方便排查 val audioOutputDevice = findAudioDevice(AudioManager.GET_DEVICES_OUTPUTS, AudioDeviceInfo.TYPE_BUS) ?: run { e { "ERROR: 未找到TYPE_BUS类型的音频设备" } return } // 直接指定音频设备,而不是设置preferredDevice val audioTrack = AudioTrack.Builder() .setAudioFormat(audioOutputFormat) .setBufferSizeInBytes(audioOutputBufferSize) .setTransferMode(AudioTrack.MODE_STREAM) .setAudioDeviceInfo(audioOutputDevice) .build() val buffer = ByteArray(audioOutputBufferSize) try { audioTrack.play() audioTrack.setVolume(1f) val stream = file.inputStream().buffered() while (stream.read(buffer) > 0) { val out = audioTrack.write(buffer, 0, buffer.size, AudioTrack.WRITE_BLOCKING) d { "写入字节数: $out" } } } catch (error: Throwable) { e(error) { "播放音频失败: $file" } } finally { audioTrack.stop() audioTrack.release() stream.close() } } private fun findAudioDevice(deviceFlag: Int, deviceType: Int): AudioDeviceInfo? { val manager = getSystemService(Context.AUDIO_SERVICE) as AudioManager val adis = manager.getDevices(deviceFlag) for (adi in adis) { // 打印所有设备的详细信息,方便确认目标DAC d { "设备信息: 名称=${adi.productName}, 类型=${adi.type}, ID=${adi.id}" } if (adi.type == deviceType) { return adi } } return null }
第四步:基础音频测试(排除代码问题)
如果修改后还是没声音,先排除代码问题,用系统原生工具测试:
# 推送一个测试wav文件到设备 adb push test.wav /sdcard/ # 使用MediaPlayer播放 adb shell am start -a android.intent.action.VIEW -d file:///sdcard/test.wav -t audio/wav
如果这样能听到声音,说明是代码逻辑问题;如果还是没声音,回到系统配置和硬件检查。
额外排查点
- 检查X920扩展板的电源是否充足,树莓派USB供电可能不够,建议用独立电源供电
- 确认I2S引脚连接正确:BCLK(GPIO18)、LRCLK(GPIO19)、DIN(GPIO20)、GND、5V
- 尝试更新树莓派固件和Android系统版本,部分旧版本对PCM5122支持不好
内容的提问来源于stack exchange,提问作者4emodan
相关产品推荐
相关产品推荐

