1. PHY芯片基础:以太网硬件架构中的位置与接口标准
1.1 PHY芯片在以太网硬件架构中的位置
在嵌入式以太网系统中,PHY(Physical Layer)芯片是连接数字链路层(MAC)与物理传输介质(网线、光纤)的桥梁。它负责将MAC发送的数字信号编码为适合在铜缆或光纤上传输的模拟信号,同时将接收到的模拟信号解码为数字比特流。
典型的以太网硬件架构分为三层:
- MAC层(Media Access Control):集成在SoC或CPU内部,负责帧封装、地址过滤、CRC校验。
- PHY层(Physical Layer):独立芯片或集成在SoC内部,负责信号编码/解码、时钟恢复、链路检测。
- 介质接口:RJ45变压器、网线或光纤模块。
关键概念:MAC与PHY之间通过标准接口(MII/RMII/GMII/RGMII)连接,而PHY与RJ45之间通过MDI(Medium Dependent Interface)连接。Linux内核驱动中,MAC驱动通过
phy_device框架与PHY芯片交互。
1.2 MII / RMII / GMII / RGMII 接口标准对比
MAC与PHY之间的接口标准决定了数据传输速率、引脚数量、时钟频率和设计复杂度。以下是四种主流接口的详细对比:
| 接口标准 | 数据位宽 | 时钟频率 | 引脚数 | 最大速率 | 适用场景 |
|---|---|---|---|---|---|
| MII | 4位 | 25 MHz (100M) 2.5 MHz (10M) |
16~18 | 100 Mbps | 传统100M以太网,引脚多但时序宽松 |
| RMII | 2位 | 50 MHz | 9~10 | 100 Mbps | 引脚少,适合PCB空间受限的设计 |
| GMII | 8位 | 125 MHz | 24 | 1000 Mbps | 千兆以太网,引脚多,时序要求高 |
| RGMII | 4位 (DDR) | 125 MHz (DDR) | 12~14 | 1000 Mbps | 千兆以太网,引脚减半,广泛用于现代SoC |
工程经验:在嵌入式Linux项目中,RGMII是目前最主流的千兆接口选择。它通过DDR(双沿采样)技术,在125 MHz时钟下用4位数据线实现千兆速率,相比GMII节省了一半引脚。但RGMII对PCB走线等长和时钟抖动要求更高,调试时需重点检查TXD/RXD与TX_CLK的相位关系。
1.3 接口信号定义与关键差异
每种接口都包含数据发送、数据接收、时钟、控制信号四类。以下是各接口的核心信号对比:
| 信号类别 | MII | RMII | GMII | RGMII |
|---|---|---|---|---|
| 发送数据 | TXD[3:0] | TXD[1:0] | TXD[7:0] | TXD[3:0] (DDR) |
| 接收数据 | RXD[3:0] | RXD[1:0] | RXD[7:0] | RXD[3:0] (DDR) |
| 发送时钟 | TX_CLK (PHY提供) | REF_CLK (50MHz) | GTX_CLK (MAC提供) | TX_CLK (MAC提供) |
| 接收时钟 | RX_CLK (PHY提供) | REF_CLK (共用) | RX_CLK (PHY提供) | RX_CLK (PHY提供) |
| 控制信号 | TX_EN, RX_DV, TX_ER, RX_ER, CRS, COL |
TX_EN, CRS_DV, RX_ER |
TX_EN, RX_DV, TX_ER, RX_ER, CRS, COL, GTX_CLK |
TX_CTL, RX_CTL |
调试注意:RMII接口使用共用50 MHz参考时钟(REF_CLK),必须由外部晶振或MAC提供,PHY不能独立产生。如果REF_CLK不稳定或频率偏差超过±50 ppm,将导致链路无法建立。RGMII的TX_CLK由MAC提供,调试时需用示波器确认时钟占空比是否在45%~55%范围内。
1.4 PHY与MAC的交互流程
PHY与MAC之间的交互分为数据通路和管理通路两条线。数据通路负责收发网络帧,管理通路(MDIO)负责配置和状态查询。
1.4.1 数据通路交互流程
- 发送流程:
- MAC将待发送的帧数据通过接口总线(如RGMII)发送给PHY。
- PHY对数据进行4B/5B或8B/10B编码(取决于速率),添加前导码和定界符。
- PHY将数字信号转换为差分模拟信号,通过MDI接口发送到网线。
- 接收流程:
- PHY从网线接收差分模拟信号,进行时钟恢复和信号均衡。
- PHY解码为数字比特流,去除前导码,通过接口总线发送给MAC。
- MAC进行CRC校验、地址过滤,将有效帧送入DMA缓冲区。
- 链路协商:
- 上电或链路断开时,PHY自动与对端设备进行Auto-Negotiation(自动协商)。
- 协商内容包括速率(10/100/1000M)、双工模式(半双工/全双工)、流控能力。
- 协商完成后,PHY通过中断或状态寄存器通知MAC。
1.4.2 管理通路交互流程(MDIO)
MDIO总线是MAC访问PHY内部寄存器的唯一通道。Linux内核通过mdio_bus框架实现读写操作:
// MDIO 读操作时序(简化)
// 1. MAC 发送前导码(32个1)
// 2. MAC 发送起始码(01)
// 3. MAC 发送操作码(10 表示读)
// 4. MAC 发送 PHY 地址(5位,0x00~0x1F)
// 5. MAC 发送寄存器地址(5位,0x00~0x1F)
// 6. MAC 插入 2 个时钟周期的 turnaround
// 7. PHY 返回 16 位寄存器数据
// Linux 内核驱动中的 MDIO 读写函数示例
static int phy_read(struct phy_device *phydev, u32 regnum) {
struct mii_bus *bus = phydev->mdio.bus;
int val;
mutex_lock(&bus->mdio_lock);
val = bus->read(bus, phydev->mdio.addr, regnum);
mutex_unlock(&bus->mdio_lock);
return val;
}
static int phy_write(struct phy_device *phydev, u32 regnum, u16 val) {
struct mii_bus *bus = phydev->mdio.bus;
int ret;
mutex_lock(&bus->mdio_lock);
ret = bus->write(bus, phydev->mdio.addr, regnum, val);
mutex_unlock(&bus->mdio_lock);
return ret;
}
关键寄存器:PHY芯片的寄存器空间遵循IEEE 802.3标准,前16个寄存器(0x00~0x0F)为基本寄存器,所有PHY芯片必须实现。其中最重要的有:
- BMCR (0x00):基本控制寄存器,控制复位、回环、速率、双工、自动协商使能。
- BMSR (0x01):基本状态寄存器,指示链路状态、自动协商完成、远端故障。
- PHYIDR1/2 (0x02~0x03):PHY芯片标识符,用于驱动匹配。
- ANAR (0x04):自动协商通告寄存器,通告本端能力。
- ANLPAR (0x05):链路伙伴能力寄存器,读取对端能力。
1.5 典型PHY寄存器配置流程(Linux内核视角)
在Linux内核中,PHY驱动的初始化流程通常如下:
- PHY探测:MDIO总线枚举PHY地址,读取PHYIDR1/2识别芯片型号。
- 软复位:写BMCR寄存器bit15为1,等待复位完成(BMSR bit1清零)。
- 自动协商配置:写ANAR寄存器通告本端能力,写BMCR使能自动协商(bit12=1)。
- 等待协商完成:轮询BMSR bit5(自动协商完成),超时则回退到默认配置。
- 读取协商结果:读取BMSR和ANLPAR,确定最终速率和双工模式。
- MAC侧适配:根据协商结果配置MAC控制器的接口速率和双工模式。
- 启动数据通路:使能PHY的发送/接收,启动MAC的DMA传输。
调试技巧:当PHY链路无法建立时,首先通过
mdio_read工具(如mii-diag或phy_tool)读取BMSR寄存器,检查bit2(链路状态)是否为1。如果链路状态为0,说明物理层未连通,应检查网线、变压器、PHY供电和时钟。如果链路状态为1但网络不通,则需检查自动协商结果是否匹配。
1.6 本章小结
- PHY芯片位于MAC与物理介质之间,负责信号编解码和链路管理。
- MII/RMII/GMII/RGMII四种接口在引脚数、时钟频率和速率上差异显著,RGMII是当前千兆设计的主流选择。
- PHY与MAC通过数据总线(MII/RGMII等)传输网络帧,通过MDIO管理总线配置寄存器。
- Linux内核通过
phy_device和mdio_bus框架抽象PHY驱动,开发者只需实现read/write回调并注册PHY驱动即可。 - 掌握PHY基础寄存器和自动协商流程,是后续调试PHY寄存器配置的必备前提。