ARTICLE DETAIL

资讯详情

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

RK3588 PCIe同源时钟Buffer电路设计与调试要点

RK3588 PCIe同源时钟Buffer电路设计与调试要点 前段时间调试一块基于 RK3588 的底板NVMe 硬盘在系统里时有时无。刚开始所有人都在怀疑焊接和电源引脚虚焊、3.3V 纹波超标、PCIe 金手指接触不良排查一圈全都没发现问题。最后用示波器量到 PCIe 参考时钟才发现问题出在一个特别不起眼的器件上——100MHz 同源时钟 buffer。在原理图上这颗 buffer 往往只有三四个引脚需要连线输入一个时钟输出几个时钟看起来比一颗 LDO 还简单。但如果画得不对它会让整个 PCIe 链路经常性训练失败甚至让设备在系统启动后直接从总线上消失。这个经历让我意识到PCIe 同源时钟 buffer 电路图真正的难点不是“画得出来”而是能不能把时钟路径设计成一套稳定、可复用、可排查的电路。这篇文章就从“为什么要用同源时钟”“原理图怎么画”“哪些细节容易翻车”“Layout 怎么保护时钟”“上电后怎么排查”这几个角度展开。如果你也在做 RK3588 板卡或者正在画任何 PCIe 3.0 接口的外围电路这一篇应该能帮你省掉几轮改版。1. 同源时钟不是“一颗 buffer”的电路而是一整套时钟完整性决策很多人画同源时钟 buffer 时第一反应是输入一个 100MHz 差分时钟输出两路或四路一样的时钟然后 RK3588 取一路PCIe 设备取一路电路就完成了。这个理解没有错但只是最表面的功能。真正要搞清楚的是为什么 PCIe 在这类嵌入式板卡上倾向于用同源时钟以及 buffer 在整个时钟树里到底扮演什么角色。1.1 先搞清楚 PCIe 参考时钟的两种接法PCIe 的参考时钟频率通常是 100MHzRCRoot Complex和 EPEndpoint都要基于这个频率进行数据收发和链路训练。但在实际电路上RC 和 EP 不一定非要共用同一个时钟源这里有两条路线独立参考时钟RC 和 EP 各自使用独立的 100MHz 时钟源。优点是布局灵活两边可以离得很远互不牵制缺点是两边频率和相位天然存在误差链路训练时必须通过协议层面的机制去补偿设计复杂度更高。同源参考时钟RC 和 EP 的 100MHz 参考时钟来自同一个源头通常是一颗差分晶振产生基准再经过时钟 buffer 扇出到各个接收端。两边频率完全一致相位偏差只来自 Buffer 输出到各负载的走线长度链路设计相对简单也是很多 SoC 板卡的常用方式。在同源时钟模式下时钟 buffer 的作用不是“创造”一个低抖动时钟而是将一颗高精度时钟源的信号分成多路并且保证每一路都能达到 PCIe 接收端需要的电平标准、摆幅和抖动要求。1.2 RK3588 的 PCIe 时钟拓扑为什么常用同源方式RK3588 作为瑞芯微的旗舰 SoC通常会提供多个 PCIe 控制器常见场景包括 PCIe3.0 x4 接 NVMe 硬盘、PCIe3.0 x2 接 M.2 接口或万兆网卡甚至通过 PCIe 交换机扩展更多设备。不同板卡的具体管脚定义和控制器数量不完全一样但有一个共同点板子上往往同时存在多个 PCIe 负载。如果每个 PCIe 设备都放一颗独立 100MHz 晶振首先是成本上升其次是链路训练时频率差会变成不确定因素。尤其是在嵌入式系统里PCB 面积有限器件密度高多放一颗晶振就多一个谐波干扰源。因此比较常见的做法是一颗高精度 100MHz 差分晶振产生基准时钟然后通过时钟 buffer 输出多路参考时钟分别送到 SoC 的 PCIe refclk 引脚、M.2 插槽、PCIe 交换机或网卡 PHY。这种拓扑就是典型的同源时钟方案。RK3588 的硬件设计参考中也能看到类似的时钟树结构。它解决的问题表面上是“把一路时钟分成几路”更深层的问题则是“让所有 PCIe 设备在同一个时间基准下工作减少链路训练中的不确定性”。1.3 同源时钟 buffer 的真实作用边界这里要明确一个容易被忽略的边界buffer 不是净化器它不能把坏时钟变好。如果输入端那颗 100MHz 晶振本身的抖动已经超标buffer 只会把抖动跟着传播出去甚至叠加自己的附加抖动。反过来如果输入端时钟足够干净而 buffer 的输出端接、走线、供电没做好抖动和反射也会在输出端被放大。所以画 buffer 电路图时你要做的不是“把芯片连起来”而是为时钟信号搭建一条从源头到接收端的完整通道。每个电阻、电容、磁珠的位置都会影响最终到达 PCIe 控制器或设备引脚的时钟质量。这也是我把同源时钟 buffer 称为“时钟完整性决策”而不是“一个电路模块”的原因。2. 原理图绘制把“时钟树”画成一块可复用电路原理图阶段主要工作包括四块选型、建库、接线、留调试余量。很多人拿到一个现成原理图就直接复制结果板子做回来发现信号质量不对很难定位是芯片选型问题还是外围电路问题。2.1 选型前先确认四个参数时钟 buffer 的选型不能只看“输出几路”还要确认以下四点电平标准PCIe 参考时钟常见的是 HCSL 电平但也有些 buffer 采用 LVDS、LVPECL 或 LVCMOS 版本。RK3588 的 PCIe refclk 输入电平要求必须以官方手册为准选型时不能只看封装兼容。扇出数量1 路输入到 2 路输出、还是 1 路输入到 4 路输出取决于你的时钟树里有多少个接收端。不要为了将来扩展预留过多路数未使用的输出端处理起来也是额外工作。附加抖动PCIe 3.0 对参考时钟的相位抖动有明确要求不同 buffer 的附加抖动差异很大。选型时优先选择数据手册中给出 PCIe 应用场景参数的器件而不是只看“低抖动”三个字。展频时钟支持PCIe 允许参考时钟带有 SSC展频时钟用来降低 EMI。但如果你的系统不打算开启展频这选项可以忽略如果其他设备需要展开展频buffer 必须能透传这种时钟特征。选型时另一个实用技巧是优先看瑞芯微官方硬件设计指南或核心板参考原理图里用过的 buffer 型号。不是说要完全照抄而是参考设计里的型号往往已经验证过和 RK3588 PCIe PHY 的兼容性能省掉很多前期风险。不过参考设计也可能有版本差异正式量产前还是要核对最新芯片手册。2.2 不要让原理图库成为“只有自己看得懂”的符号画原理图前先给 buffer 建一个完整的原理图符号。很多工程师习惯从立创商城或厂商官网直接下载现成符号这没问题但要注意核对引脚定义尤其是电源脚和地脚容易漏。一个完整的时钟 buffer 符号至少要包含以下几类引脚电源输入引脚常见 1.8V 或 3.3V取决于芯片。接地引脚所有地脚都必须连接到 GND不能只画一个 symbol 就以为接好了。差分时钟输入引脚通常是 CLKP 和 CLKN或 INP 和 INN。差分时钟输出引脚每一路输出都有一对正负引脚。使能引脚EN 或 OE决定时钟输出是否有效。务必核对buffer 的输入和输出是否都是差分对。有些低成本的时钟 buffer 输出是单端时钟虽然成本低但在 PCIe 场景下往往难以满足链路要求。2.3 输入侧电路AC 耦合电容、直流偏置和串阻输入侧最常见的接法是从 100MHz 差分晶振输出到 buffer 输入端中间串一颗 AC 耦合电容常见容值是 0.1μF。这个电容的作用是隔断直流偏置让 buffer 依靠自己的输入级建立合适的工作点。但 AC 耦合电容不是随便放上去就完事有几个问题要想清楚容值大小0.1μF 是常见选择但具体值要结合参考时钟的频率和 buffer 输入阻抗确认。频率是 100MHz0.1μF 的阻抗很低对信号衰减很小但在某些低功耗 buffer 上输入偏置电流很小时耦合电容过小会导致低频噪声增加。是否预留直通电阻如果晶振输出和 buffer 输入都是同一个直流电平体系可以直接用 0 欧电阻短接。设计时最好在 PCB 上预留 0 欧位置方便调试时切换 AC 耦合和 DC 耦合模式。是否需要串阻如果晶振和 buffer 距离较远输入走线会产生反射可以在源端预留一颗串联电阻常见十几到几十欧姆具体数值通过仿真或实测调整。2.4 输出侧电路端接、负载与测试点输出侧是问题最多的地方。很多人把 buffer 输出直接拉到连接器或 SoC中间什么都不放结果发现信号上升沿变缓、振铃严重链路训练只能停在 Gen1。常用 HCSL 电平的 buffer 输出需要一个外部端接网络。典型结构是每个输出引脚到地接 50 欧姆而不是在差分对之间直接跨一个 100 欧姆。原因是 HCSL 输出级是电流源驱动需要每根线对地提供直流回路。如果 buffer 内部已经集成端接原理图上就不需要再重复画但必须和数据手册核对清楚。除了端接还建议在每一路输出靠近接收端的位置预留测试点。这个测试点不是为了量产而是为了调试时不用把示波器探头戳在 BGA 引脚上。实际工作中PCIe 参考时钟只有 100MHz但上升沿很陡如果用普通示波器探头直接点到差分走线探头寄生电容本身就足以改变波形。预留测试点并使用差分探头才能得到真实信号。2.5 电源和使能的隐性要求时钟 buffer 的供电设计经常被当成普通数字电源处理。实际上电源噪声会直接叠加在时钟输出上因此原理图阶段就要为每个供电引脚加滤波。常见做法是电源输入先经过一个磁珠再接到 buffer 电源脚旁边放一组旁路电容。电容组合通常包括 0.1μF 高速去耦电容和 1μF 或 2.2μF 储能电容。如果 datasheet 里明确给出了滤波电路直接照用它推荐的组合不要自行删减。使能引脚同样不能忽略。EN 脚不能悬空需要接一个明确的上拉或下拉电阻避免在电源上电过程中被噪声误触发。如果 RK3588 有对应的 GPIO 控制这个使能脚还要确认 GPIO 的电平和 buffer EN 的高电平阈值匹配。更稳妥的做法是在 EN 和 GPIO 之间串一颗 10kΩ 电阻防止电平冲突。注意不要只在原理图里画“一个磁珠一个电容”就认为电源设计完成。时钟 buffer 对电源噪声的敏感程度远超普通逻辑芯片滤波组合要按芯片手册推荐来。3. 最容易翻车的几个细节从贴片到上电容易忽略的点原理图画完并不代表电路没问题。有几类问题在画图时往往看不出来直到样板贴片、上电调试时才暴露。3.1 输出端接了端接电阻不是随便接一颗很多原理图里能看到差分对之间放一个 100 欧姆电阻就以为完成了差分端接。但在 HCSL 时钟 buffer 里这种接法可能是错的。HCSL 输出通常是一个电流源结构外部必须在每一根输出线上提供到地的直流路径。正确的端接是两个 50 欧姆电阻分别接到地而不是在两个差分线之间接 100 欧姆。如果 buffer 是 LVDS 输出则常见接法是差分对之间接 100 欧姆。两种电平标准不能混用。也就是说画端接电路之前必须先确认 buffer 的输出电平标准是哪一种再决定端接电阻的形式。一个稳妥的处理方式原理图里按芯片手册推荐画好固定端接同时在每个端接电阻旁预留 0 欧或 NC 位万一调试时发现需要调整不用立刻改版。3.2 AC 耦合电容的位置不能随意换PCIe 参考时钟路径上的 AC 耦合电容常见做法是靠近接收端放置。这样做的原因是发射端输出的直流偏置由自己决定耦合电容靠近接收端后接收端输入端的直流偏置由接收端自己建立对信号完整性更友好。如果你不小心把耦合电容放到了源端而接收端有特殊的输入共模要求就可能出现共模电压不匹配导致接收端采样点偏移。画图时建议在原理图注释里直接标注“此电容靠近 receiver 端放置”Layout 阶段才不会放反。另外耦合电容的容差和封装也有影响。小封装电容在高频下自谐振点更高但耐压和容值稳定性会受限。常用 0402 封装 0.1μF 在 100MHz 时钟下表现不错但如果 buffer 源端输出能力有限可能需要适当减小容值。具体以实测波形为准。3.3 展频时钟的潜在坑PCIe 规范允许参考时钟带有展频常见展频比例是 -0.5% 或 -0.25%目的是把能量分散在更宽频带上降低 EMI。但如果同源时钟树里的 buffer 不支持展频或者展频参数设置不当会导致链路的参考时钟频率持续变化PCIe PHY 的 CDR时钟数据恢复跟不上频率变化就可能出现“启动时正常运行一段时间后掉链子”的奇怪问题。所以画图前要想清楚这颗 buffer 所在的时钟树是否要支持 SSC。如果不支持晶振本身就不要配置成展开展频模式如果支持要确认 buffer 在整个展频频偏范围内输出抖动仍然满足要求。很多 RK3588 板卡会关闭展频因为板级 EMI 已经通过屏蔽罩和 layout 控制住了。展频只是一个额外的降 EMI 手段并不一定要开。3.4 使能时序与电源上电顺序时钟 buffer 的 EN 引脚本身上升沿不能和电源上升沿靠得太近否则可能出现芯片内部逻辑未复位、输出状态不确定的问题。如果 RK3588 的 GPIO 和 PCIe 电源轨是同步上电的GPIO 输出有效之前可能有一段高阻或随机状态EN 脚必须外接电阻固定默认电平。我的建议是如果系统里没有明确要求 buffer 需要分时启动就把 EN 引脚通过一个 10kΩ 电阻上拉到电源让 buffer 一直处于使能状态。这样电源稳定后时钟就稳定链路训练不会因为 EN 晚到而多等一段不确定时间。如果一定要用 GPIO 控制务必确认 GPIO 在 SoC 初始化前不会出现瞬时高电平。4. Layout 阶段如何保住同源时钟的完整性原理图画好只能说明电路在纸面上是通的。PCIe 3.0 的速率已经到 8GT/s参考时钟虽然只有 100MHz但谐波频段很宽Layout 做不好时钟信号照样会劣化到无法使用。4.1 走线拓扑两路负载尽量对称同源时钟 buffer 输出到 RK3588 和 PCIe 设备时从 buffer 出来就是两路独立的差分对。Buffer 应尽量靠近负载的中间位置让两路输出走线长度接近而不是一路特别长、一路特别短。如果系统里是“一颗 buffer 输出给 RK3588 和 M.2 插槽”最好让 buffer 放在 SoC 和 M.2 插槽之间不要放在离 SoC 很近却离 M.2 很远的位置。时钟偏斜不是绝对不能用但过大的偏斜会给链路训练增加不确定性。4.2 等长控制与绝对走线长度差分对内等长是 PCIe 时钟走线的常规要求。常见经验值是差分对内长度差控制在 5mil 以内这个值越紧越好因为参考时钟的上升沿很短哪怕几十 mil 的长度差也会在接收端形成共模到差模的转换。不过比等长更重要的是绝对走线长度。许多工程师只关注等长却忘记了 buffer 输出到接收端如果走了十几厘米带来的传输线损耗和参考平面不连续会远超等长误差。对于 100MHz 参考时钟尽量把走线长度控制在 3 英寸以内特殊情况可以放宽但越长越需要仿真验证。4.3 参考平面与换层规则差分时钟走线下方必须有一个完整的地平面。不要跨越电源平面分割区也不要在走线下方穿过任何磁珠或高频开关节点。如果必须在走线过程中换层建议在换层过孔旁边加一个回流地孔并且这对差分信号要同时换层避免形成不必要的环路。还有一些细节容易被忽略时钟差分线两侧的地铜皮最好连续必要时可以包地保护但包地时要避免在时钟差分线两边形成一根“伪差分”的参考走线那样反而会引入额外串扰。4.4 与其他信号的物理隔离RK3588 板卡上往往同时存在 USB、HDMI、MIPI、以太网甚至射频信号。PCIe 参考时钟走线应该与这些高速信号保持足够距离。一个可参考的规则是差分时钟线与相邻其他信号线间距保持至少 3 倍线宽如果是高速 USB 或 HDMI 线间距应该更大。如果板子空间紧张可以在时钟线两侧走地铜皮但地铜皮必须密集打过孔连接不能只是浮铜。从我自己实际调试经验看时钟 buffer 输入/输出走线如果和 DC-DC 的 SW 节点靠得太近示波器上能看到明显的开关噪声叠加在时钟波形上这种问题在原理图阶段很难发现。5. 上电调试从“Link Training 失败”反推时钟链路问题板子贴片回来后最先遇到的问题通常不是“时钟没输出”而是“设备识别不到”或“速率只有 Gen1”。这个阶段需要一套系统的排查顺序而不是靠运气反复焊接。5.1 常见现象与对应怀疑点先看现象再定位层次现象可能原因NVMe / PCIe 设备完全识别不到参考时钟没有输出、供电异常、链路训练失败、差分对接反设备能识别但速率只有 Gen1时钟抖动过大、信号完整性差、PCIe 插槽接触不良设备偶尔消失、跑压力测试掉盘电源纹波、时钟偶发中断、buffer 使能时序不稳定设备只能在一个 PCIe 槽位工作换槽不行某一两路 buffer 输出有问题或对应走线质量差关键点不要一上来就怀疑 RK3588 的 PCIe 控制器。先确认参考时钟链路是否正常因为时钟是链路训练的前提没有时钟所有链路训练都是空谈。5.2 排查链路先量时钟再查供电再看信号我的建议排查顺序是量 buffer 输入时钟确认 100MHz 差分晶振输出是否正常。用示波器带宽至少 500MHz最好用差分探头在 buffer 输入引脚附近测量。注意不要直接用探头地夹夹到引脚上容易形成地环路。量 buffer 供电确认 buffer 电源电压在手册允许范围内纹波不要超过 datasheet 要求。如果电源纹波大先处理电源再继续往下查。量 EN 引脚确认使能电平正确。如果 EN 引脚应该为高实际为低buffer 输出自然关闭。量 buffer 输出在输出到 SoC 的路径上测量。确认波形幅度、上升沿、过冲是否合理。如果输出端接了错误的端接电阻波形会很难看。量到连接器的输出如果 PCIe 设备是 M.2 插槽还要在插槽附近测量参考时钟因为插槽引脚处的波形才是设备真正看到的波形。软件侧确认链路状态在 Linux 下用lspci查看设备是否枚举用lspci -vvv查看 LnkSta 和 LnkCap。如果链路只训练到 Gen1而设备和控制器都支持 Gen3基本可以判定为信号完整性问题参考时钟是重点怀疑对象。5.3 用示波器和差分探头判断时钟是否合格没有差分探头时很多人习惯用普通探头分别点 CLKP 和 CLKN然后看两个波形。这个方法只能判断有没有时钟不能准确判断差分信号质量。PCIe 参考时钟差分摆幅通常只有几百毫伏普通探头容易引入共模噪声得到的波形可能误导判断。如果条件允许至少用一支有源差分探头测量。观察以下指标差分过零是否清晰过零抖动大说明上升沿不稳定。输出摆幅是否足够低于接收端最低电平要求链路无法正常工作。有没有明显振铃振铃严重可能来自端接不匹配或走线阻抗不连续。有没有周期性包络如果看到 100MHz 时钟上叠加低频包络先检查电源滤波。如果设备速率只有 Gen1但时钟波形看着正常可以先尝试把设备树里的 max-link-speed 保持默认再检查 PCIe 金手指附近的串阻、AC 耦合电容值是否和原理图一致。5.4 软件层确认设备树与链路状态RK3588 在 Linux 下使用 PCIe 控制器时设备树里会配置相关节点。常见问题包括设备树里 PCIe 节点被 disable 或 status 设置错误导致控制器根本没有使能。PHY 或 refclk 的时钟源配置不对控制器没有获得正确的参考时钟。某些核心板需要额外配置 GPIO 控制 PCIe 设备复位如果复位一直拉低设备无法完成链路训练。在 dmesg 里看到类似pcieport相关报错时要先确认这些节点是否使能。很多“硬件问题”实际上是软件初始化顺序导致电源和时钟还没稳定就尝试去枚举设备。值得提醒的是RK3588 的 PCIe 控制器具体节点名称、PHY 名和时钟源配置不同版本内核和 BSP 不一样。不要照搬别人设备树里的配置一定要先看自己手上核心板和内核版本对应的默认设备树。5.5 仿真验证IBIS 模型与 SI 仿真如果调了好几天还是有问题就需要回到仿真层面。时钟 buffer 厂商通常提供 IBIS 或 IBIS-AMI 模型可以用 SI 仿真工具对 buffer 输出到 RK3588 refclk 的路径做一次时域反射仿真。仿真要关注三件事走线阻抗是否连续。端接电阻是否匹配。接收端引脚处的波形是否达到芯片手册要求。仿真不能完全替代实测但能在改版前暴露明显问题。尤其当 layout 阶段因为空间限制压缩了时钟线间距或加长了走线时仿真会更加有价值。实操建议第一次做 RK3588 底板时如果物料成本允许可以在 buffer 输出端预留 0 欧串阻、AC 耦合电容镜像位、端接调整电阻位。这些预留位置会增加一点点 BOM 成本但能把调试周期缩短一半。6. 把一次画图经验沉淀成可复用的设计资产单板调试通过后大多数人会松一口气然后直接进入下一块板子的设计。但硬件设计真正值钱的地方恰恰是把这次踩坑记录下来变成下一个项目可以直接复用的电路块和检查清单。6.1 先跑通最小原理图块再复制到多路负载如果是第一次在 RK3588 上做 PCIe 同源时钟不要一上来就画“一颗 buffer 输出四路”的完整时钟树。更稳妥的方式是先在评估板上验证最小系统一颗晶振、一颗 buffer、一路输出到 RK3588一路输出到 M.2 插槽。这个最小系统跑通后再扩展第二路、第三路。因为每一路输出都是一个独立的信号通道多一路就多一分不确定因素。如果第一路已经正常第二路出问题你就能很明确地把怀疑范围缩小到第二路输出对应的端接、走线或连接器部分。6.2 整理一份“开发板时钟树速查表”很多项目出问题不是因为别人能力不足而是因为当时并不知道这个 SoC 的时钟树是怎么连的。可以在项目文档里维护一张速查表内容包括100MHz 晶振的具体型号、精度、负载电容。buffer 型号、电平标准、扇出路数、电源滤波结构。每一路输出分别连接到哪个 PCIe 控制器或设备。每个 PCIe 插槽对应的 refclk 有没有 AC 耦合电容、端接方式。使能脚接的是固定电平还是 GPIOGPIO 所在的电源域是什么。这张表不需要很漂亮但一定要在原理图评审、layout 评审、板卡调试三个阶段反复对照。很多问题只要你把表格上每一项都确认到位自然就排除了。6.3 版本化与评审清单原理图库、PCB 封装、参考设计文件都应该纳入版本管理。不要用“最终版”“最终版2”这种文件命名建议用日期和版本号。每次改版后评审清单里至少要有以下几项Buffer 输入、输出电平标准和 RK3588/PCIe 设备是否匹配。输出端接是否按 datasheet 要求绘制是否重复放置了内部端接。AC 耦合电容的位置是否符合“靠近接收端”的要求。电源脚的滤波电容是否满足手册推荐值。EN 引脚是否有明确的上拉/下拉是否与上电时序冲突。Layout 是否保证差分线等长、参考平面完整、远离高速信号和 DC-DC。这些内容看起来像是“常识”但实际项目里经常出现问题。根源不是工程师不懂而是每一步都觉得自己只是“碰巧改了一小点”结果几个小点叠加在一起整个时钟链路就变了。回到最开始那颗时有时无的 NVMe 硬盘。问题最终定位在 buffer 输出到 M.2 插槽这一段少放了一颗 0 欧串阻端接地方的焊盘也贴错了阻值。原理图看起来和参考设计几乎一样但少的就是那一串“细节上的工程判断”。同源时钟 buffer 电路图绘制本质上不是一次“连线操作”而是一次对时钟路径、信号完整性、电源滤波、layout 约束和调试策略的完整设计。真正的价值也不是那一张原理图而是这套可以被下一个 RK3588 项目反复使用的设计流程。拿到一块新板子时先画好时钟树速查表再动手画原理图画完原理图先做评审再进入 layout样板贴片后先量 clock再查电源和信号。按照这个顺序做绝大多数 PCIe 参考时钟问题都能在一天内定位到根因。
返回列表