4. UFS物理层概述:M-PHY与UniPro的关系、物理层功能
各位同学,欢迎来到第4章。前面我们聊了UFS的整体架构和协议栈的分层思想。从本章开始,我们要真正深入到底层——物理层。
物理层是UFS链路的基石。信号从发送端到接收端,中间那段铜线或者PCB走线,玩儿的全是物理层的活儿。你写的协议栈再漂亮,如果物理层没做好,数据上去就全是误码。
核心结论:UFS物理层由两个关键部分组成——M-PHY(物理编码子层)和UniPro(物理适配子层)。它们分工明确,缺一不可。
4.1 从分层模型说起
我们先看看M-PHY和UniPro在协议栈里待的位置。
UFS协议栈大体分三层:
- 应用层(UFS Command Set / SCSI)——发命令、传数据。
- 传输层(UFS Transport Protocol, UTP)——打包解包。
- 物理层——我们这章的主角,它又分成两个子层:
- UniPro — 物理适配层;负责链路管理、流量控制、错误检测。
- M-PHY — 物理编码层;负责真正的电信号发送与接收、串并转换。
说白了,M-PHY是干粗活儿的(数模混合),UniPro是管秩序和流程的(数字逻辑)。
下面这张图把M-PHY和UniPro在UFS系统中的位置画清楚了。你可以把它当作本章的知识地图。
4.2 M-PHY是什么?
M-PHY全称是MIPI M-PHY,由MIPI联盟定义。它不是UFS专用的,在MIPI CSI-2(摄像头接口)、DSI(显示接口)这些地方也能看到它。但在UFS里,它扮演了物理层信号执行者的角色。
M-PHY的核心职责
- 串并转换:UniPro发给M-PHY的是并行数据(比如16位或32位),M-PHY要把它转成高速串行比特流发送出去;接收端再反过来。
- 时钟恢复:M-PHY用的是嵌入式时钟,不单独走时钟线。接收端要靠CDR(时钟数据恢复)电路从数据流里把时钟抠出来。
- 线路编码:对数据进行编码,保证直流平衡(没有长时间的高电平或低电平),方便接收端正确采样。
- 电气特性:定义差分信号的电压、摆幅、上升时间、共模电压等。
我个人习惯,在刚开始学M-PHY时,把它的工作简单理解为“一个速度极快的SerDes(串化器/解串器)加上收发驱动电路”。本质上,它就是把UniPro给的数字比特流,变成一对差分线上跑的模拟信号。
4.3 UniPro是什么?
UniPro是MIPI UniPro规范,全称Unified Protocol。它在M-PHY之上盖了一层“数字管理层”。
UniPro的核心职责
- 链路管理与状态机:控制链路的建立、唤醒、休眠、速率切换。比如设备进入休眠状态时,UniPro会通知M-PHY把M线拉低,然后M-PHY切进低功耗模式。
- 流量控制:确保数据不会发太快,把接收端的缓存撑爆。它用的是基于信用值(Credit)的流控机制。
- 错误检测与重传:UniPro会在数据包后面加一段CRC,接收端收到后校验。如果发现错误,就要求发送端重传。
- 分帧与重组:上层发来的大块数据,UniPro可以拆成小包发送,接收端再拼起来。
我在一个项目里遇到过这样的坑:某次芯片回来后,发现UFS偶尔会卡死。查了好久,最终定位到是UniPro的链路状态机在Enter-Hibernate(进入休眠)和Wakeup(唤醒)之间切换时没有把M-PHY的时钟门控处理好。说白了,就是UniPro层发了个“休眠”指令,但M-PHY的驱动还没完全停稳,双方就各说各话了。从那以后,我养成了一个习惯:在UniPro的链路状态迁移旁边,一定要完整画出M-PHY的对应信号时序。
4.4 M-PHY与UniPro的接口
这两个模块不是随便接的。它们之间有明确的接口标准。
关键接口信号包括:
- PCLK / SCLK:M-PHY提供给UniPro的时钟信号。
- MDATA[7:0]:UniPro发给M-PHY的并行数据总线。
- MInterrupt, MWakeup:中断和唤醒控制信号。
- MLINE_STATE:M-PHY的线路状态指示(Line State:HS, PWM, STALL, SLEEP等)。
曾经有一次我带团队做验证,发现系统功耗比预想大很多。一层层查下来,发现UniPro侧有一位工程师在链路上传空闲帧时,把所有数据线都翻了一遍(全0变全1),导致M-PHY的电压跳变很大,DCD无法快速收敛,功耗就上去了。所以啊,M-PHY与UniPro的接口时序必须仔细约束,尽量减少无谓的跳变。
4.5 物理层功能总结
把这两者合在一起,UFS物理层提供一组基本功能:
- 数据速率适配:从HS-Gear 1到HS-Gear 5(也就是从1.5 Gbps/lane到25 Gbps/lane),UniPro控制速率档位,M-PHY调整驱动和采样时钟。
- 链路唤醒与休眠:UFS支持多层节能状态。UniPro负责状态机,M-PHY负责实际拉低/升起M线。
- 错误保护:UniPro做CRC+重传;M-PHY只送不查——“只管把信号送过去,对错不管”。
- 时钟容差与抖动容忍:M-PHY接收端的CDR必须能容忍发送端的时钟飘移和随机抖动。
下面这个表格可以帮你快速对比M-PHY和UniPro的分工:
| 比较维度 | M-PHY | UniPro |
|---|---|---|
| 所在层 | 物理编码子层(PCS) | 物理适配子层(PAS) |
| 本质 | 模拟/混合信号电路 | 纯数字逻辑 |
| 主要工作 | 编码/解码、差分驱动/接收、CDR | 链路状态机、流控、CRC验算、重传仲裁 |
| 对外的可见性 | 直接连接PCB走线和对方引脚 | 不直接接触物理线 |
| 功耗大头 | 驱动电流和时钟树的功率 | 逻辑翻转和CRC运算 |
| 典型验证关注点 | 眼图、抖动、共模电压、功耗 | 握手时序、超时重传、credit平衡 |
嗯,到这里你应该清楚了:M-PHY是“腿”,负责跑;UniPro是“脑”,负责指挥怎么跑、啥时候跑、跑错了怎么办。UFS物理层就是这群脑和腿的协调系统。
最后一句话总结:做物理层设计,对M-PHY要关心信号完整性和功耗;对UniPro要关心状态机和时序。两者密不可分。