第三章 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芯片的选型实战,到时候我会分享一些具体的型号对比和测试经验。