PHY寄存器概述:分类、地址映射与访问协议
做信号完整性分析,迟早要跟PHY寄存器打交道。说白了,寄存器就是PHY芯片的“控制面板”和“状态显示屏”。你调驱动、查链路、抓异常,最后都得回到寄存器值上找答案。
我个人习惯,拿到一块新PHY,第一件事不是看数据手册的电气参数,而是翻它的寄存器映射表。为啥?因为寄存器值的变化,直接反映了物理层信号的健康状况。这一章,咱们就把PHY寄存器的家底翻一翻。
寄存器分类:不只是“读”和“写”
PHY寄存器一般分成三类。第一类是基本控制寄存器和状态寄存器,地址0-3。这是IEEE 802.3规定的标准寄存器,所有PHY都得支持。我在项目中见过有人连地址0的复位位都找不到,翻半天手册——其实就在bit 15。
第二类是扩展寄存器,地址4-31。厂家在这里塞各种私有功能,比如EEE节能、交叉检测、信号质量指示。你想想看,同一个地址在不同厂商的PHY里,意思可能完全不同。
第三类叫做“页寄存器”(Page Register)。有些PHY地址空间不够用,就用页选择寄存器来做“翻页”,类似“bank切换”。我踩过这个坑——调试半天读不到期望值,结果是页没切对。
地址映射:一张表看透PHY的“内心”
地址0-15是标准寄存器区,也叫“基本寄存器集”。IEEE 802.3规定得很清楚,哪怕不同厂家的PHY,地址0的bit 15都是软件复位,bit 13都是速度选择。好处是驱动通用性很强。
地址16-31是“扩展寄存器区”,也叫“厂商特定寄存器”。这个区域才是信号完整性关注的战场。比如链路质量指示、CRC错误计数、信号幅度调整,都在这个区域。
| 寄存器地址 | 寄存器名称 | 关键bit | 信号完整性相关 |
|---|---|---|---|
| 0 | 基本控制 | 15(复位), 13(速度) | 复位时序影响链路恢复 |
| 1 | 基本状态 | 5(链路up), 2(链路中断) | 直接指示物理层状态 |
| 2-3 | PHY标识符 | 厂商OUI + 型号 | 确认芯片版本 |
| 4-15 | 扩展标准寄存器 | 自动协商、MDI/MDIX | 交叉检测影响信号路径 |
| 16-31 | 厂商特定 | 信号幅度、EQ、CRC | 直接反映信号完整性 |
访问协议:MDIO和MDC的“握手”规则
PHY寄存器通过MDIO接口访问。MDIO是双线制:一条时钟线MDC,一条数据线MDIO。读和写都有固定的帧格式。
一次MDIO读操作的帧结构是这样:
读帧: | PRE(32个1) | SFD(01) | OP(10) | PHY_ADDR(5bit) | REG_ADDR(5bit) | TA(ZZ) | DATA(16bit) |
写帧: | PRE(32个1) | SFD(01) | OP(01) | PHY_ADDR(5bit) | REG_ADDR(5bit) | TA(10) | DATA(16bit) |
嗯,这里要注意:TA(Turn Around)在读取时,PHY会在第二个周期释放总线。如果MDIO上拉电阻没选对,TA阶段读到的数据全是错的。我曾经因为一个4.7kΩ的上拉电阻用成了10kΩ,导致读回来的寄存器值总是0xFFFF,查了大半天。
写操作相对简单,驱动直接输出数据。但写操作对时序要求也很高,MDC频率一般不能超过2.5MHz(Clause 22标准)。有些高速PHY支持Clause 45,频率能跑到12.5MHz,但兼容性要注意。
访问时序:信号完整性从这里开始影响
你想想看,MDIO和MDC都是低速信号,为什么还会出问题?
问题出在PCB走线上。MDC虽然是时钟,但频率不高,一般也就2.5MHz。可如果走线太长,或者参考平面不连续,反射和串扰照样能把波形搞坏。MDIO数据一旦错位,读回来的寄存器值就全乱了。
我建议做PHY寄存器读写调试时,先检查MDIO信号质量:
- 高电平是否接近3.3V?——太低说明驱动弱或上拉不合适
- 上升沿是否干净?——有台阶说明存在反射
- TA周期的数据是否稳定?——抖动可能表示时序裕量不足
说白了,寄存器值不对,不一定是PHY的锅。先检查MDIO信号完整性,往往能省下很多冤枉时间。