TLV320aic3110编解码器启动及休眠唤醒报错问题求助
排查TLV320AIC3110启动及休眠唤醒异常问题
错误码含义说明
-6=ENXIO:I2C总线无法访问目标设备/寄存器,通常关联通信链路故障、设备未上电/未完成复位、地址配置错误-16=EBUSY:设备或资源处于忙状态,多因电源管理时序异常、寄存器访问冲突导致-1=EPERM/EINVAL:操作无效,一般是寄存器状态不符合预期、电源配置逻辑错误
分步排查方案
1. 硬件及基础通信验证
- 用示波器/逻辑分析仪抓取I2C总线(SDA/SCL)波形,确认设备启动、复位完成后,对0x18地址的I2C读写是否正常,重点观测访问0x1D寄存器时的响应信号
- 测量Codec各电源引脚(HPVDD/SPRVDD/AVDD/IOVDD/DVDD)的电压,确认是否符合芯片规格;休眠唤醒阶段需验证电源切换的稳定性,无掉电、欠压情况
- 检查复位GPIO(gpiof6)时序:确保设备上电后,复位引脚维持低电平的时间满足数据手册要求(通常≥10ms),再拉高完成设备初始化
- 确认AUDIO_PWR_EN1(PH2)的控制逻辑:启动阶段该引脚需正确拉高为Codec供电,休眠阶段的电平切换需符合电源管理设计
2. 设备树配置修正检查
电源相关
- 检查
DVDD-supply对应的scmi_v1v8_periphregulator配置:报错中的Underflow of regulator enable count说明regulator引用计数异常,可尝试给该regulator节点添加regulator-always-on;属性(若该电源仅为Codec或非低功耗敏感设备供电) - 修正复位GPIO配置:若硬件复位引脚为推挽输出,将
GPIO_OPEN_DRAIN改为GPIO_PUSH_PULL,避免驱动输出电平异常 - 确认
ai31xx-micbias-vg取值:MICBIAS_2_0V需与硬件麦克风的偏置电压需求匹配,虽非启动通信失败直接原因,但会影响后续音频通路
I2S及时钟配置
- 验证
simple-audio-card的system-clock-frequency:TLV320AIC3110支持12MHz~27MHz的MCLK,当前12MHz符合规格,但需确认I2S1的MCK引脚(PB0)是否正确输出该时钟 - 检查I2S1时钟源:确认
&rcc SPI1_K对应I2S1的时钟,且时钟树配置中SPI1_K的输出频率为12MHz - 调整休眠引脚配置:
codec_sleep_pins_a中所有Codec相关引脚设为ANALOG模式可能导致唤醒后引脚状态异常,可改为GPIO_INPUT模式
I2C配置
- 校准I2C1的时序参数:
i2c-scl-rising-time-ns和i2c-scl-falling-time-ns需匹配PCB走线特性,若走线较长,需适当调整参数保证通信稳定性 - 确认I2C总线上0x18地址的唯一性:排查是否有其他设备占用相同地址
3. 驱动及内核配置检查
- 核查TLV320AIC3110驱动的电源管理逻辑:5.15内核的aic31xx驱动存在regulator引用计数、寄存器恢复的已知bug,可查看内核补丁列表,尝试合入对应修复补丁
- 临时禁用Codec休眠电源管理:在
codec节点添加power-domains = <&pd_dummy>;(需平台支持),或修改驱动强制regulator保持开启,验证是否为电源管理导致的问题 - 启用内核调试日志:开启
CONFIG_SND_DEBUG=y和CONFIG_I2C_DEBUG_CORE=y,获取更详细的I2C通信、音频驱动日志,分析寄存器读写的具体过程
4. 寄存器同步失败针对性排查
启动阶段Unable to sync registers 0x1d-0x1d说明驱动读取Page 0下的0x1D寄存器(Codec Interface Control 2)失败,可:
- 在驱动中添加调试代码,打印访问该寄存器前的Page切换操作(TLV320AIC3110需先写0x00寄存器切换页面),确认页面切换是否正确
- 通过用户空间I2C工具(
i2cget/i2cset)手动访问0x18设备的0x1D寄存器,验证硬件通信是否正常
类似问题参考
社区用户曾遇到同类I2C寄存器同步失败问题,根因多集中在:
- 复位时序错误,设备未完成初始化即被驱动访问
- Regulator配置错误,导致设备供电不稳定
- I2C总线存在干扰,通信丢包
内容的提问来源于stack exchange,提问作者jesusjimsa
相关产品推荐
相关产品推荐

