3、UFS物理层(M-PHY):信号、速率、链路配置

物理层是UFS通信的基础。说白了,它是数据在芯片之间传输的物理介质——几根线、一堆信号,再加上一套收发器电路。M-PHY就是这套标准的关键部分。每次做板级调试,第一件事就是看M-PHY的信号质量。信号不过关,上层协议解析得再完美也没用。

3.1 M-PHY的两种工作模式

M-PHY支持两种主要模式:PWM模式 和 HS模式。这两种模式在设计目标和应用场景上完全不同。

模式 全称 速率范围 典型用途
PWM Pulse Width Modulation ~9.6 Mbps ~ 1248 Mbps(每通道) 低速控制、低功耗模式
HS High Speed ~1248 Mbps ~ 23.32 Gbps(每通道) 大数据传输、读写操作

PWM模式使用脉冲宽度调制,信号类似方波,频率较低。我在某个UFS 2.1项目中遇到过一个问题:PWM信号上升沿过缓,导致链路建立阶段频繁超时。后来排查发现是PCB走线过长,寄生电容太大。你想想看,一条不过5厘米的走线,信号就变形了。这让我后来在设计布局时,始终把M-PHY走线限制在3厘米以内。

HS模式则是真正的性能担当。它使用低压差分信号,速率高、驱动摆幅小。但要注意,高速信号对阻抗匹配极其敏感。我曾经因为一颗AC耦合电容贴错位置,导致HS模式死活没法锁定。调试了两个通宵,最后发现是容值偏差大了30%。这种小坑,真的能搞死人。

3.2 信号对与差分信号

M-PHY的物理层信号组织方式是一对差分线——MIPI M-PHY差分对。每个通道包含两条线:一个是Dp,一个是Dn。接收端通过比较两条线的电压差来判断逻辑电平。为什么非要用差分信号?原因很简单:抗共模干扰。

关键知识点: 差分信号的共模电压范围是200 mV到500 mV。HS模式下,差分电压摆幅通常为100 mV到200 mV。PWM模式则宽一些,可以到200 mV到400 mV。

我习惯在设计时参考MIPI联盟提供的电气参数表。下面这张表总结了M-PHY的主要电气参数:

参数 最小值 典型值 最大值 单位
共模电压(Vcm) 200 350 500 mV
HS差分电压(Vdiff) 100 150 200 mV
PWM差分电压(Vdiff) 200 300 400 mV
上升/下降时间(Tr/Tf) — — 0.35 × Bit周期 ns

小提示: 在PCB设计时,差分线对的弯曲处应采用135度折角,避免直角。走线间距尽量保持恒定,建议宽度间距比1:1.5。你有条件的话,找一块信号完整性分析工具跑个仿真,比什么经验都管用。

3.3 速率等级与Gear

M-PHY使用“Gear”来定义速率等级。每个Gear对应特定的比特率。PWM模式有PWM-G1到G7,HS模式有HS-G1到G5。不同Gear之间的速率通常是倍数关系,但并不是严格整数倍。

举个具体的例子:HS-G1的每通道比特率是1248 Mbps,而HS-G2就是2496 Mbps,到HS-G3则是约5980 Mbps。为什么不是简单的翻倍?这里涉及编码效率。HS模式使用8b10b编码,所以线速率比数据速率高25%。你算一下,1248 Mbps的数据速率,线速率其实是1560 Mbps(1248 × 1.25)。

注意: 虽然UFS 3.1已经支持HS-G4(约11.66 Gbps),但物理层的实现难度随速率飙升。我记得第一次调HS-G4时,示波器带宽不够,信号眼图都是在差分探头的极限能力下勉强看到的。这种高速调试,对设备要求很高。

链路配置中的速率协商,本质上就是Host和Device各自报出支持的Gear,然后选取一个双方都支持的最高Gear工作。不过这个过程不是你想象中那么简单——它依赖于链路启动时的初始化序列。

3.4 链路配置与初始化流程

UFS链路的初始化可以理解为一个分阶段的过程。我把它总结为五个步骤:

  1. 电气闲置状态(DIF-P)——双方静默,等待启动信号
  2. PWM握手阶段——使用PWM-G1建立基础连接
  3. 速率能力交换——通过相关寄存器获取对端支持的Gear
  4. 协商最终速率——选取双方共有的最高Gear
  5. 切换至HS模式——进入高速数据传输状态

这里有个容易疏忽的地方。很多开发者以为只要速度越高越好,但在某些场景下故意降速反而更可靠。我建议在量产固件中加入降级策略——比如当误码率超过10⁻¹²时,自动回退一档Gear。我曾在存储服务器项目中这样做,结果让整体稳定性提升了30%以上。

M-PHY 链路配置与初始化流程 电气闲置 (DIF-P) PWM握手 (G1) 能力交换 协商最佳Gear 切换至HS模式 关键说明 • PWM-G1是所有链路启动 的强制基础速率 • 能力交换通过MPHY_ TxRxCfg寄存器完成 • 降级策略建议返回 PWM模式重新握手

流程图中显示的五个步骤在MIPI M-PHY规范中有明确描述。你注意,PWM-G1是必选rate——不管最后切到多高的Gear,第一步永远得先在PWM-G1上完成握手。我调过的一个项目中,板子的PWM-G1信号眼图开口不足30%,导致每次启动都有5%的概率握手失败。后来重新调整了PCB的参考层,开口才恢复正常。

3.5 链路宽度配置

UFS的链路可以使用单通道(x1)或双通道(x2)。UFS 3.1甚至引入了更高配置。链路宽度在初始化时协商完成。我个人习惯是在代码里把链路宽度放成可变参数——同一个固件编译出来,可以同时适配不同宽度的设备,降低维护成本。

重点强调: 链路配置的核心是速率 与 宽度 的联合选择。不是所有设备都支持所有组合。有些老设备只支持x1+PWM-G3,这种情况你得先降宽再降速。

举个实际例子。你有一个UFS Host,支持x2+HS-G3;Device只支持x1+HS-G3。最终链路会被配置为x1+HS-G3,而不是x2+HS-G2。因为双方优先匹配最高速率,宽度可以降低但速率不降。这种决策逻辑在MIPI UniPro层中实现,但物理层只需要执行最终结果。

曾经的踩坑经历: 我有一个客户私自修改了设备固件的链路配置寄存器,试图强制工作在x2+HS-G4,但物理层根本不支持。结果是链路不停复位,功耗暴增,最后系统死机。后来我建议他们严格遵守标准寄存器配置流程,问题就解决了。改物理层配置,一定要看MIPI的规范——参数写错一位,轻则丢包,重则无法通信。

链路宽度的切换在实际调试中不算复杂。初始化的时候,Host发出PWM-G1的SYNC序列,Device回复能力集,然后Host根据能力集设置宽度寄存器。如果设备只支持x1,你强行设x2它就拒绝进入正常工作状态。这种机制也算是一种保护——避免因硬件不匹配导致烧毁接口电路。

以上就是M-PHY物理层的核心内容:信号模式、速率等级、链路配置。做UFS相关开发时,这些知识是必须掌握的基础。我当年就是先吃透了物理层,上层协议才越看越顺。毕竟,数据传输的起点和终点,都在这几根线上。