PCIe Switch调试实录:boot引脚配置错误导致串口无输出的排查与解决

发布时间:2026/10/3 10:05:12
PCIe Switch调试实录:boot引脚配置错误导致串口无输出的排查与解决 做硬件这行最怕的不是芯片烧了、板子冒烟而是你按完上电键所有电源灯全亮、示波器上100MHz时钟也工工整整PCIe Gen4 Switch芯片PM40028的串口却一个字节都不往外吐。你在串口调试助手里反复开关波特率、换USB口、换线屏幕上还是空白一片。这时候十有八九不是串口故障而是芯片压根就没走到初始化UART那一步而boot引脚设置错误就是这类“沉默故障”里最容易被忽略、也最容易让人原地转圈的元凶。这篇文章围绕PM40028这个PCIe Gen4 Switch芯片详细梳理我从boot引脚设置到串口无输出这个“诡异问题”里踩出来的一串坑和排查方法适合正在做Switch板级调试、或者头一回接触PCIe外设芯片启动流程的硬件和嵌入式工程师参考。1. 这块PM40028到底是什么为什么调试它第一件事是看串口1.1 先把概念说清楚PCIe Switch是干什么的为什么它有“自己的灵魂”PM40028这名字对老玩家不陌生属于PCIe Gen4时代的Switch芯片。简单来说Switch在PCIe体系里的角色相当于一个“立交桥”上行口接CPU或者Root Complex下行口接各种Endpoint设备比如NVMe硬盘、GPU、网卡、AI加速卡。服务器里硬盘位不够、想在一台机器上挂多张加速卡或者想把CPU有限的PCIe通道拆分给不同设备基本都靠Switch来完成“一进多出”。Gen4时代单通道速率是16GT/s相比Gen3直接翻倍x16上行在单向方向上能跑出大约31.5GB/s的理论带宽双向就是63GB/s左右。这个数字听着就明白为什么数据中心和高端工控领域都愿意在系统里塞一颗这样的芯片。但很多人对PCIe Switch有个误解以为它只是转接分发信号的“无源器件”。实际上PM40028这类现代PCIe Switch内部是带管理控制器和固件的。上电后它不只是把信号透传而是要完成内部端口初始化和链路训练把上行下行各个端口的路由表建好甚至还要处理热插拔、错误上报、电源管理这些事情。换句话说这颗芯片本身就是一个“小系统”它有固件、有启动流程、有配置来源。所以调试它的时候你面对的不是一个简单的信号通路而是一个需要在启动阶段“活过来”的微型电脑。1.2 串口日志就是芯片的“生命体征”没有它一切免谈既然是带固件的芯片PM40028这类器件通常都会留一个UART调试口用来输出启动日志、寄存器状态、错误信息。这就像你给一台电脑装系统如果显示器完全不亮你基本没法判断是内存坏了、硬盘没引导、还是供电出了问题。串口日志是芯片在没有图形界面、没有网络连接的情况下唯一能主动跟你“说话”的通道。调试这块板子的第一个里程碑就是让串口顺畅地吐出完整的启动日志。我在拿到PM40028的调试板时第一步做的就是接好USB转串口线打开串口调试助手设好波特率然后上电。预期中应该是看到固件版本、端口初始化、链路训练等一串信息刷刷刷往外冒。结果屏幕上干干净净一个字符都没有。当时第一反应是“是不是串口参数没设对”换了波特率、换了软件、换了USB口依旧没有。这种时候最折磨人的不是问题难而是完全没有任何线索你不知道芯片是死是活不知道它是在启动前期就重启了还是卡在某个异常状态甚至连它有没有开始执行固件都无从判断。最后排查下来问题的根源还真不是串口本身而是boot引脚设置把芯片带进了一个“永远无法正常启动”的模式。2. boot引脚芯片上电那一下就读完的“命运开关”2.1 strap pin的工作机制为什么上电瞬间决定一切boot引脚在很多芯片里也叫strap pin中文说法五花八门拉带、硬连接、配置脚都有。它的工作机制非常特殊不是在运行期间持续检测输入电平而是在芯片上电复位的过程中由芯片内部逻辑在一个很短的窗口内采样这些引脚的电平把结果锁存到内部寄存器里之后整个运行阶段都按照这个锁存值来执行。你可以把strap pin想象成公司门口的闸机刷卡只在上电那一刻刷一次之后整天都以这张卡为准你中途再怎么改票都没用必须重新刷卡。这带来一个特别坑的后果你改了boot引脚的外接电阻、跳线、拨码开关如果不重新上电芯片依然沿用旧值等于白改。而且更隐蔽的问题是既然是在“很短的时间窗口”内采样那么采样发生时引脚电平必须是干净、稳定、确定的。如果因为上下拉电阻阻值选得不对、引脚悬空、或者被旁边信号串扰导致采样窗口内电平恰恰处于高低阈值之间的模糊地带芯片就会“随机”读到一个值。同一批板子可能这块读到0那块读到1表现为两块板卡表现完全不一样这种问题调试起来非常折磨人。2.2 PM40028这类芯片的boot引脚到底在配置什么不同厂家的PCIe Switchstrap引脚的分配和含义会有差异但总体思路差不多。我在PM40028上重点关注过几类配置这里列出来大家拿到其他型号也可以按这个框架去查数据手册。第一类是启动源选择。这是最关键的一项决定芯片从哪里加载初始化配置。通常有三种渠道内部ROM里的默认配置、外部SPI Flash、外部SMBus/I2C总线上的EEPROM或者其他控制器。如果这个引脚被配置成从外部Flash启动而板子上根本没贴Flash、或者Flash是空的芯片就会卡在加载阶段表现就是串口没有任何输出。第二类是端口拆分配置也就是bifurcation。x16上行端口要拆成x4x4x4x4还是x8x8甚至x4x4x8这种不对称组合通常也依赖strap引脚在复位时决定。这个配置错了芯片依然能启动、串口也会有日志但链路训练会出问题设备在这个端口下根本枚举不起来。第三类是SMBus地址和访问模式。如果芯片允许外部控制器通过SMBus去改配置上电时它会先分配一个总线地址而这个地址就是由几个strap引脚组合出来的。这个配置如果和板上其他SMBus设备冲突了后面调试寄存器时你会发现怎么都访问不到目标设备。第四类是参考时钟模式。PCIe系统一般要求Switch的参考时钟与Root Complex同源或者至少要满足SSC扩频一致。某些芯片允许通过strap选择内部时钟发生器还是外部参考时钟这个选错Link直接起不来甚至串口日志里会反复报链路失败。对于PM40028我在最初的调试阶段最担心的就是第一类启动源配置。因为在它的启动流程里UART初始化和输出日志这个动作排在固件加载流程的中后段。如果启动源指向了一个不存在或者不可读的存储器芯片会一直卡在前面根本轮不到执行UART输出。这时候从外部看芯片有供电、有时钟、复位也释放了但就是一个字都不吐。3. 串口无输出的完整排查路线别一上来就怀疑boot引脚3.1 第一层先把串口链路本身的低级错误全部排除遇到串口无输出我现在的第一反应已经变成了“先怀疑自己再怀疑芯片”。永远不要高估自己接线的靠谱程度。USB转串口线最常见的坑就是收发电平没有交叉板上UART的TX应该接USB转串口工具的RXRX接TX很多人想当然两头直连结果收不到任何数据。有些板子的串口不是标准3.3V TTL电平可能是1.8V甚至板级接成了RS232电平你的USB转串口工具只支持TTL或者反过来都会造成完全无输出。还有一种很细节的情况串口调试助手这类软件打开端口时会自动控制DTR和RTS信号如果板子设计时把RTS误接到了复位脚或者某个使能脚上你会发现只要一连上调试助手芯片就被强制复位自然什么都看不到。再往下就是驱动层的检查。CH340、CP2102、FT232这几类USB转串口芯片我都遇到过驱动没装好或者被系统自动更新搞挂的情况。在Windows下如果设备管理器里能看到COM口却一直报“无法打开端口”大概率是驱动和系统不匹配在Linux下则是检查有没有生成/dev/ttyUSB0如果没有先看看dmesg里有没有ch341、cp210x的枚举信息。另外波特率也必须确认虽然绝大多数芯片默认是115200 8N1但保不齐有厂商默认用38400或者57600波特率不对时可能表现为满屏乱码也可能因为帧同步问题直接看不到东西。这一步看着基础但我见过太多人在后两级排查了半天最后发现就是线接错了。3.2 第二层确认芯片的基本工作条件电源时钟复位一个都不能少串口链路排除干净之后就要把示波器和万用表拿出来了。芯片要跑起来基本条件就是电源、时钟、复位这三件事。PM40028这种PCIe Switch芯片电源轨一般不止一路核心电压、IO电压、模拟电压、SerDes电源分得很细。量电压不能只看“有没有”还要看电压值在不在规格书允许的范围内以及纹波是否太大。有些电源轨的启动顺序也有讲究如果时序不对芯片可能处于一种不上不下的状态看起来电压都在但内部逻辑没有正常启动。时钟方面PCIe Switch的参考时钟通常是100MHz差分对。用示波器测量时要看波形幅度和频点对不对有些板子设计上允许选择外部Refclk还是板载晶振如果这个选择的电阻没贴或者贴错了芯片就变成“没有心跳”的状态。复位信号也不能只确认是高还是低要看完整时序。PCIe系统里PERST#这个复位信号要求在所有电源稳定之后再释放而且从电源稳定到PERST#释放之间通常要留足时间可能是几十毫秒甚至上百毫秒。如果板子的复位控制电路在上电瞬间产生了一个“毛刺”或者释放太快芯片可能还没准备好就被启动导致后面行为异常。我当时拿示波器抓了PM40028的电源时序和PERST#上升沿确认这些都符合要求后才把怀疑重点转向boot引脚。3.3 第三层确认启动模式这才是boot引脚真正发威的地方基本工作条件没问题串口链路也没问题那么串口仍然沉默就基本可以把目光锁定在芯片的启动流程了。这时候要做的第一件事就是拿出数据手册找到启动源选择的strap引脚定义然后对照原理图逐一确认这些引脚在上电采样时刻的实际电平。注意是“采样时刻的实际电平”不是你看现在的电平。有些板子为了方便调试会给boot引脚接上拉或者下拉排阻然后用跳线帽去覆盖这个设计本身没什么问题问题出在如果你测量时芯片已经处于运行状态引脚上可能被芯片内部驱动拉到了别的电平你量出来的是芯片“运行后”的值而不是“复位采样时”的值很容易误判。我在PM40028的调试中就遇到过一个非常误导人的情况用万用表量某个boot引脚的直流电平量出来是高逻辑上也判断它应该被拉到高但芯片启动后串口仍然没有输出。直到后来用逻辑分析仪抓复位释放瞬间的波形才发现这个引脚在采样窗口内根本不是稳定的高电平而是有一个明显的下拉毛刺恰好在芯片采样时被判成了低。这个问题的根源就是后面要详细讲的“看着对其实不对”的典型场景。4. 最诡异的一次boot引脚电平“看着对”芯片就是不干活4.1 现场还原六块板卡四块正常两块沉默这次问题最让人抓狂的地方在于它不是一整批板子全部失败而是同一批焊接出来的六块板子四块一上电就能正常从串口输出启动日志剩下两块死活不出字。我把四块正常板子的串口日志抓下来对比启动过程完全一致固件版本、端口初始化、链路训练都正常。那一瞬间我脑子里冒出来的第一个念头是“芯片批次有问题”或者“这两块板子焊接时有虚焊”。但芯片是同一批次买的焊接工艺也不至于在六块板子里挑出两块来出问题这就说明大概率是某种“不稳定”的因素。先检查两块沉默板子的电源把示波器探头挨个电源轨量了一遍纹波、电压值都正常。再量100MHz参考时钟波形也漂亮。PERST#复位时序反复上电几十次每一次都很干净。到这里基本条件全过我开始怀疑是芯片没有走到UART初始化这一步而决定这一步的就是启动源配置。回头翻原理图发现启动源选择对应的几个strap引脚上设计上用了一个10k电阻上拉到高电平作为默认值同时留了0欧电阻位可以根据需要再接下拉。这种做法在原理图里很常见用一个弱上拉保底再用跳线或者0欧电阻去改变默认配置。正常来说10k上拉加上芯片内部的弱下拉分压之后应该能稳定读出高电平。但偏偏问题就出在这个“应该”上。4.2 真凶采样窗口内的电平“翻车”阻值太大惹的祸为了搞清楚那两块沉默板子到底读到了什么我把逻辑分析仪接到了strap引脚的采样点触发条件设为PERST#释放边沿连续上电抓波形。结果发现在PERST#释放前的那一小段采样窗口里本应该被拉到高电平的strap引脚电平并不是稳稳的3.3V而是先抬升到一个临界电压然后出现了一段几十纳秒的下凹最深处已经降到了阈值以下。也就是说芯片在这个瞬间读到了一个“低”启动源就被判定成了另一个模式芯片开始尝试从一个根本没有挂载的存储介质去加载固件然后卡死。万用表量到的是稳态高电平但芯片看到的是采样瞬间的毛刺这就是“看着对其实不对”的本质。为什么会下凹我分析下来有几个原因叠加。一是上拉电阻阻值选得偏大10k对于这种采样电流微安级的输入来说其实也能用但它的抗干扰能力弱一旦旁边有信号翻转通过寄生电容耦合过来的噪声很容易把脆弱的弱上拉电平拽下去。二是这个strap引脚正好走线很长在PCB上绕了大半个板子一路经过了几组高速差分对附近上电时那些高速信号还没稳定但电源轨建立过程中产生的dv/dt噪声依然能通过耦合干扰到这根走线上。三是采样窗口又恰好处在了其他电源轨建立跳变的时段噪声叠加效应被放大。四块正常板子和两块沉默板子的区别可能只是PCB制造过程中走线阻抗或者寄生电容的细微差异导致抗扰能力有差别。这个问题最后的解决办法其实很粗暴把那两个关键strap引脚的上拉电阻从10k直接换成1k。换完之后再上电六块板子全部正常出日志。后来我又做了一次对比故意把其中一块正常板子的上拉电阻换回10k果然它也开始间歇性出现串口无输出的问题。到这里整个问题的根因算是实锤了。这也让我彻底记住了boot引脚上的上下拉电阻不能凭“理论上能读对”就完事必须考虑到噪声容限和采样窗口内的稳定性。能用小阻值就用小阻值能用跳线直接接电源或地就别用高阻默认值。4.3 换一种思路为什么强制“免外部Flash启动”能救急在调整上拉电阻之前我还用过一个临时救急的办法就是想办法让芯片进入“不用外部Flash就能启动”的内部默认模式。PM40028这类芯片一般都会在内部ROM里烧录一份出厂默认配置可以在没有外部EEPROM或者SPI Flash的情况下让芯片先把基本端口跑起来。把对应的boot_mode引脚按数据手册里的定义强制设成这个模式后两块沉默板子居然也能正常从串口输出日志了虽然端口拆分不是最终设计的形态但至少证明芯片本身是好的、串口通路是通的、电源时序是没问题的。这一步对调试非常有价值它能把“芯片是否活过来”和“外部配置是否正确”两个变量拆开。如果连内部默认模式都不能出日志那问题大概率在芯片本身、供电、时钟或者复位如果能出日志那就说明问题出在启动配置、外部存储或者两者的配合上。我后来在调试其他板卡时也养成了习惯遇到PCIe Switch上电完全沉默或者行为诡异第一时间找数据手册里有没有类似的“免配置启动模式”先让芯片裸奔起来再说。这比一开始就去啃复杂的EEPROM镜像是效率高得多的路径。5. 同样让人怀疑人生的几个“次生坑”5.1 SMBus/EEPROM配置模式的“静默等待”串口无输出还有一个非常常见的帮凶就是芯片被配置成从SMBus上的EEPROM读取初始化配置但EEPROM是空的、没贴、或者地址不对。当芯片在启动阶段发出I2C读请求地址后总线上没有任何设备应答有些芯片会不断重试有些芯片会等待一个很长的超时之后才跳过配置过程继续执行后续代码。这个等待期间串口可能没有任何输出也可能只输出一行类似“Loading config from SMBus...”之后就卡住了。从用户角度看就是串口卡在启动的早期后面什么都没了。遇到过最头疼的一个情况是EEPROM里明明烧了配置地址也是对的但芯片依然卡住。最后查出来是EEPROM的写保护引脚没拉对导致芯片上电读取的时候EEPROM虽然存在但数据全是0xFF相当于读了个空。还有个情况是SMBus地址的高位strap引脚和板上另一个器件地址冲突芯片固件尝试去访问一个错误的从机结果总是收到NACK。排查这类问题建议在调试早期就先用“内部默认启动模式”把串口日志跑起来然后再切成SMBus/EEPROM模式确认日志里能明确看到“config loaded”之类字样再继续往下做。别一上来就在一条充满变量的路上走到黑。5.2 改了boot引脚为什么必须整板断电而不是只按复位这个坑我在前面提过一嘴但要单独拿出来说。很多PCIe Switch芯片的strap采样只在特定的复位阶段进行有的芯片是上电复位POR才采样有的在PERST#有效期间也会重新采样。问题在于如果系统里某些电源域在上电后一直保持或者外部的复位按钮只复位了芯片而没有复位电源管理单元那么你改完boot引脚电阻、跳线帽之后只是手动按一下复位键芯片可能仍然沿用旧的锁存配置。你会在调试现场陷入“改了好多次都没用”的循环。墙上电源重拨、彻底断电等几秒钟再上电是这类问题最可靠的解法。如果板子上有多个电源域最好确认所有电源都真正放电完毕再重新上电。我有一次因为贪快只给芯片单独复位了几次愣是花了一下午时间怀疑自己是不是改错了引脚定义最后发现就是没断电导致的。调试工具上如果能给strap相关电源轨加一个放电开关会方便很多。5.3 串口有日志但链路起不来问题已经转移到链路训练阶段了还有一种情况更容易让人误判串口能出日志而且日志里芯片启动过程完整但PCIe链路就是训练不起来系统里搜不到任何下游设备。这种情况严格来说已经不能算“串口无输出”问题了但因为它同样会让板卡看起来“没正常工作”所以经常被混在一起查。典型原因有几个参考时钟的模式和Root Complex不一致SSC扩频配置不对端口拆分配置和实际硬件连接不一致比如你物理上把下行口设计成x8但strap配置成了两个x4导致另一半链路无法建立还有Gen4速率下接收端均衡参数、转接驱动器配置甚至PCB走线质量的问题。这时候就要靠串口日志里的LTSSM状态和链路错误计数器去判断。PM40028的启动日志里会打印每个端口的Link Training状态机状态比如Detect、Polling、Configuration、L0等等从日志里能看到卡在哪个阶段。如果反复卡在Configuration大概率是端口拆分不匹配如果卡在Polling可能是对端根本没有上电或者信号质量太差如果能进入L0但立刻掉链子则要重点查时钟和信号完整性。这种问题需要把串口日志完整抓下来再对照数据手册里的寄存器定义去分析已经不是“复位一下就好了”的级别。6. 问题速查表与常用排查工具6.1 串口无输出/启动异常速查表这一节把前面提到的现象整理成一个速查表调试时可以按图索骥。注意这只是一个优先级的建议不排除多个原因同时存在的情况。故障现象优先排查方向典型原因上电后串口完全无输出串口链路、电源、时钟、复位线序交叉错误、电平不匹配、PERST#释放太快、参考时钟没起来上电后串口完全无输出但基本条件正常boot引脚设置、启动源指向boot引脚电平在采样窗口内不稳定、SPI Flash为空、EEPROM为空或地址错串口输出几行后卡住不动SMBus/EEPROM加载、固件等待外部响应EEPROM读写保护、I2C地址冲突、等待外部控制器配置超时串口有日志但下游链路训练失败端口拆分、参考时钟、SSC配置bifurcation strap设置与硬件不一致、SSC扩频模式不匹配、信号质量差同一批板子部分正常部分不正常strap引脚的抗干扰设计上下拉阻值偏大、走线过长耦合噪声、采样窗口电平落在阈值附近改了boot配置但不生效是否重新整板断电只按了复位键未断电strap锁存值未刷新这个表格我每次给团队做培训都会放出来。不能保证覆盖所有情况但能帮你快速把最常见、最容易解决的问题先排除掉把精力留给真正需要动示波器、逻辑分析仪的疑难杂症。6.2 调这类芯片手边该备哪些工具和命令硬件层面示波器是最基本的至少要有两个通道以上能测电源纹波、时钟波形、复位时序。逻辑分析仪在排查strap引脚采样问题时几乎是刚需最好支持16通道以上采样率不用太高几百兆足够但触发功能一定要好用。能用它同时抓PERST#、多个strap引脚和电源轨的建立时序一眼就能看出采样窗口内谁在捣乱。万用表就不多说了但我要提醒一点量strap引脚稳态电平时要意识到芯片运行后可能已经改变了引脚的状态不能把测量结果直接当作复位采样值。软件层面Windows下用串口调试助手时配置串口参数记得确认一下数据位、停止位、校验位默认的8N1最常用。Linux下我习惯直接用命令行不受图形界面限制。常用命令有# 查看系统识别的USB串口设备 dmesg | grep -i tty ls -l /dev/ttyUSB* # 配置串口参数115200、8N1 stty -F /dev/ttyUSB0 115200 cs8 -cstopb -parenb # 实时查看串口输出 cat /dev/ttyUSB0如果cat /dev/ttyUSB0没有输出可以先用echo发个字符看看有没有回显或者用minicom、picocom这类工具注意关闭硬流控。有时候没输出不是芯片问题而是工具默认开了RTS/CTS流控板子又没有对应的握手信号数据就被工具吞掉了。7. 最后再聊几句调试习惯这次PM40028的调试经历让我养成了几个习惯分享出来也许能帮大家少走弯路。第一拿到新板卡第一件事永远是先让芯片能输出日志。不管是Switch、SoC还是其他带固件的外设芯片串口日志就是它的心跳。如果芯片有一个“免外部配置模式”或者“内部固件默认模式”无条件先切到这个模式跑通基本启动再逐步打开依赖外部配置的功能。第二boot引脚的上下拉设计能直接接电源或者地就用直连必须用电阻时阻值宁小勿大。高阻值虽然省电但在上电采样这种对抗干扰能力要求极高的场合带来的不确定风险远大于那一点功耗节省。第三改完任何strap相关的硬件配置不要只按复位老老实实整板断电几秒再上电这个动作能帮你排除掉一大半“改了没生效”的假象。另外想多说一句调试时不要同时修改变量。很多朋友遇到问题喜欢同时换电阻、改跳线、刷EEPROM结果问题消失了你都不知道是哪个动作把它治好的下次换个板子问题又出现还得重新查。每次只动一个变量验证一次结果记录一次现象慢一点但每一步都是确定的路。做硬件调试最值钱的不是手速是耐心和系统化排查的思维。

关于本文作者

来自尧图内容编辑团队

尧图内容编辑团队 内容团队

尧图内容编辑团队

本文由尧图网络内容编辑团队执笔。团队由资深项目经理、前端工程师与设计师组成,所有内容均来自亲手交付的真实项目,先讲清问题、再给出可落地的解法。尧图深耕北京网站建设十年,服务过京华建材集团、智造科技等各行业客户,把一线经验沉淀为可复用的行业观察。

  • 十年建站经验,覆盖建材、制造、服务、文创等
  • 项目经理把关选题与事实准确性
  • 工程师与设计师联合撰写专业细节
  • 统一编辑规范,保证文风与排版一致
  • 每月复盘转化数据,迭代选题方向

延伸阅读

相关资讯与近期热门内容

深度阅读推荐

建站决策前值得细读的三篇

网站改版的5个关键决策
2024-08-12

网站改版的5个关键决策

什么时候该改版、改到什么程度、如何避免流量掉光,京华建材集团改版复盘给出答案。

获取专属建站方案

看完文章,把您的行业与预算告诉我们,免费获取一份量身定制的官网建设方案与报价。

立即免费咨询