第三章 PHY芯片核心架构:内部模块与接口详解

好,咱们今天聊聊PHY芯片的“五脏六腑”。

很多工程师拿到PHY芯片的datasheet,一看内部框图就头大。其实没那么复杂。我个人习惯把PHY芯片拆成三块来看:PCS、PMA、PMD。搞懂这三块,你就掌握了PHY的命脉。

3.1 PHY芯片内部模块划分(PCS、PMA、PMD)

先看一张典型的PHY内部架构图(我这里用文字描述一下):

+------------------+     +------------------+     +------------------+
|      PCS         |     |      PMA         |     |      PMD         |
| (物理编码子层)    |---->| (物理介质接入层)  |---->| (物理介质相关层)  |
| - 8B/10B编码     |     | - 串行化/解串    |     | - 信号驱动       |
| - 4B/5B编码      |     | - 时钟恢复       |     | - 线路均衡       |
| - 自动协商       |     | - 扰码/解扰      |     | - 回波抵消       |
+------------------+     +------------------+     +------------------+
        |                        |                        |
        v                        v                        v
    MII/RGMII               SerDes接口               MDI接口

PCS(物理编码子层)——说白了就是“翻译官”。

它负责把MAC层发过来的数据,编码成适合在物理介质上传输的格式。比如100BASE-TX用的4B/5B编码,1000BASE-T用的4D-PAM5编码。我刚开始做车载项目时,一直搞不懂为什么非要编码,直接传不行吗?后来发现,编码是为了解决直流平衡和时钟同步问题。嗯,这里要注意,不同速率用的编码方式不一样,选型时一定要看仔细。

PMA(物理介质接入层)——这是“信号调理师”。

PMA负责把并行的数据变成串行的,或者反过来。它还负责时钟恢复——从接收到的数据流里把时钟信号“抠”出来。我在项目中遇到过一个问题:某款PHY在低温下时钟恢复不稳定,导致丢包。后来查了半天,是PMA内部的CDR(时钟数据恢复)环路参数没调好。所以,PMA的稳定性直接决定了你的链路能不能跑起来。

PMD(物理介质相关层)——这是“物理接口的肌肉”。

PMD直接和网线、光纤打交道。它负责信号的驱动、接收、均衡、回波抵消等。车载以太网常用的是100BASE-T1和1000BASE-T1,它们的PMD设计完全不同。100BASE-T1只用一对差分线,所以需要混合电路和回波抵消技术。你想想看,一对线上既要发又要收,不搞回波抵消根本没法工作。

核心要点:

  • PCS:编码解码,自动协商
  • PMA:串并转换,时钟恢复
  • PMD:信号驱动,线路均衡

3.2 MII/RMII/GMII/RGMII/SGMII接口详解

这些接口是MAC和PHY之间的“高速公路”。选哪种接口,取决于你的系统带宽和引脚数量。

MII(介质独立接口)——最原始的接口,100Mbps时代的标准。

它用了16根信号线(包括数据、控制、时钟)。我记得第一次调MII接口时,被那堆线搞得晕头转向。不过现在车载项目很少用MII了,因为引脚太多。

RMII(简化介质独立接口)——MII的“瘦身版”。

把16根线砍到6根。怎么做到的?它把时钟频率从25MHz提高到50MHz,用双倍速率来传输数据。我建议大家在引脚紧张的MCU上优先考虑RMII。但要注意,RMII需要外部50MHz时钟源,而且收发器必须同步到这个时钟上。

GMII(千兆介质独立接口)——千兆时代的MII。

数据线从4位变成了8位,时钟频率125MHz。引脚数更多了,24根。说实话,现在新设计很少用GMII,因为RGMII更香。

RGMII(简化千兆介质独立接口)——目前最主流的接口。

它用DDR(双倍数据速率)技术,在时钟的上升沿和下降沿都传输数据。所以8位数据线只需要4根,加上时钟和控制,总共12根左右。我做过一个项目,PCB空间特别紧张,用RGMII省了不少走线面积。但要注意,RGMII对PCB走线等长要求很高——时钟和数据线的长度差最好控制在50mil以内。我曾经因为没注意这个,导致信号时序违规,折腾了两天才找到原因。

