
板子焊好了主控是RK3588电源方案用的RK806S。上电之后串口一点动静都没有示波器一量DDR那一路电源电压只有0.6V正常应该是0.8V左右。再用I2C去回读PMIC寄存器读出来的值却和你写进去的一样。这就是RK806S PMIC电源管理芯片调试里最典型的场景电源看着没起来但寄存器却告诉你一切正常。RK806S是瑞芯微平台配套的PMIC电源管理芯片负责给SoC内核、DDR、IO等各路供电通过I2C接口来配置输出电压、上电时序、状态监控这些核心功能。调试RK806S翻来覆去其实就三件事I2C能不能正常读写寄存器各路电源电压配置对不对上电时序满足不满足后端SoC的要求。这篇文章从芯片的底细、调试环境搭建、寄存器操作、时序验证到故障排查把完整流程捋一遍适合硬件工程师、Linux底层开发、FAE以及自己在玩RK3588/RK3568方案的爱好者参考。1. 先认清RK806S它到底管了什么1.1 RK806S在系统里扮演的角色RK806S是一颗多路输出的PMIC内部集成了多路降压DCDC和多路LDO线性稳压器。在RK3588这类高性能主控平台上它承担的任务很重VDD_CPU、VDD_GPU、VDD_LOGIC、VDD_DDR这些核心电源轨都挂在它下面而且因为SoC在不同负载下功耗变化很大这些电源轨的电压不是固定死的需要在运行中动态调节。这就和传统的分立DCDC方案拉开了本质区别。分立方案里你想调电压就得换反馈电阻想改时序就得改硬件延时电路每次改动都要动烙铁。而PMIC方案把电压和时序的控制权交给了寄存器软件可以在启动过程中按需配置甚至在运行中动态调压来省电。这也是为什么现在各大SoC平台几乎清一色用PMIC放弃分立电源方案的原因——不是分立方案供电质量不好而是它没法被软件精细管理。RK806S还承担了一部分状态监控的职责比如过温保护、过流保护、欠压保护。这些状态一旦触发芯片会通过中断或者状态寄存器上报调试过程中这些信息非常有用。很多时候系统莫名其妙重启或者死机去查PMIC状态寄存器往往能直接看到是哪一路过流了哪一路欠压了。1.2 调试的核心边界在哪里我在实际调试RK806S的时候习惯把问题划分成三个层次第一层是电气层。焊点是否虚焊电感是否饱和电容是否选错负载是否过大PCB走线是否合理。这一层的问题寄存器是看不出来的必须靠示波器、万用表去量。第二层是通信层。I2C总线能不能通设备地址对不对寄存器能不能稳定读写。这一层的问题典型表现是i2cget能读到数据但数据明显不对或者通信时而成功时而超时。第三层是配置层。电压值算得对不对时序配得合不合理DTS里的参数和硬件设计是否一致。这一层出问题往往表现为“寄存器里面写的都对但系统就是起不来”。这三个层次是有先后顺序的。我见过太多新手一上来就拿着i2cset去写电压寄存器结果折腾半天发现I2C总线压根就没通地址都扫不到。所以正确的调试顺序一定是先保证电气层正常再打通通信层最后才谈得上配置层。这个顺序看似简单但能严格执行的人不多尤其在时间紧迫的时候很容易跳过检查直接怀疑寄存器配置。2. 调试环境搭建工具和接线一次理清2.1 值得准备的硬件工具清单调RK806S之前先把工具备齐省得到时候抓瞎。我的工作台上常年放着以下这些东西万用表是必须的测通断、测静态电压、测电感量都能用上。示波器建议至少4通道带宽200MHz以上调试上电时序的时候4通道都未必够用我有时候还要在触发通道上做文章。带宽太低的示波器看电源纹波会失真看到的数据反而误导你。USB转I2C调试器是通信层调试的利器。RK806S挂在I2C总线上如果主控系统还没起来或者你想在系统起来之前先验证硬件那就要用外部的I2C调试器直接挂在总线上操作。我用过ChipLink和Aardvark这两个都可靠。如果手头没有专门的I2C调试器用树莓派或者STM32模拟I2C主机也行本质上就是I2C GPIO模拟速度慢点但能用。串口调试助手也是必备用来抓U-Boot和Kernel的启动日志。RK平台的调试串口波特率常见的是1500000数据位8无校验停止位1。Windows下我用sscomLinux下用picocom或者minicom都行。注意RK平台的串口电平是1.8V还是3.3V要根据核心板原理图确认接错电平可能烧接口。2.2 标定I2C总线和设备地址拿到一块板子第一步不是急着接调试器而是先找到RK806S挂在哪条I2C总线上。RK3588这类SoC内部有多组I2C控制器PMIC具体接在哪一组要看原理图。确定了总线号之后Linux下如果系统已经跑起来了可以用i2cdetect去扫描总线上的设备。i2cdetect -l命令可以列出系统里所有I2C总线。# 查看系统I2C总线列表 i2cdetect -l # 扫描指定总线上所有设备地址 i2cdetect -y -r 6i2cdetect的输出会显示总线上挂在哪些从设备地址格式是两位十六进制数。比如在总线6上扫描看到0x20这个地址有回应那大概率就是RK806S。常见情况下RK806S的7位I2C地址是0x20但这个地址不是焊死的芯片的ADR引脚电平不同地址可能偏移。如果你的板子上PMIC的ADR引脚接到了不同的电平那地址就可能是0x21或者其他值。如果你使用的是mdubus调试助手或者类似的Modbus调试工具来做I2C透传要注意这类工具默认可能不是I2C协议得先确认上位机的传输模式。我在实际中用过的mdubus调试助手更偏向Modbus RTU场景I2C设备挂在它后面不是很方便所以如果要调试RK806S还是建议直接用专用的I2C调试器或者直接用主控自带的I2C控制器配合i2c-tools。2.3 不要在I2C总线上叠加太多外部设备这里有一个我踩过的坑调试的时候把USB转I2C调试器直接挂在板子已有的I2C总线上而这条总线上同时还挂着SoC本身。上电之后SoC内部的I2C控制器也在驱动这条总线两边同时操作就会造成总线冲突表现为读出来的数据一会对一会不对或者扫描地址时只能扫到随机几个设备。所以我养成了一个习惯要外接I2C调试器的时候先把SoC端对应的I2C控制器停掉。在U-Boot环境变量里或者Kernel DTS里把这条I2C控制器的status改成disabled然后再外挂调试器。如果是通过设备树配置可以临时在DTS里加一条i2c6 { status disabled; };改完重新编译内核或者用U-Boot的fdt命令临时修改都行。这样就能保证总线上只有一个主机在控制。3. 寄存器读写与电压配置3.1 第一步永远是读CHIP_IDI2C通信通了之后不要急着改参数先读芯片的版本号或者芯片ID寄存器。每个PMIC厂商都留了这么个只读寄存器用于软件识别芯片型号和版本。RK806S的CHIP_ID具体在哪个地址以你手上的数据手册为准我手上板子常见的是在寄存器0x00或者偏移很小的区域。读的方法很简单i2cget直接读# 读取总线6上0x20设备的0x00寄存器 i2cget -y 6 0x20 0x00如果能读出一个固定的值比如0x60或者0x61这种说明I2C通路是通的读写方向没有反从设备地址也没错。这一步的意义是建立信心后续所有基于I2C的操作前提都是通信可靠。如果这一步就读不出来那后面所有电压配置都无从谈起。此时优先检查SDA和SCL的上拉电阻通常上拉到3.3V阻值在2.2k到10k之间都有其次检查I2C调试器的逻辑电平是否和板子上的I2C电压域匹配。3.2 电压配置的本质寄存器值到毫伏的换算RK806S输出电压的配置核心是往电压选择寄存器里写一个数值。这个数值和实际输出电压之间是线性关系公式大概是Vout Vbase step * N其中Vbase是基准电压step是每步的电压增量N就是你要写入的寄存器值。不同BUCK和LDO的Vbase和step不一样以手册为准。常见的情况是Vbase等于0.5V或者0.6Vstep等于12.5mV或者6.25mV。举个例子假设Vbase是0.5Vstep是12.5mV目标电压是0.8VVout 500mV 12.5mV * N 800mV N (800 - 500) / 12.5 24 0x18也就是说往电压寄存器写入0x18输出电压理论上就是0.8V。这个换算看起来简单但实操中容易在四舍五入上出错。如果计算出来的N是一个小数比如23.4那就需要判断是向上取整还是向下取整取决于PMIC寄存器是截断还是舍入。我一般的做法是先按四舍五入写然后用万用表实测再反过来推算实际的step到底是多少以实测为准。还经常遇到一种情况寄存器值算出来超过了寄存器的位宽上限。比如一个5位寄存器最大只能写到0x1F即31你算出来N是35那就说明Vbase和step的组合在这个目标电压下是不可行的需要换挡就是通过另一个寄存器切到更高量程的基准电压。3.3 写寄存器时的保护机制很多PMIC都有寄存器写保护正常工作时你不解锁就写不进去。这是芯片防止软件异常时误配置电源的关键机制。我调试RK806S的时候遇到过i2cset写进去了但回读发现数据没变的情况原因就是没有先解锁写保护。如果你也遇到“写不进”的问题按这个顺序排查确认地址和寄存器地址没写错i2cget命令格式和i2cset一致。查找手册里关于写保护Write Protect/Key Register/Unlock Register的说明。一般做法是先向解锁寄存器写入特定密钥序列然后在规定时间内写入配置寄存器。确认写入的寄存器是“可写”属性有些状态寄存器是只读的。用i2cset写寄存器时我习惯先把原来的值读出来存到笔记里万一写乱了还能恢复。# 写入之前先读取原值 i2cget -y 6 0x20 0x18 # 写入目标值 i2cset -y 6 0x20 0x18 0x243.4 内核DTS里的电压配置与寄存器的关系在Linux系统里RK平台的PMIC电压配置不只是靠裸寄存器更常用的是设备树里的regulator配置节点。DTS里会定义类似这样的一段vdd_cpu: vdd-cpu { compatible regulator-fixed; regulator-name vdd_cpu; regulator-min-microvolt 700000; regulator-max-microvolt 1000000; regulator-boot-on; regulator-always-on; };真正的PMIC regulator驱动会根据DTS里的min/max电压通过regmap接口去计算并写入PMIC的寄存器。所以我后面在联调时一定先确认当前真正生效的配置到底是DTS下发的还是你自己手动i2cset写的。系统启动之后DTS里的驱动会重新初始化PMIC把你手动改过的寄存器覆盖掉。所以如果你临时用命令改了电压来验证问题重新开机之后被DTS覆盖了这是正常现象不代表你的修改没生效只是软件把控制权接管回去了。要永久修改应该改DTS里的电压范围而不是单纯靠i2cset。4. 上电时序调试4.1 时序问题为什么是启动失败的隐形杀手PMIC调电压只是基本功真正考验功力的是上电时序。RK3568、RK3588这类高性能SoC内部模块众多对供电时序有严格顺序要求。类比来说就像公司开工必须按顺序启动先供安保系统再开电梯最后才让人进门。反过来就要出事。RK平台常见的供电顺序是先保证VDD_LOGIC/核心逻辑电源稳定然后是DDR电源就绪最后是IO和各类外设电源。这个顺序错了可能出现的情况包括DDR控制器在电源没稳的时候就开始初始化大概率失败或者SoC某模块闩锁表现为开机电流异常大然后自动关断。最头大的问题是时序错位但没差太多导致100块板子里有30块能开机70块开不了故障率随机这种问题最耗时间。4.2 怎么把当前时序准确抓出来调试时序示波器是唯一的权威。我的做法是用4通道示波器至少抓三路关键电源加上一个触发信号。触发信号一般选PWRON也就是PMIC的电源按键输入或者SoC的电源请求信号。具体抓法把示波器通道1接到PWRON信号上设置为上升沿触发。通道2、3、4分别接到需要验证的几路电源输出上比如VDD_CPU、VDD_DDR、VDD_LOGIC。设置适当的时基一般用10ms/div到50ms/div因为这取决于整个上电周期有多长。按下电源键或者触发SoC上电示波器单次捕捉完整波形。拿到波形之后首先看PWRON拉高之后各路电源的响应顺序是否和设计一致再测量各路电源从开始上升到稳定之间的延迟。特别是RESET信号的释放时间它通常要在所有关键电源都稳定之后才允许拉高。如果RESET拉高太早SoC在供电不稳时就开始复位释放启动基本必挂。调整时序的方式有两种。一是硬件层面调整修改PMIC各路电源的EN引脚延迟电路但主板已经做出来了这种改动不现实。二是软件层面通过配置RK806S内部的时序控制寄存器为每一路电源设置不同的使能延时。比如把VDD_DDR的使能延时设置为比VDD_LOGIC晚2ms就能实现先后顺序。这种寄存器在RK806S里通常是一组多路使能控制寄存器每种电源轨都对应一个延时配置位。具体地址要查你的芯片手册但思路是通用的找准“哪一路先起、哪一路后起、延时多少毫秒”这三个参数。4.3 串口日志里的时序线索除了示波器串口日志也能帮上忙。RK平台的U-Boot启动日志里PMIC驱动初始化时会打印不少信息比如pmic: rk806s probed这行至少说明PMIC通信没出大问题。如果系统卡死在DDR初始化阶段而前面PMIC又没报错那优先怀疑DDR电源时序或者电压幅值。如果你在日志里看到I2C读到PMIC寄存器失败那基本锁定在通信层或者PMIC供电还没起来。实际调试中我会把串口日志完整保存下来用编辑器的搜索功能检索关键字比如“regulator”、“pmic”、“vdd_ddr”、“failed”。日志里出现failed、timeout这类字眼直接定位到对应模块能省很多查线路的时间。5. 常见问题排查速查调试RK806S过程里遇到的问题翻来覆去就那么几类。我把它们整理成一个速查表每次遇到问题先对照这个表定位方向效率会高很多。现象可能原因排查手段I2C扫描不到PMIC地址设备地址不对SDA/SCL上拉电阻缺失总线复用冲突芯片没正常上电遍历扫描地址0x08到0x77量SDA/SCL波形检查PMIC输入电源寄存器写不进回读还是旧值写保护未解锁寄存器只读I2C通信时序不符合规格查手册解锁流程用示波器抓I2C波形看ACK信号输出电压和寄存器设定值偏差大寄存器值换算错误BUCK电感饱和反馈电阻网络不对用公式反推实测空载和满载电压对比检查功率电感规格输出电压纹波大输出电容容量不足反馈网络布局不合理开关频率配置不合适示波器AC耦合看纹波增加输出电容检查PCB布局上电时某路电压起不来使能信号没拉高对应BUCK输入没电元器件虚焊示波器抓EN波形量电感两端检查焊点系统运行中自动重启PMIC过温保护某路过流触发输入电压跌落读状态寄存器测温度量输入电流开机成功率不稳定上电时序不满足要求RESET释放太早某路电源上升太慢示波器抓完整时序调整延时寄存器检查软启动电容休眠唤醒后死机休眠时某路电源关断顺序错误唤醒时序不对抓休眠和唤醒时的电源波形核对DTS电源配置排查的顺序也有窍门。我的习惯是先从供电源头查起PMIC的输入电源如果都不稳定后面所有输出都不可能正常。然后用示波器看关键波形来判断通信质量I2C波形如果上升沿太慢就要检查上拉电阻或者总线上电容是不是太大了。最后才去动寄存器动一次测一次千万不要一次性改很多参数否则出了问题根本不知道是哪一步改坏了。还有一个细节容易忽略万用表测量开关电源输出时如果万用表带宽不够读到的电压可能是平均值但实际纹波可能很大。所以在验证PMIC输出电压是否准确时我建议示波器和万用表同时测以两个数据相互印证。6. 真机调试案例记录6.1 I2C扫描不到PMIC的疑难杂症有一块RK3568的核心板PMIC用的RK806S接上I2C调试器之后i2cdetect怎么扫都看不到PMIC的地址但板子上其他I2C设备倒是能正常扫到。这就奇了怪了总线上其他设备能通说明总线本身没问题问题应该出在PMIC这一侧。我先量了PMIC的输入电源VBAT供电正常3.3V和5V也都到了。然后量SDA和SCL到PMIC引脚的连通性万用表蜂鸣档确认没有虚焊。最后用示波器抓了I2C通信波形发现主机发出的地址帧PMIC那边确实回了ACK但回到上位机上就变成了NACK。绕了一圈才发现问题出在PMIC的I2C地址上。手册里写了RK806S的I2C地址取决于ADR引脚的电平设置而这块核心板把ADR接到的电平组合和我预想的不一样导致实际地址是0x21而不是常见默认的0x20。处理办法很简单i2cdetect扫0x21就出来了。后来我养成了习惯拿到新板子先遍历扫一遍所有地址而不是只扫手册里的常见地址。6.2 寄存器电压正常但实测电压偏低另一个更有代表性的案例。RK3588核心板DDR电源设定0.8V寄存器里读出来确实是正确的值但万用表实测DDR电源只有0.62V。我把这个现象发到群里很多人第一反应就是寄存器换算错了或者PMIC坏了。但实测下来电压是“带负载时跌落”空载时是0.8V一加载就掉到0.62V。这就不是PMIC的寄存器配置问题而是功率级扛不住负载。最终定位是DCDC功率电感选型偏小饱和电流不够。当DDR在跑压力测试时瞬时电流超过电感的饱和电流电感感值迅速下降输出就垮掉了。更换了饱和电流更充裕的电感之后实测满载电压稳在0.79V问题解决。这个案例值得反复琢磨寄存器回读正常只代表芯片内部设置没问题不代表电源通路就正常。从寄存器到最终的负载之间隔着功率电感、电容、PCB走线、焊点这些实实在在的物理器件任何一个环节不够强壮都会在电压示数上暴露出来。写在最后的几点体会调RK806S的时间不算短了回头来看这类PMIC调试真正难的不是寄存器怎么配而是排查问题时的思路是否清晰。RMIC寄存器就那么几个手册翻一翻就懂但怎么在遇到问题时快速定位到是通信问题、配置问题还是硬件问题这才是考验经验的地方。我个人总结了一个上电前的固定动作先拿万用表确认PMIC所有输入电源正常再用示波器抓一遍I2C波形确认通信通顺最后才允许自己打开寄存器手册去配置参数。这三步做完RK806S的调试基本就赢了一大半。希望这篇文章能帮你少走一些弯路。