ARTICLE DETAIL

资讯详情

深耕网站建设与运营推广的一线实战洞察。

RK3588 PCIe3.0同源时钟buffer硬件设计全解析

RK3588 PCIe3.0同源时钟buffer硬件设计全解析 这次我们来看 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/x1PCIe2.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 / 9DB803PCIe 专用时钟缓冲器输出路数多。IDT现 Renesas5V41219 等 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/sPCB 设计才是决定性的。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-buffer6a { 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 --namewrite_test --filename/dev/nvme0n1 \ --ioenginelibaio --direct1 --bs1M --size10G \ --numjobs4 --runtime300 --time_based --rwwrite # 查看 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 耦合电容只能协商到 Gen12.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 JitterPCIe 链路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 设计解读能帮你把原理图评审和板卡调试的思路理清楚。
返回列表