SGMII(串行千兆介质独立接口)——最省引脚的接口。

它只用一对差分线(两根线)就能跑千兆。SGMII内部把8位并行数据串行化,用1.25Gbps的速率传输。我特别喜欢SGMII,因为它走线简单,抗干扰能力强。但代价是PHY内部需要额外的SerDes模块,成本会高一些。

下面这个表格可以帮你快速对比:

接口类型 数据宽度 时钟频率 引脚数 最大速率 适用场景
MII 4位 25MHz 16 100Mbps 老设计,不推荐
RMII 2位 50MHz 6 100Mbps 引脚受限的MCU
GMII 8位 125MHz 24 1000Mbps 极少用
RGMII 4位(DDR) 125MHz 12 1000Mbps 主流选择
SGMII 1位(串行) 1.25Gbps 2 1000Mbps 高速/长距离

我的选型建议:

  • 100Mbps车载项目:优先RMII,省引脚
  • 1000Mbps车载项目:RGMII是性价比之王
  • 如果PCB空间极度紧张或需要隔离:SGMII

3.3 MDIO管理接口与寄存器映射

MDIO(管理数据输入输出接口)是MAC用来配置和监控PHY的“控制通道”。它只有两根线:MDC(时钟)和MDIO(数据)。

MDIO的协议很简单,我写个伪代码大家就明白了:

// MDIO写操作时序
// 前导码(32个1) + 起始码(01) + 操作码(01) + PHY地址(5位) + 寄存器地址(5位) + 转向(10) + 数据(16位)

// 示例:向PHY地址0x01的寄存器0x0A写入0x1234
// 1. 发送32个1
// 2. 发送01 (起始码)
// 3. 发送01 (写操作)
// 4. 发送00001 (PHY地址=1)
// 5. 发送01010 (寄存器地址=0x0A)
// 6. 发送10 (转向)
// 7. 发送0001001000110100 (数据=0x1234)

MDIO的寄存器映射遵循IEEE 802.3标准。前16个寄存器(地址0x00~0x0F)是强制实现的,后面的地址是厂商自定义的。

我重点讲几个关键寄存器:

  • 寄存器0(控制寄存器):bit15是软件复位,bit13是速度选择,bit12是自动协商使能。我每次调试PHY,第一步就是读这个寄存器,确认PHY是否处于正常工作状态。
  • 寄存器1(状态寄存器):bit2是链接状态,bit5是自动协商完成。我曾经遇到一个坑:PHY的链接状态寄存器显示已链接,但实际物理链路是断的。后来发现是PHY的“链接保持”功能在作怪——它会缓存上一次的链接状态。所以,读状态寄存器时一定要连续读两次,取最新值。
  • 寄存器4(自动协商广告寄存器):告诉对端我支持哪些速率和工作模式。
  • 寄存器5(自动协商对端能力寄存器):读取对端支持的能力。

避坑指南:

我曾经在调试一个项目时,发现PHY死活无法建立千兆链接。用MDIO读寄存器5,发现对端只支持100M。但换了一个交换机后还是不行。最后查出来,是PCB上RGMII接口的TX_CLK和RX_CLK走线不等长,导致时序违规。所以,当MDIO寄存器显示一切正常但链路不通时,先检查硬件走线,别死磕软件。

最后,我给大家一个MDIO调试的小技巧:写一个简单的脚本,循环读取PHY的寄存器0和寄存器1,观察bit变化。如果链接状态在0和1之间来回跳,说明链路不稳定,大概率是硬件问题(连接器松动、PCB阻抗不匹配等)。如果状态稳定为0,说明对端没接或者PHY配置不对。

好了,这一章的内容就到这里。PHY芯片的架构其实不复杂,关键是理解每个模块的职责和接口的时序要求。下一章我们聊聊PHY芯片的选型实战,到时候我会分享一些具体的型号对比和测试经验。