第1章 KSZ9031芯片概述与RGMII接口简介
做嵌入式网络开发这些年,我接触过不少PHY芯片。Micrel(现Microchip)的KSZ9031是让我印象很深的一颗。为什么?因为它兼容性强、文档清晰,而且RGMII接口的坑相对少——说白了,它很“规矩”。
咱们这门课《KSZ9031 RGMII项目实战教程》,就从这颗芯片讲起。第一章不急着上手调代码,先把芯片和接口的基本概念理清楚。你要是跳过这章直接看驱动,后面遇到信号不稳定、速率上不去,八成会回来翻这一章的。嗯,我当年就吃过这种亏。
1.1 KSZ9031是什么
KSZ9031是一颗单端口10/100/1000BASE-T以太网PHY芯片。它支持GMII、RGMII、MII三种MAC接口,内部集成了PLL、ADC/DAC、DSP等模拟前端。咱们项目里只用RGMII,所以其他接口不展开。
它的关键参数我列个表,大家先混个眼熟:
| 参数 | 典型值 | 备注 |
|---|---|---|
| 工作电压 | 3.3V / 1.8V (核心1.2V) | I/O电压与VDDIO关联 |
| RGMII时钟频率 | 125MHz (1000Mbps) 25MHz (100Mbps) 2.5MHz (10Mbps) |
DDR双边沿采样 |
| MAC接口模式 | GMII / RGMII / MII | 通过引脚或寄存器配置 |
| MDIO地址 | 0x00 ~ 0x1F | 默认地址可通过strap引脚设定 |
| 片内延迟调整 | TX/RX各2.0ns步进 | RGMII时钟相位补偿 |
| 工作温度 | -40 ~ +85°C | 工业级 |
我早期做一个平板项目时,选了一颗便宜的PHY,结果1000M死活不通。换KSZ9031后,同一块板子、同一版布线,一贴上去就能Link Up。所以后来我只要涉及千兆以太网,优先考虑这颗片子。
1.2 RGMII接口基础
RGMII(Reduced GMII)是千兆以太网中应用最广的MAC-PHY接口。它比GMII少了将近一半的信号线——数据线从8位缩到4位,控制信号也从独立引脚合并成一根。为什么会这样?因为它在时钟的上升沿和下降沿各采一次数据,也就是DDR(双倍数据速率)传输。
下图是我整理的一个典型KSZ9031与MAC的RGMII连接拓扑:
从图上能看到,MAC发方向上有TX_CLK、TX_CTL和TXD[3:0];收方向上只有RX_CLK、RX_CTL和RXD[3:0]。总共才9根线(含时钟),比GMII的25根简单太多了。布线时只要注意等长约束,电磁兼容性也要好不少。
1.3 时钟、数据与控制信号
RGMII的采样机制是DDR,即时钟的上升沿和下降沿各采一组数据。Tx方向:上升沿采TXD[3:0]低4位,下降沿采高4位(TXD[7:4])。控制信号TX_CTL也一样,上升沿代表TX_EN,下降沿代表TX_ER。收方向同理。
这里有一个容易踩坑的地方:时钟与数据的相位关系。RGMII协议要求MAC输出的时钟与数据是中心对齐的,但KSZ9031内部默认对接收到的时钟做了180°移相。很多MAC(比如i.MX6)则是源同步输出,数据与时钟边沿对齐。这就产生了时序冲突。
我曾经在第一个项目中,按照芯片手册直接连,结果1000M模式下行不通。后来用示波器一看,TX_CLK的上升沿正好对齐在数据变化点上,采样不稳定。解决办法:开启KSZ9031内部的RX时钟延迟(register 0x1F, bit[6:4]),或者让MAC端调整相位。
KSZ9031提供一个很实用的功能:内部延迟调整。通过寄存器0x1F的RGMII Pad Skew Control,可以在TX和RX时钟上各加0.5~2.0ns的延迟,步进0.5ns。我一般先在调试阶段把这个值设为0x77(TX延迟1.5ns, RX延迟1.5ns),等于给两端各留一个裕量。你想想看,一个时钟周期才8ns(125MHz),0.5ns的偏差就可能让数据出错。
1.4 实际项目中的注意事项
下面是我积累的几个要点,写成清单方便你对照检查:
- PCB走线等长:RGMII的9根信号线必须在同一个层,组内长度差控制在±50mil以内。尤其TX_CLK和TX_CTL、TXD之间,差太多会导致skew超限。
- 参考电压VDDIO:KSZ9031的VDDIO必须与MAC侧的I/O电压一致。比如MAC是3.3V,那PHY的VDDIO也要接3.3V;如果MAC是1.8V,VDDIO就是1.8V。混接会烧I/O。
- 复位时序:硬件复位后,至少要等待5ms才能访问MDIO。我曾经因为复位后马上读寄存器,结果读到0xFFFF,以为是芯片坏了,折腾半天。
- MDIO上拉:MDIO是开漏总线,需要外接2kΩ~10kΩ上拉电阻到VDDIO。很多同学忘记加上拉,导致无法通信。
小技巧:在调试阶段,我习惯先用示波器抓一下TX_CLK和RXD[3:0]的波形。如果能看到125MHz的时钟,并且数据线上有规律的跳变(比如发送0x5555),说明MAC侧基本正常。如果时钟没有,先查电源和晶振;如果时钟有,数据全是0x00,那就调延迟。
1.5 芯片内部功能框图
虽说不深入寄存器,但还是要对内部架构有个概念。KSZ9031主要包含这几个模块:
| 模块 | 功能 | 说明 |
|---|---|---|
| RGMII/GMII接口 | MAC侧信号协议处理 | 支持RGMII ID模式(内部延迟) |
| PLL + 时钟恢复 | 从接收信号中恢复时钟 | 需要外部25MHz晶振或差分时钟 |
| 10/100/1000 Base-T | 物理层编码、解码、信号整形 | 包含DSP、ADC/DAC、自动协商 |
| 管理接口 | MDIO/MDC寄存器访问 | Clause 22 / Clause 45可选 |
| 电压调节器 | 内部1.2V核心供电 | VDDIO和VDDC需外部供电 |
对于驱动开发,我们最常打交道的是“管理接口”和“RGMII接口”这两个模块。后面的章节会逐个讲解寄存器读写、中断配置、PHY状态监控等。
个人习惯:我在开始一个新平台移植时,先确认MDIO能正常读写。写一个简单的循环:对PHY寄存器0(Basic Control)写0x8000,读回来确认是软复位生效,再写0x1000(自动协商使能)。MDIO通了,后面所有寄存器操作都是水到渠成的事。