这次我们来看 RK3588 硬件电路设计里一个非常关键、但经常被忽略的环节:PCIe3.0 同源时钟的 buffer 芯片方案。很多工程师在 RK3588 上扩展 NVMe SSD、PCIe 网卡或者 AI 加速卡时,原理图照着参考设计连完,一到调试就发现链路不稳定、只能协商到 Gen1、甚至完全枚举不到设备,问题往往就出在 100MHz 参考时钟这里。
这篇文章不会只讲型号,我会把同源时钟的概念、clock buffer 的选型思路、原理图连接方式、PCB 布线要点、以及调试阶段的验证方法全部串起来。你会知道 RK3588 的 PCIe3.0 时钟架构为什么推荐用 buffer 扇出,而不是直接并联;也会知道拿到一块板子之后,怎么从示波器波形、内核日志和 lspci 信息一步步判断时钟链路是否正常。
文章中涉及 RK3588 硬件设计指南里的通用设计原则,以及 PCIe Base Spec 3.0 对参考时钟的基本要求。如果你正在做 RK3588 核心板、边缘计算盒子或者 NAS 主板,这篇内容可以直接作为原理图评审的检查清单。
1. 核心能力速览
| 设计项 | 说明 |
|---|---|
| 主控平台 | RK3588 / RK3588J,原生支持 PCIe3.0 与 PCIe2.0 控制器 |
| 时钟协议 | PCIe 100MHz 差分参考时钟,常用 Common Clock(同源时钟)架构 |
| 核心器件 | 时钟 buffer 芯片,典型如 TI LMK00301/LMK00308、Renesas 9DB 系列 |
| 设计目标 | 将单路 100MHz REFCLK 扇出到多个 PCIe 端点,降低抖动与相位漂移 |
| 典型外设 | NVMe SSD、PCIe 转千兆/万兆网卡、WiFi6/5G 模组、采集卡、AI 加速卡 |
| 调试工具 | 示波器 + 差分探头、频谱仪、逻辑分析仪、Linux lspci/dmesg |
| 设计难点 | 等长布线、AC 耦合电容、平面完整性、电源滤波、PERST# 时序配合 |
| 适合场景 | RK3588 板卡原理图设计、参考设计二次开发、PCIe 链路调试 |
表格里的参数不是具体某款魔改工具的指标,而是 RK3588 平台通用设计需要关注的项。实际选型要根据你的 PCIe 通道数、布局空间、成本预算来决定。
2. 同源时钟架构与使用边界
PCIe3.0 的数据速率是 8GT/s,接收端对参考时钟的抖动和频率偏移非常敏感。PCIe 规范里定义了多种参考时钟架构,RK3588 板卡上最常用的就是 Common Clock(同源时钟)模式。
同源时钟的意思是:Root Complex 和 Endpoint 使用同一个 100MHz 参考时钟源。RK3588 内部有 PCIe PHY,外部需要一个干净、低抖动的 100MHz 差分时钟输入。如果只有一个 PCIe 设备,可以直接把参考时钟晶振的输出接到 RK3588。但是 RK3588 往往有多个 PCIe 控制器,或者需要同时挂多路 PCIe 设备,这时单路时钟信号没法直接并联到多个设备,信号质量会明显下降。
时钟 buffer 的作用就是:把一个时钟源复制成多份,保持同频同相,输出多路低抖动 100MHz 差分时钟,分别送给 RK3588 和各个 PCIe 端点。这样整条链路都参考同一个时钟源,避免各个设备之间因为时钟不同步导致数据采样错误。
适用场景非常明确:
- RK3588 需要挂 2 个及以上 PCIe 设备。
- 板上有 PCIe3.0 设备,且对链路稳定性要求高。
- 希望后续通过跑 PCIe 链路训练和压力测试验证信号完整性。
有些场景其实不需要 buffer。比如只用一个 PCIe3.0 NVMe 设备,并且 RK3588 和 SSD 靠得很近,晶体振荡器的单路输出可以直接满足要求。但这种方案扩展性差,预留 buffer 的位置通常更稳妥。
需要同时说明使用边界:同源时钟不解决所有信号完整性问题。如果差分走线阻抗不对、参考平面被割裂、电源纹波大,即使 buffer 再好,PCIe 照样跑不到 Gen3。时钟 buffer 解决的是“时钟扇出和抖动控制”,不是“整板信号完整性”。
合规方面,设计高速接口时要注意使用授权芯片、合法公开的参考设计和原厂 datasheet,不要照搬破解资料或未经授权的公板方案。调试过程中涉及 PCIe 设备识别、固件烧写,都要在自有测试样机上操作。
3. RK3588 PCIe3.0 硬件设计前置知识
3.1 PCIe 时钟架构分类
PCIe 参考时钟按架构分三类:
| 架构类型 | 说明 | 使用场景 |
|---|---|---|
| Common Clock | 所有设备共用同一参考时钟 | RK3588 板卡默认方案,也是同源时钟 buffer 的应用基础 |
| Independent Clock | 各设备使用独立时钟源 | 对抖动要求不高的场景,RK3588 板卡较少使用 |
| SRIS | 时钟源在 RX 端恢复 | 线缆互连场景,需要芯片支持 SRIS 模式 |
同源时钟的优势在于,接收端可以利用发送端时钟的相位信息做数据恢复,抖动容限更高。PCIe3.0 对参考时钟的相位抖动有明确要求,一般要求 REFCLK 的周期间抖动控制在几十皮秒以内,具体参数要查芯片 datasheet 和 PCIe 规范表格。
3.2 RK3588 的 PCIe 控制器资源
RK3588 官方规格中,PCIe 资源分为 PCIe3.0 控制器和 PCIe2.0 控制器。其中 PCIe3.0 控制器可以配置为 x4 或 x2/x1,PCIe2.0 控制器一般用于低速外设。
这意味着硬件设计时不能只考虑一个 REFCLK 输出,要结合 RK3588 实际使用的控制器数量、通道拆分方式来做时钟树规划。比如:
- 一路 PCIe3.0 x4 接 NVMe 存储。
- 一路 PCIe2.0 x1 接 WiFi 模块。
- 另一路 PCIe2.0 x1 接 5G 模组。
这种多路场景下,时钟 buffer 至少需要 4 路输出:一路给 RK3588 内部 PCIe PHY,三路分别给各端点。如果 buffer 输出通道不够,就要换更高路数的型号,或者使用两个 buffer 级联(不推荐级联太多,会引入附加抖动)。
从布局角度讲,RK3588 的 REFCLK 输入引脚是差分对,常见标记为 REFCLK_P/N。时钟芯片建议靠近 SoC 放置,避免长距离走线引入噪声。
3.3 100MHz REFCLK 的电平与耦合方式
PCIe REFCLK 是 100MHz 差分时钟,端点设备接收端一般要求 AC 耦合,常见做法是在发送端串 0.1uF 或 0.22uF 的电容。RK3588 参考设计中,REFCLK 差分对通常需要预留 AC 耦合电容位置。
电平标准一般是差分摆幅 0.6V 到 1.2V 之间,具体看时钟 buffer 输出类型和 PCIe 端点的接收要求。常见 buffer 输出有 LVDS、ULVDS、HCSL 等类型,PCIe 规范常用 HCSL 或类 HCSL 电平。设计时要确认时钟芯片输出是否兼容端点输入电平,不能直接拿 LVDS 输出硬扛 HCSL 输入,否则链路测试会出问题。
4. 时钟 buffer 芯片选型与原理图设计
4.1 典型型号与选型维度
市面上常见 PCIe 时钟 buffer 芯片包括:
- TI LMK00301 / LMK00308:多路 HCSL/LVDS 输出,可编程,适合高速系统。
- Renesas 9DB403 / 9DB803:PCIe 专用时钟缓冲器,输出路数多。
- IDT(现 Renesas)5V41219 等 PCIe 时钟源器件。
选型不能只看路数,要从以下维度评估:
| 选型维度 | 设计要点 |
|---|---|
| 输出路数 | 根据 RK3588 + 外设总数预留 1~2 路余量 |
| 输出电平 | HCSL 优先,兼容 PCIe 端点;LVDS 需确认电平转换 |
| 输入类型 | 单端或差分输入,判断是否支持晶振直连 |
| 抖动指标 | 关注 Additive Jitter,越低越好 |
| 配置方式 | 硬件引脚模式还是 I2C/SMBus 可编程模式 |
| 电源域 | 3.3V 还是 2.5V,确认与 RK3588 I/O 电源兼容 |
如果你只是做一颗标准 NVMe 扩展板,选一颗便宜的 4 路 buffer 就够。如果要做多接口背板,建议选支持 I2C 配置的高端型号,方便量产时通过固件调整输出控制和边沿速率。
4.2 同源时钟参考设计原理
RK3588 同源时钟 buffer 的典型连接方式如下:
RK3588 SoC │ └── REFCLK_P/N ←──────────────────┐ │ 100MHz 振荡器 / 有源晶振 │ │ │ └── Clock Buffer IN ───────────────┤ │ ├── OUT0 ──→ PCIe3.0 NVMe SSD ├── OUT1 ──→ PCIe3.0 网卡 ├── OUT2 ──→ PCIe2.0 WiFi 模块 └── OUT3 ──→ (预留)注意这里 RK3588 的 REFCLK 是从 buffer 的某一路输出反向接回,而不是直接接晶振。这样才能保证 RK3588 的 PCIe PHY 和所有端点设备使用同一个源。
原理图设计时有几个容易踩的坑:
- Buffer 输入如果支持差分晶振,需要把晶振的差分输出通过 AC 耦合电容连接。
- 每一路输出都要预留串联电阻和 AC 耦合电容的位置,便于调试时调整摆幅。
- Buffer 的电源引脚需要单独 π 型滤波,避免数字电源噪声耦合到时钟输出。
- 输出未使用的通道要接默认电平或终端电阻,不能悬空。
4.3 原理图连接示例
下面是一份通用的 RK3588 PCIe 时钟 buffer 原理图连接模板,实际引脚名以所选芯片 datasheet 为准。
U1 Clock Buffer LMK00304 VDD -> 3.3V GND -> GND IN_P -> 100MHz OSC_OUT_P IN_N -> 100MHz OSC_OUT_N EN -> 3.3V(或 GPIO 使能) OUT0_P -> C1 -> RK3588 REFCLK_P OUT0_N -> C2 -> RK3588 REFCLK_N OUT1_P -> C3 -> PCIe NVMe REFCLK_P OUT1_N -> C4 -> PCIe NVMe REFCLK_N ...原理图设计建议:
- 在 buffer 输入端预留 0Ω 电阻或电容位,方便断开原时钟源做单点调试。
- 每一路 REFCLK 差分对都标注阻抗要求:100Ω 差分。
- PERST# 复位信号要在时钟稳定后释放,时序关系必须满足 PCIe 规范。
4.4 电源和时钟完整性的关系
时钟 buffer 是敏感模拟器件,电源质量直接影响输出抖动。建议在 buffer 电源入口增加磁珠和 10uF + 0.1uF + 100pF 组合电容。磁珠不能选阻抗过高的型号,否则负载瞬态响应差,反而增大电源纹波。
RK3588 的 PCIe PHY 电源也需要单独处理,通常参考设计会标注多个电源域。硬件评审时要检查:这些电源是否来自干净的 LDO / DC-DC 输出,是否与数字大电流电源共用平面。遇到过很多板卡,时钟芯片电源和 DDR 电源靠得很近,PCIe 链路一压测就错包。
5. PCB 设计要点与等长约束
原理图连接正确只是第一步,RK3588 PCIe3.0 跑到 8GT/s,PCB 设计才是决定性的。
5.1 叠层与阻抗
PCIe3.0 差分对要求 85Ω 或 100Ω 差分阻抗,具体以 RK3588 硬件设计指南为准。多数四层板设计做 100Ω 差分是常见做法,但很多 RK3588 核心板用 8 层板或 10 层板,叠层设计要结合板材、铜厚、介质厚度计算。
建议在 PCB Layout 阶段使用 SI 仿真工具(如 Polar SI9000、Cadence Sigrity)先算阻抗线宽,而不是等板厂反馈再改。差分对间距要满足 2S 原则,减少串扰。
5.2 差分走线等长与参考平面
时钟 buffer 输出的 REFCLK 差分对到 RK3588、到各端点之间要尽量等长。差分对内等长误差建议控制在 5mil 以内,组间等长误差可以根据 8GT/s 的时序预算来计算,一般控制在 ±50mil 级别,但最终以 PCIe 规范中 REFCLK 抖动预算为准。
重点提醒:REFCLK 差分对下方必须是完整的参考平面,不能跨分割,不能穿过电源转换区域。如果布线必须换层,要在换层过孔旁边加地过孔,保证回流路径连续。
5.3 布局建议
时钟 buffer 放在 RK3588 同一侧,尽可能靠近 SoC。各路对外 PCIe 时钟走线从 buffer 引出后,以扇形方式分布,不要平行长距离紧贴数字信号线。
PERST# 复位信号和时钟走线不要平行,避免复位噪声耦合到 REFCLK 上。PCIe 数据线 TX/RX 与 REFCLK 也尽量不要长距离平行,保持一定间距。
5.4 调试接口预留
建议在原理图中为以下信号预留测试点:
| 信号 | 测试目的 |
|---|---|
| REFCLK_P/N | 用示波器观察 100MHz 差分时钟波形 |
| PERST# | 测量复位释放时序 |
| PCIe TX/RX 差分对 | 有条件时测量眼图 |
| Buffer 输出使能脚 | 检查时钟输出是否正常可控 |
预留测试点不仅方便实验室调试,也方便产线在老化测试时快速定位时钟异常。
6. 软件与设备树中的时钟相关配置
虽然这篇文章聚焦硬件电路设计,但 PCIe 能不能跑起来,经常会和软件配置扯上关系。时钟 buffer 如果支持 I2C/SMBus 配置,Linux 设备树里需要描述这个器件。
6.1 通用设备树模板
如果 RK3588 板卡上的时钟 buffer 挂在 I2C 总线上,设备树可以这样写(实际器件地址和 compatible 以 datasheet 为准):
&i2c0 { status = "okay"; clock_buffer: clock-buffer@6a { compatible = "ti,lmk00304"; /* 按实际型号修改 */ reg = <0x6a>; clocks = <&ref100mhz>; clock-names = "xin"; #clock-cells = <0>; }; };这里只是为了说明节点写法,不要直接照搬。你在实际项目中要用原厂提供的 Linux 驱动或通用时钟框架,把 REFCLK 使能时序控制在 PCIe 控制器复位之前。
6.2 PCIe 控制器设备树配置
RK3588 Linux SDK 设备树中,PCIe3.0 控制器节点常见配置如下:
&pcie30phy { status = "okay"; }; &pcie3x4 { reset-gpios = <&gpio4 RK_PC6 GPIO_ACTIVE_HIGH>; vpcie3v3-supply = <&vcc3v3_pcie>; max-link-speed = <3>; /* 限制最高协商速率 */ status = "okay"; };注意reset-gpios的引脚号必须和原理图一致。如果这个引脚接错,PCIe 端点会一直复位,链路训练根本没机会完成。
6.3 内核调试命令
板卡启动进入 Linux 后,先跑下面几个命令看 PCIe 枚举情况:
# 查看 PCIe 设备列表 lspci # 查看详细链路能力,重点关注 LinkCap、LinkSta lspci -vvv # 查看内核 PCIe 相关日志 dmesg | grep -i pcie # 查看 PCIe 链路当前速率 sudo lspci -n -vvv | grep -E "LnkCap|LnkSta"如果能看到设备列出,但LnkSta里显示Speed 2.5GT/s,说明只协商到 Gen1,时钟质量、去加重设置、信号完整性或布线长度可能有问题。如果lspci完全没有设备,先查 PERST# 时序和 REFCLK 输出。
7. 时钟质量验证与显式测试方法
7.1 示波器观察 REFCLK
用差分探头接 REFCLK_P/N,示波器设置:
- 时基 2ns/div
- 采样率建议 20GSa/s
- 触发方式为上升沿
预期看到 100MHz 正弦波或方波,周期 10ns,峰峰值根据电平标准约 0.6V~1.2V 差分摆幅。波形不能有明显毛刺,边沿不能有过冲过大现象。
如果看不到波形,优先检查 buffer 是否处于使能状态、电源有没有输出、AC 耦合电容是否焊接正确。有一种很常见的情况:原理图中使能脚通过 10kΩ 上拉到 3.3V 但芯片使能是高有效,结果贴片时上拉电阻虚焊,导致 buffer 输出全无。用示波器测 EN 脚电压就能快速定位。
7.2 抖动测量
如果示波器支持抖动分析功能,可以测量 REFCLK 的 period jitter。PCIe3.0 对 REFCLK 抖动有严格限制,但不同测试条件下差异很大,建议直接以 PCIe 规范和芯片手册为准。
现场没有高级示波器时,可以先用频谱仪观察 100MHz 附近相位噪声。如果出现明显的杂散分量,说明 PCB 布局或电源有干扰。
7.3 链路压力测试
Linux 下可以用常见工具做 PCIe 压力测试。以 NVMe SSD 为例,可以使用 fio 连续读写测试:
# 高强度顺序写,观察是否掉盘、报 IO 错误 sudo fio --name=write_test --filename=/dev/nvme0n1 \ --ioengine=libaio --direct=1 --bs=1M --size=10G \ --numjobs=4 --runtime=300 --time_based --rw=write # 查看 PCIe 错误计数 sudo cat /sys/bus/pci/devices/0000:01:00.0/errors如果跑几分钟后dmesg出现 PCIe AER error,说明时钟链路或数据线仍有问题。这个时候不要盲目改软件参数,应该回到硬件上检查 REFCLK 波形、PERST# 时序、差分对阻抗。
8. 常见问题与排查方法
| 问题现象 | 可能原因 | 排查方式 | 解决方案 |
|---|---|---|---|
| lspci 枚举不到任何 PCIe 设备 | REFCLK 无输出 | 示波器测 buffer 输出和 RK3588 REFCLK 引脚 | 检查 buffer 供电、使能脚、AC 耦合电容 |
| 只能协商到 Gen1(2.5GT/s) | 时钟抖动大、走线过长、端接错误 | lspci -vvv 查看 LnkSta,测眼图 | 优化走线等长、改善端接、降低 PCB 布线长度 |
| 高负载读写时 PCIe 设备掉线 | 电源纹波大、时钟稳定性差 | 测电源纹波、查看 AER 错误计数 | 加强电源滤波、调整时钟 buffer 供电 |
| 时钟波形有毛刺或不完整 | 差分等长误差过大、阻抗不连续 | 用示波器测波形和边沿 | 按阻抗要求重新出图、调整等长 |
| buffer 输出对地短路 | 焊接不良、封装方向贴反 | 用万用表测输出引脚对地阻抗 | 重新焊接或更换芯片 |
| 更换时钟 buffer 型号后链路直接不通 | 引脚定义不同、I2C 配置不同 | 核对 datasheet 引脚和寄存器 | 按新 datasheet 重新出图,检查配置脚本 |
| PERST# 释放时间早于 REFCLK 稳定 | 复位时序配置错误 | 逻辑分析仪抓 PERST# 和 REFCLK 时序 | 软件延时或改复位控制电路 |
排查时记住一个原则:先时钟,后数据线,再电源。REFCLK 波形不过关,后续全部白调。
9. 时钟 buffer 的 I2C 配置与批量生产建议
如果选用的 buffer 支持 I2C/SMBus 配置,在生产阶段还要确保每一片板卡都写到正确配置。不同芯片的寄存器地址和配置字差异很大,这里只给通用思路。
9.1 通用 I2C 探测命令
系统起来后,可以先扫描 I2C 总线上的器件地址:
# 扫描 I2C0,确认 buffer 芯片地址,注意地址可能带 8bit 左移 i2cdetect -y 0如果芯片地址出现在探测结果里,说明 i2c 总线通信正常。接下来可以读取芯片 ID 寄存器确认型号:
i2cget -y -f 0 0x6a 0x00这里0x6a是 7bit 地址示例,0x00是寄存器地址示例。实际使用时以 datasheet 为准,不要直接套。
9.2 批量写入配置
有些 buffer 芯片没有内存保存能力,每次上电都需要软件配置。这种情况下建议把配置做成独立脚本或内核驱动,在 PCIe 控制器复位前完成初始化。常见做法:
#!/bin/bash # 在系统启动脚本中配置时钟 buffer i2cset -y -f 0 0x6a 0x03 0x01 i2cset -y -f 0 0x6a 0x04 0x02很多芯片还支持 OTP 或 EEPROM 保存,量产时可以先烧录一次,再贴板。这个要看具体型号能力,不能一概而论。
批量生产建议:
- 建立单独的时钟 buffer 配置文件,按不同板卡型号区分。
- 老化测试脚本中加一项 PCIe 链路速率检查。
- 如果芯片通过引脚配置模式选择输出,要在贴片前确认电阻配置和 BOM 一致。
10. RK3588 PCIe 时钟设计的资源占用与性能观察
硬件设计不存在“显存占用”这类指标,但等价的内容是功耗、时钟抖动、PCB 面积和成本。
时钟 buffer 芯片功耗一般几百毫瓦级别,对整板功耗影响不大,但电源质量会影响 PCIe 功耗。如果 RK3588 的 PCIe PHY 电源纹波过大,可能会导致链路功耗异常升高或者过热。
调试阶段建议用热像仪观察 RK3588 PCIe PHY 和时钟 buffer 区域温度。如果 buffer 温度明显偏高,说明内部驱动负载可能有问题,或者输出通道存在短路。时钟 buffer 正常工作时一般只是微温。
从信号完整性的角度看,关注这些指标:
| 观察对象 | 关注指标 |
|---|---|
| REFCLK 波形 | 上升时间、下降时间、差分摆幅 |
| REFCLK 抖动 | Period Jitter、Cycle-to-Cycle Jitter |
| PCIe 链路 | LinkSpeed、LinkWidth、错误计数 |
| 电源纹波 | 100MHz 附近纹波幅度 |
| 板卡温度 | buffer 区域、RK3588 PCIe PHY 区域 |
保持记录的习惯,每次修改后重新测量,可以快速定位是布局变化还是器件参数变化导致的性能波动。
11. 最佳实践与检查清单
把 RK3588 PCIe3.0 同源时钟 buffer 设计总结成自查清单:
- 确认 RK3588 用到的 PCIe 控制器数量和 endpoint 个数,规划 buffer 输出路数。
- 确认 buffer 输出电平与各端点 REFCLK 输入兼容,不兼容时加电平转换或改选型。
- REFCLK 差分对预留 AC 耦合电容位置,容值参考对应芯片 datasheet。
- buffer 输出使能脚、I2C 地址电阻确认无误,建议预留调试焊盘。
- 差分走线阻抗按 design guide 计算,REFCLK 差分对下方不能跨分割。
- REFCLK 差分对等长误差控制在规范范围内,宁可稍微绕线也不要牺牲参考平面。
- buffer 电源单独滤波,不要和数字大电流电源共用同一个平面出口。
- PERST# 控制信号在时钟稳定后释放,利用逻辑分析仪抓时序确认。
- 首板贴片后先做最小系统调试,确认 REFCLK 波形正常后再插 PCIe 设备。
- Linux 启动后用 lspci -vvv 检查协商速率和链路宽度。
补充一条最实在的建议:如果你第一次做 RK3588 板卡,优先在原理图上原封不动地保留瑞芯微参考设计中关于时钟部分的所有器件、电阻和电容。不要根据经验删掉“看着没用”的器件,很多细小的 RC 组合都是为了匹配时钟信号边沿而存在的。
12. 总结与下一步
最值得先抓的点是:确认 REFCLK 到底有没有稳定输出、有没有真正送到 RK3588 和各个端点。这一步不受太多信号完整性理论影响,示波器一测就知道。最容易踩的坑是 PERST# 时序和 REFCLK 稳定之间的关系,很多板卡明明波形正常但设备枚举不了,仔细查复位时序就能找到原因。
后续如果这个时钟链路已经稳定,可以继续做的方向是:把 RK3588 的 PCIe3.0 扩展成多路 NVMe 存储系统,配合硬件设计完善 Linux 下设备树和 PCIe 错误监控;或者做 PCIe 信号完整性预检,用更完整的眼图测试验证 Gen3 长链路余量。希望这篇 RK3588 PCIe3.0 同源时钟 buffer 设计解读,能帮你把原理图评审和板卡调试的思路理清楚。