ARTICLE DETAIL

资讯详情

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

USB 3.0 U盘识别故障解析:Rx Detect机制与LTSSM状态机

USB 3.0 U盘识别故障解析:Rx Detect机制与LTSSM状态机 1. 从一个“玄学”现象说起为什么U盘插上去没反应你肯定遇到过这种事一个USB 3.0的U盘插到电脑上系统一点动静都没有设备管理器里也看不到任何新设备。换一个口好了。再换回原来的口有时候又能认了。更诡异的是同一个口插USB 2.0的设备完全正常唯独USB 3.0的设备时灵时不灵。很多人第一反应是“U盘坏了”或者“接口接触不良”但如果你拆开过一个USB 3.0的HUB或者主板原理图就会发现事情没那么简单。USB 3.0的接口比USB 2.0多了整整一排5个引脚除了VBUS和GND其中最关键的一对差分信号叫SSTXSuperSpeed Transmit和SSRXSuperSpeed Receive。问题就出在这对SSRX上——在USB 3.0的协议里主机和设备之间需要先通过一个叫Rx Detect的机制互相“打招呼”确认对方在线且有能力进行超速通信才会正式建立链路。如果这个握手环节出了问题后面的所有事情都免谈。这篇文章就是围绕这个Rx Detect展开的。我会从协议原理讲到LTSSM状态机再讲到Redriver和Retimer这些信号调理芯片在其中的角色最后拿实际设备做几组对照测试把“为什么有时候能认有时候不能认”这件事彻底讲清楚。适合做硬件设计、信号完整性调试、以及日常被USB 3.0兼容性问题折磨的工程师参考。不管你是刚入行的硬件助理还是做了多年的SI工程师应该都能从中找到一些有用的东西。2. Rx Detect到底在检测什么协议层面的核心逻辑2.1 USB 3.0链路建立的三个阶段USB 3.0的超速链路建立不是一蹴而就的它分成了三个大的阶段每个阶段都有明确的目的和退出条件。第一个阶段是Rx Detect接收端检测。这个阶段的核心任务是主机端下行端口需要确认设备端上行端口的SSRX差分对上有正确的终端电阻Receiver Termination反过来设备端也要确认主机端的SSRX上有终端电阻。这个终端电阻的标称值是50欧姆分别接在D和D-上另一端通过一个电容拉到地。为什么要检测这个因为只有当对端的接收端有正确的终端匹配时发送端发出的高速信号才不会因为阻抗不匹配而产生严重的反射导致眼图闭合。第二个阶段是Polling轮询。Rx Detect通过之后双方进入Polling状态开始发送和接收TS1Training Sequence 1有序集。TS1里包含了发送端的链路能力信息比如支持的速率、通道数、是否支持某种编码方式等。这个阶段有点像两个人刚见面先交换名片确认一下对方的基本信息。第三个阶段是Configuration配置。Polling完成之后进入Configuration双方开始协商最终的链路参数包括速率5Gbps还是10Gbps、通道方向、是否进入低功耗状态等。这个阶段会发送TS2有序集并且开始进行通道对齐Lane Alignment和去偏斜De-skew。Configuration阶段完成之后链路才正式进入U0状态可以开始传数据了。Rx Detect是这三个阶段里最底层、最基础的一环。它不涉及任何数据包的交互纯粹是物理层的一个模拟检测过程。但恰恰是这个最底层的环节在实际工程中出问题的概率最高。2.2 Rx Detect的电气原理50欧姆终端与RC时间常数要理解Rx Detect为什么容易出问题得先搞清楚它的电气实现方式。在USB 3.0的规范里接收端的终端电阻并不是一个简单的50欧姆电阻直接接地。它实际上是一个50欧姆电阻串联一个电容通常是100nF左右再接地。这个电容的作用是隔直防止发送端的共模电压影响到接收端的偏置电路。但电容的存在也意味着从发送端看过去这个终端并不是一个纯电阻而是一个RC串联网络。当发送端开始进行Rx Detect时它会通过一个电流源向SSRX的D和D-注入一个小的测试电流通常是微安级别然后测量D和D-上的电压变化。如果对端有正确的50欧姆终端那么电压会按照一个可预测的RC时间常数上升如果对端没有终端比如设备没插好、或者设备端的接收电路没上电那么电压会上升得更快或者更慢甚至直接冲到电源轨。这个检测过程对时序的要求非常严格。规范里规定了检测窗口的宽度和电压阈值发送端必须在规定的时间内完成测量并做出判断。如果因为PCB走线太长、连接器接触电阻太大、或者对端的电容值偏差太大导致RC时间常数偏离了预期范围发送端就可能误判为“对端不在线”从而放弃超速链路建立退回到USB 2.0模式甚至完全不识别。注意很多“USB 3.0 U盘插上没反应”的案例最后查下来都是SSRX差分对上的耦合电容虚焊或者容值偏差过大导致的。这个电容通常放在连接器附近如果PCB布局时把它放得太远走线电感会进一步恶化RC特性。2.3 为什么USB 2.0没有这个问题有人可能会问为什么USB 2.0的设备插上去从来不会出现这种“时灵时不灵”的情况原因在于USB 2.0的链路检测机制完全不同。USB 2.0用的是D和D-上的上拉/下拉电阻来检测设备连接。主机端在D和D-上各有一个15k欧姆的下拉电阻设备端在D上有一个1.5k欧姆的上拉电阻全速设备或者在D-上有一个1.5k欧姆的上拉电阻低速设备。当设备插入时主机检测到D或D-上的电压被拉高就知道有设备插入了。这个过程是静态的、直流层面的检测对走线长度、连接器阻抗、电容值都不敏感。USB 3.0的Rx Detect是动态的、交流层面的检测它依赖于RC时间常数的精确性。这就好比USB 2.0是“看对方在不在家”看灯亮不亮而USB 3.0是“敲门听回声”听声音对不对。前者简单可靠后者信息量更大但对环境更敏感。3. LTSSM状态机Rx Detect在链路训练中的位置3.1 LTSSM的整体架构LTSSM全称是Link Training and Status State Machine翻译过来就是链路训练与状态状态机。它是USB 3.0物理层最核心的控制逻辑负责管理链路从断电到正常工作再到低功耗的全部状态转换。LTSSM的状态可以分成几大类链路训练状态Rx Detect、Polling、Configuration、正常工作状态U0、低功耗状态U1、U2、U3、错误恢复状态Recovery、Hot Reset、Loopback等。其中Rx Detect是链路训练的第一个状态也是整个状态机的入口。在LTSSM的视角里Rx Detect不是一个单一的状态而是包含了几个子状态Rx Detect Reset、Rx Detect Active、Rx Detect Quiet等。这些子状态交替执行目的是在检测期间给对端足够的时间来建立终端同时避免自己的检测信号干扰到对端。3.2 从Rx Detect到Polling的转换条件Rx Detect状态要成功退出并进入Polling需要满足几个条件发送端在SSRX的D和D-上都检测到了符合规范的终端电阻即RC时间常数在允许范围内。检测过程持续了足够长的时间规范要求至少12ms以确保对端有充分的时间上电并建立终端。没有出现超时或者错误计数超过阈值的情况。如果这些条件在规定的超时时间内没有满足LTSSM会进入Compliance Mode或者退回USB 2.0模式。Compliance Mode是一种测试模式用于实验室里用示波器观察发送端的信号质量。在实际使用中如果设备不支持Compliance Mode就会直接表现为“设备不识别”。这里有一个很容易被忽略的细节Rx Detect的检测是双向的。主机在检测设备的同时设备也在检测主机。如果只有一边检测成功另一边失败链路同样建立不起来。这就解释了为什么有些设备插在某些主机上能认插在另一些主机上就不认——因为两边Rx Detect电路的容差范围不匹配。3.3 Configuration阶段的报文流转虽然这篇文章的重点是Rx Detect但既然热搜词里提到了“pcie ltssm阶段的configuration阶段和子阶段报文流转图”我觉得有必要把Configuration阶段也简单梳理一下因为Rx Detect和Configuration在逻辑上是连续的理解了后者能更好地理解前者为什么重要。Configuration阶段的主要任务是协商链路参数。它包含几个子状态Configuration.Idle、Configuration.Linkwidth.Start、Configuration.Linkwidth.Accept、Configuration.Lanenum.Wait、Configuration.Lanenum.Accept、Configuration.Complete、Configuration.Reset等。在Configuration.Idle子状态双方发送TS1有序集其中包含了Link Width链路宽度和Lane Number通道编号信息。发送端会根据自己的能力和对端的能力计算出一个双方都支持的链路宽度。然后进入Linkwidth.Start发送带有特定Lane Number的TS1。对端收到后如果同意就回复TS1并进入Linkwidth.Accept。接着是Lanenum.Wait和Lanenum.Accept用于确认每个Lane的编号和方向。最后进入Configuration.Complete双方发送TS2有序集完成通道对齐和去偏斜然后进入U0状态。整个Configuration阶段的报文流转本质上是一个三次握手的过程发送方提出参数接收方确认参数发送方再确认接收方的确认。这个过程如果因为Rx Detect阶段留下的隐患比如某个Lane的终端匹配不好而导致某个Lane的误码率偏高就会在Configuration阶段表现为“链路宽度协商失败”或者“反复进入Recovery状态”。4. Redriver与Retimer信号调理芯片在Rx Detect中的角色4.1 Redriver的工作原理与Rx Detect的相互影响Redriver是一种模拟信号调理芯片它的核心功能是对高速差分信号进行均衡和放大。在USB 3.0的链路中如果主机和设备之间的PCB走线太长比如超过20厘米或者经过了多个连接器和线缆信号的高频分量会严重衰减导致眼图闭合。Redriver通过CTLE连续时间线性均衡来补偿这种衰减把眼图重新打开。但Redriver有一个关键特性它是双向的、透明的。它不解析协议只是把输入端的信号均衡后从输出端送出去。这意味着Redriver在Rx Detect阶段也会参与进来——它会把自己输入端的终端电阻和对端的终端电阻“串联”起来改变整个链路的RC特性。如果Redriver的输入终端电阻设计不当或者它的均衡增益设置过高就可能导致Rx Detect阶段检测到的RC时间常数偏离预期从而误判对端不在线。更麻烦的是有些Redriver在检测到没有信号输入时会自动进入低功耗模式断开内部终端这会让对端的Rx Detect直接失败。实操心得如果你在调试一个带Redriver的USB 3.0 HUB发现设备插上后要等好几秒才能识别或者插拔几次才能认一次优先检查Redriver的终端电阻配置和低功耗模式退出时间。很多时候把Redriver的自动低功耗功能关掉问题就消失了。4.2 Retimer与Redriver的本质区别Retimer比Redriver复杂得多。它不仅仅是一个模拟均衡器而是一个完整的物理层中继器。Retimer内部有CDR时钟数据恢复电路它会从输入信号中恢复出时钟然后用恢复出来的时钟重新发送数据。这意味着Retimer对信号是“再生”而不是“放大”它可以完全消除抖动积累。在Rx Detect阶段Retimer的行为和Redriver完全不同。Retimer通常会主动参与Rx Detect过程它会在自己的接收端进行终端检测如果检测到对端有终端就向自己的发送端报告然后发送端再向更下一级进行Rx Detect。这个过程是逐级进行的每一级Retimer都相当于一个独立的“主机”或“设备”。这种逐级检测的机制带来了一个好处即使链路很长、中间经过了多个Retimer每一级的Rx Detect都是在局部进行的不会因为整条链路的衰减而失败。但坏处是如果某一级Retimer的Rx Detect逻辑有bug或者它的终端电阻与对端不匹配整条链路就会在那一级断掉。4.3 什么时候该用Redriver什么时候该用Retimer这是一个在实际设计中经常被问到的问题。我的经验是场景推荐方案理由PCB走线长度小于15cm无连接器不用调理芯片信号衰减在可接受范围内PCB走线15-30cm经过1个连接器Redriver衰减主要是高频损耗CTLE可以补偿PCB走线超过30cm或经过2个以上连接器Retimer抖动积累严重需要CDR再生线缆长度超过3米Retimer线缆损耗大且抖动积累明显需要支持10GbpsRetimer10Gbps对抖动和损耗的要求更严格这个表格只是一个粗略的参考实际选型还要看具体的插入损耗Insertion Loss和回波损耗Return Loss指标。一般来说如果链路在2.5GHz处的插入损耗超过-10dB就应该考虑加Redriver如果超过-15dB或者眼图抖动超过0.3UI就应该考虑Retimer。5. 实战测试用不同设备验证Rx Detect行为5.1 测试环境搭建为了验证Rx Detect的实际行为我搭了一个简单的测试环境主机端一台台式机主板上有原生的USB 3.0接口Intel芯片组另外通过PCIe扩展卡增加了一个ASMedia芯片组的USB 3.0接口。设备端准备了三个USB 3.0 U盘分别是SanDisk、Kingston、Samsung一个USB 3.0移动硬盘盒一个USB 3.0 HUB带Redriver。测量工具一台带宽1GHz以上的示波器配差分探头用于观察SSRX上的电压波形。另外用了一个USB协议分析仪来抓取LTSSM的状态转换。辅助工具一个可调直流电源用于给设备端单独供电排除主机供电不足的干扰。测试的思路是在SSRX的D和D-上分别注入一个小的测试电流用示波器观察电压上升的波形然后根据RC时间常数反推终端电阻和电容的值。同时用协议分析仪记录LTSSM的状态转换看看Rx Detect成功和失败时状态机分别是怎么走的。5.2 正常识别时的波形与状态机记录先看一个正常识别的案例。把SanDisk的U盘插到原生USB 3.0接口上示波器抓到的SSRX波形非常干净电压从0V开始按照一个明显的指数曲线上升大约在200微秒后达到稳定值。根据RC时间常数计算终端电阻大约是48欧姆耦合电容大约是110nF都在规范允许的范围内。协议分析仪记录到的LTSSM状态转换是Rx Detect.Reset - Rx Detect.Active - Rx Detect.Quiet - Polling.RxEQ - Polling.Active - Configuration.Idle - Configuration.Linkwidth.Start - Configuration.Linkwidth.Accept - Configuration.Complete - U0。整个过程大约用了80毫秒其中Rx Detect阶段占了大约15毫秒。这个案例说明当终端匹配良好时Rx Detect可以很快完成链路训练也很顺畅。5.3 识别失败时的波形与状态机记录再看一个识别失败的案例。把同一个SanDisk U盘插到ASMedia扩展卡的接口上这次系统没有任何反应。示波器抓到的SSRX波形明显不对电压上升得非常快几乎是一条直线冲到了1.2V然后停在那里。这说明对端的终端电阻没有起作用可能是设备端的接收电路没有上电或者耦合电容开路。协议分析仪记录到的LTSSM状态转换是Rx Detect.Reset - Rx Detect.Active - Rx Detect.Quiet - Rx Detect.Active - Rx Detect.Quiet - ...反复循环。状态机在Rx Detect.Active和Rx Detect.Quiet之间反复跳转始终无法进入Polling。大约过了200毫秒后状态机进入Compliance Mode然后彻底停止。这个案例说明当终端检测失败时LTSSM会陷入死循环最终超时退出。在实际使用中这就表现为“设备不识别”。5.4 带Redriver的HUB测试最后测试带Redriver的USB 3.0 HUB。把HUB插到原生接口上然后把U盘插到HUB上。这次示波器抓到的波形介于前两个案例之间电压上升曲线基本正常但在上升过程中有一个小的台阶说明Redriver的终端电阻和U盘的终端电阻在切换过程中产生了影响。协议分析仪记录到的状态转换是Rx Detect.Reset - Rx Detect.Active - Rx Detect.Quiet - Polling.RxEQ - Polling.Active - Configuration.Idle - ... - U0。整个过程大约用了120毫秒比直连时慢了40毫秒。这40毫秒主要花在Redriver的低功耗模式退出和终端切换上。这个案例说明Redriver虽然能补偿信号衰减但会引入额外的延迟。如果主机端的Rx Detect超时时间设置得比较紧这个延迟就可能导致检测失败。6. 常见问题与排查技巧实录6.1 Rx Detect失败的典型原因速查表现象可能原因排查方法解决措施设备完全不识别SSRX耦合电容开路或虚焊用示波器测SSRX上的RC波形重新焊接或更换电容插拔几次才能识别终端电阻偏差过大测量终端电阻值应为50欧姆±10%更换电阻或调整布局识别后频繁掉线Redriver低功耗模式干扰抓取LTSSM状态转换关闭Redriver自动低功耗识别时间过长Retimer逐级检测延迟测量从插入到U0的时间优化Retimer配置或减少级数某些主机能认某些不能两边Rx Detect容差范围不匹配对比不同主机的检测波形调整终端电容值或加Redriver10Gbps设备降速到5GbpsConfiguration阶段误码率高用协议分析仪看TS2有序集改善信号完整性或加Retimer6.2 独家避坑技巧如何用万用表快速判断Rx Detect是否正常在没有示波器的情况下其实可以用一个简单的万用表来初步判断Rx Detect电路是否正常。方法如下把万用表调到电阻档测量SSRX的D对地电阻和D-对地电阻。正常情况下应该读到接近50欧姆的值因为万用表用的是直流电容相当于开路所以读到的就是终端电阻的阻值。如果读到的电阻远大于50欧姆比如几百欧姆说明终端电阻可能虚焊或者阻值不对。如果读到的电阻远小于50欧姆比如几欧姆说明可能有短路。如果读到的电阻不稳定跳来跳去说明可能有虚焊或者接触不良。这个方法虽然不能完全替代示波器但在现场排查时非常实用。我试过好几次用万用表就能快速定位到问题所在的板子或连接器。注意测量时一定要确保设备已经断电并且SSRX上的电容已经放电完毕。否则万用表的读数会受到电容充电过程的影响导致误判。6.3 另一个容易忽略的坑VBUS供电时序Rx Detect的成败不仅取决于SSRX上的终端匹配还取决于VBUS的供电时序。USB 3.0规范要求设备端的接收电路必须在VBUS稳定后的一定时间内完成上电并建立终端。如果VBUS上升太慢或者设备端的电源管理芯片响应太慢Rx Detect就会在终端还没建立好的时候开始检测导致失败。我遇到过这样一个案例一个USB 3.0移动硬盘盒插到某台笔记本上时好时坏。后来用示波器同时抓VBUS和SSRX的波形发现VBUS从0V上升到5V用了大约50毫秒而硬盘盒的电源管理芯片又用了30毫秒才把接收电路上电。加起来80毫秒已经接近主机端Rx Detect的超时阈值了。后来在硬盘盒的VBUS输入端加了一个大电容把上升时间缩短到10毫秒以内问题就解决了。这个案例说明Rx Detect的问题不一定出在SSRX上有时候根子在电源上。排查时一定要把VBUS和SSRX的波形放在一起看才能找到真正的根因。7. 从Rx Detect延伸出去链路训练的完整视角7.1 Rx Detect与PCIe LTSSM的异同虽然这篇文章讲的是USB 3.0但既然热搜词里提到了PCIe的LTSSM我觉得有必要做一个简单的对比因为两者在链路训练的思路上一脉相承。PCIe的LTSSM也有一个类似Rx Detect的状态叫Detect状态。在Detect状态里发送端会检测接收端是否有正确的终端电阻也是50欧姆。检测通过后进入Polling然后进入Configuration。整个流程和USB 3.0几乎一模一样。区别在于PCIe的Detect状态有更细的子状态划分Detect.Quiet、Detect.Active而且PCIe的链路训练通常涉及多个Lane的并行训练每个Lane都要独立完成Detect和Polling。USB 3.0虽然也支持多Lane比如USB 3.1的双Lane模式但在实际产品中绝大多数还是单Lane。另一个区别是PCIe的Configuration阶段有更复杂的Lane反转Lane Reversal和极性反转Polarity Inversion处理。USB 3.0的Configuration阶段相对简单一些但基本的握手逻辑是相通的。理解了USB 3.0的Rx Detect再去理解PCIe的Detect状态会容易很多。反过来也一样。7.2 链路训练失败后的恢复机制当Rx Detect失败导致链路训练无法完成时USB 3.0协议规定了几个恢复机制第一个是重试。LTSSM会在超时后自动重新进入Rx Detect状态再试一次。通常重试次数是有限的比如3次或5次。如果重试都失败就进入下一个机制。第二个是降速。如果5Gbps的链路训练失败协议允许尝试降到USB 2.0模式。这就是为什么很多USB 3.0设备在Rx Detect失败后仍然能被识别为USB 2.0设备——因为USB 2.0的检测机制是独立的不受Rx Detect影响。第三个是进入Compliance Mode。这是一种测试模式用于实验室里用示波器观察发送端的信号质量。在实际使用中如果设备不支持Compliance Mode就会直接表现为“设备不识别”。这三个机制的优先级是先重试重试失败后降速降速也失败后进入Compliance Mode。在实际调试中如果你看到设备被识别为USB 2.0而不是USB 3.0说明Rx Detect失败了但降速成功了。这时候应该重点检查SSRX的终端匹配和信号完整性。7.3 未来趋势更高速度下的Rx Detect挑战USB 3.0的5Gbps已经对Rx Detect提出了很高的要求到了USB 3.1的10Gbps和USB 3.2的20Gbps挑战就更大了。速率越高信号的高频分量越丰富对终端匹配和走线阻抗的要求就越严格。在10Gbps下一个很小的阻抗不连续比如连接器的引脚电感就可能导致眼图闭合进而影响Rx Detect的可靠性。另一个趋势是自适应均衡。传统的Redriver使用固定的CTLE曲线而新一代的Redriver和Retimer开始支持自适应均衡可以根据链路的具体损耗自动调整均衡参数。这在一定程度上可以缓解Rx Detect的容差问题但也增加了芯片的复杂度和调试难度。从测试的角度看未来Rx Detect的测试可能会越来越依赖自动化测试平台通过脚本控制示波器和协议分析仪批量采集不同设备组合下的波形和状态机记录然后用机器学习的方法来识别异常模式。这比人工一条一条看波形要高效得多。8. 写在最后一些个人体会调试USB 3.0的Rx Detect问题最深的体会就是不要只盯着协议层看物理层的细节往往才是根因。我见过太多案例协议分析仪抓出来的状态机转换看起来完全正常但就是识别不了最后查下来是SSRX上的一个电容虚焊了或者VBUS的上升时间慢了20毫秒。另一个体会是示波器是必不可少的工具。万用表只能做初步判断真正要定位问题必须用示波器看波形。特别是差分探头能直接看到SSRX上的RC充电曲线一眼就能判断终端匹配是否正常。如果没有差分探头用两个单端探头分别测D和D-然后做数学运算也能凑合看但精度会差一些。最后分享一个小技巧如果你在调试一个带Redriver或Retimer的链路不妨先把调理芯片 bypass 掉直接测主机和设备之间的Rx Detect波形。如果bypass之后能正常识别说明问题出在调理芯片的配置上如果bypass之后仍然不能识别说明问题出在主机或设备本身的终端电路上。这个“二分法”能帮你快速缩小排查范围省下不少时间。这个内容后续还可以这样扩展把测试范围扩大到USB 3.1和USB 3.2的设备对比不同速率下的Rx Detect波形差异或者用脚本自动化采集LTSSM状态转换数据建立一个故障模式库用于快速匹配和诊断。
返回列表