USB PHY 接口 UTMI/ULPI:信号、时钟与 USB2.0 高速协商
更新时间:2026-09-19。前置:USB 端点与枚举、混合信号边界/PHY。USB 控制器(数字)通过标准 PHY 接口驱动模拟收发器。
本文要回答的问题
- UTMI 和 ULPI 差在哪,为什么 ULPI 更省引脚?
- 60MHz、8/16 位数据、DIR/NXT/STP 这些信号怎么握手?
- USB2.0 高速(480M)是怎么通过 chirp 协商出来的?
- PHY 复位、时钟来源、ULPI 寄存器访问有哪些坑?
一、UTMI vs ULPI
| 维度 | UTMI/UTMI+ | ULPI |
|---|---|---|
| 位宽 | 8 或 16 位 | 8 位 |
| 时钟 | 60MHz(8bit)/30MHz(16bit) | 60MHz 单向 |
| 引脚 | 多(约 20+,控制信号独立) | 少(约 12,命令/状态复用总线) |
| 控制 | 专用 XcvrSelect/TermSelect/OpMode/LineState | 通过寄存器写经数据总线复用 |
| 典型 | SoC 内集成 PHY/板内 | 外接 USB2.0 ULPI PHY 芯片 |
ULPI 是 UTMI 的「引脚精简版」:把大量静态控制/状态编码成总线事务(TX 命令、RX 命令、寄存器读写),用 DIR/NXT/STP 三根握手线复用 8 位数据。
二、UTMI 关键信号
- 数据 DATA[7:0]/[15:0],时钟 CLK(PHY 输出给 MAC)。
- 发送:
TXVALID(数据有效)、TXREADY(PHY 可接收)、TX 命令随包。 - 接收:
RXVALID、RXACTIVE(接收中)、RXERROR。 - 模式控制:
XcvrSelect(HS/FS 收发器)、TermSelect(全速/高速终端)、OpMode(正常/非驱动/禁用比特stuff)、LineState(单端 D+/D-,判 SE0/J/K)。 - Reset:
RESET#、PHY_RST、IDDIGITAL(主机/设备角色)、VBUS有效、DP/DM上拉控制。
三、ULPI 握手与寄存器访问
三根控制:
- DIR(PHY→LINK):谁拥有数据总线。DIR=1 表示 PHY驱动(接收/状态),DIR=0 表示 LINK 驱动(发送/写寄存器)。
- STP(LINK→PHY):STOP,拍尾指示发送数据/一次寄存器写结束(上升沿/高电平)。
- NXT(PHY→LINK):NEXT/accept,PHY 用 NXT 接收下一字节或返回寄存器读数据。
bash
写寄存器(DIR=0, LINK 驱动):
cycle1: TXD = {idle?, 1:1, regaddr[5:0]} // 高2位=10 表示 immediate reg write
cycle2: TXD = 8 位寄存器数据 ; PHY 在 NXT 确认 ; STP 收尾
读寄存器:
LINK 发 {11, addr}(immediate read)
下一个 DIR 翻转周期,PHY 在 RX 上把数据送回,NXT 推进ULPI 上电必须先通过这些访问配置 PHY(功能控制、OTG、上拉、速率),再枚举。
四、高速协商(chirp)简述
USB2.0 设备插入时先以全速(FS,12M)建立,随后高速能力设备做 chirp 握手:
- 主机发复位(SE0,D+/D- 同低,≥10ms)。
- HS 设备驱动 chirp K(D+低/D-高)。
- 主机响应交替的 K/J chirp 序列表示「我支持高速」。
- 设备断开 FS 上拉、接通高速终端、切到 480Mbps,之后用 microframe(125μs)。
- 协商失败则回退全速。PHY 内的状态机在 UTMI/ULPI 上以 LineState/中断通知控制器,软件一般不用手控 chirp,但要正确释放复位、使能 HS 终端。
五、时钟与复位
- ULPI 60MHz 通常由 PHY 供 LINK(或 LINK 供 PHY,取决于设计),方向必须与硬件一致;这是 源同步/时钟方向同类问题。
- PHY 复位:先 RESET# 有效满足脉宽,等时钟稳定、PHY 输出时钟,再做 ULPI 寄存器初始化;过早访问无应答。
- VBUS 有效、DP/DM 上拉与角色(ID)状态决定能否被识别。
六、常见的坑
- DIR 方向理解错:DIR=1 时 LINK 仍驱动数据,总线冲突;必须三态切换。
- STP/NXT 时序错:STP 提前/滞后一拍、忽略 NXT 反压,丢字节或 PHY 不识别。
- 时钟方向接反:ULPI 60MHz 谁供谁与原理图不一致,无时钟不通信。
- 复位未完成就写寄存器:PHY 时钟/内部未就绪,ULPI 事务无响应。
- 忘初始化功能控制寄存器:上拉未接、xceiver 未使能,设备不被枚举。
- 高速终端/上拉冲突:chirp 阶段没正确断 FS 上拉,停在全速或枚举失败。
- ULPI 寄存器地址/命令码错:读写位(10/11)混淆,读不到数据。
- VBUS 无效:设备端检测不到 VBUS valid 不上拉,主机看不到设备。
- ULPI 时序违例(STA):60MHz 双/源同步对 PCB/IO 延迟敏感,等长和 IO 标准要对。
- OTG/角色 ID 浮空:默认角色随机,主从行为不符预期。
- OpMode 留在非驱动/禁用位填充模式:正常枚举后忘记恢复,波形异常。
相关与延伸
协议侧见 USB 端点与枚举;PHY 模拟概念见 混合信号边界;握手/源同步对照 MII/RGMII、valid/ready。
总结
USB 数字内核经 UTMI(多引脚、8/16 位、XcvrSelect/OpMode/LineState 专用控制)或精简的 ULPI(8 位+60MHz,DIR 定总线方向、NXT 做接收推进、STP 收尾,控制/状态复用为寄存器事务)连接 PHY;上电要先正确复位等 60MHz 时钟、用 ULPI immediate read/write 配置 PHY,再让 PHY 在总线复位中自动做 chirp K/J 协商切到 480M、失败回退全速——DIR 方向、STP/NXT 握手、时钟方向和 PHY 复位时序是四大根因。