2.5G PHY master和slave的tx/rx控制
在 2.5GBASE-T 等高速以太网链路中,**Master 和 Slave 在建立 Link(链路)过程中对 TX(发射)和RX(接收)的控制**关系到链路能否正常同步和训练成功。这一点非常关键,尤其是在开发 PHY 驱动或调试裸机系统时。
下面我会详细说明 Master 和 Slave 在 Link 建立各阶段中 **TX 和 RX 的控制机制**、**时钟来源**、**状态判断** 和 **常见问题**。
---
## 🔧 一、基本原则:谁提供时钟?
在 2.5GBASE-T(Clause 126)中,**Master 提供时钟,Slave 使用该时钟进行恢复**:
| 角色 | TX 数据参考时钟 | RX 时钟来源 |
| ------ | ----------- | -------------- |
| Master | 本地晶振 | 从 PHY 接收的数据中恢复 |
| Slave | 从 Master 恢复 | 使用 RX 接收到的时钟 |
➡️ 因此,在链路未建立前,**Slave 的 TX 是不可用/失效的**,直到其从 Master 的 RX 信号中成功恢复时钟。
---
## 📶 二、TX/RX 控制在各阶段的行为
### ✅ 阶段 1:初始上电 / 自协商(Auto-Negotiation)
| 项目 | Master | Slave |
| ----- | ----------------------- | ----- |
| TX 行为 | 发出 Auto-Negotiation FLP | 同上 |
| RX 行为 | 接收对方的 FLP | 同上 |
| 时钟 | 本地时钟 | 本地时钟 |
| 说明 | 双方发出脉冲,能力协商,无需精确时钟对齐 | |
🔧 此阶段属于低速、码片级交互,时钟容差大,Master/Slave 角色还未协商完成。
---
### ✅ 阶段 2:进入 PMA Training(物理训练)
**角色已经确定,Master 开始主导整个训练流程**:
| 信号方向 | Master(主) | Slave(从) |
| ---- | --------------------- | ------------------------- |
| TX | 连续发出 Training Pattern | 初期无法发 TX,等待恢复时钟 |
| RX | 监测对方的 Training Signal | 使用 Master 的 TX 信号恢复 RX 时钟 |
| 时钟源 | 本地晶振 | 从 RX 信号中恢复出的时钟 |
| 关键点 | 主动引导训练过程 | 被动调节均衡器、采样、恢复时钟 |
🔍 在 Clause 126.5.2 有明确说明:
> "The Master PHY must transmit a continuous Training pattern during training. The Slave PHY shall use this to recover timing and train its receiver."
➡️ 所以驱动开发中,**Slave 端的 TX 不应该启用,直到其 RX 完成时钟恢复。**
---
### ✅ 阶段 3:Training 成功,进入 Link Ready
此阶段说明双方已经完成时钟同步、EQ 校准、信道识别:
| Master TX | Slave RX |
| ---------------------- | ----------- |
| 发送数据或 Alignment Marker | 成功接收,进入 PCS |
| Slave TX | Master RX |
| ---------- | --------- |
| 现在可以正常发出数据 | 接收成功 |
此时:
* Slave TX 启动的前提是 **它从 Master 成功恢复了时钟**;
* PMA Training 完成标志置位;
* PCS 也开始 128b 或 64b 同步。
---
## ⚠️ 常见误区 / 驱动陷阱
### ❌ 启动 Slave TX 太早
* 裸机驱动中误以为自协商完成就能启用 Slave 的 TX;
* 实际上 TX 时钟未恢复,数据发不出或乱码。
### ❌ Link Status 判断过早
* Training 尚未完成,状态位未拉高,MAC 层无法收包;
* 正确做法是:等待 PMA Training 状态寄存器置位。
### ❌ 没区分主从角色
* 若使用非对称配置(两个 Slave),将无法建链;
* 可通过 Clause 45 的 Master/Slave 寄存器判断并调试。
---
## 🧪 PHY 驱动中常用状态判断方法
你可以用以下代码轮询主从状态、链路状态、TX 是否可用:
```c
uint16_t pma_status = mdio_read(phy_addr, 3, 0x0011);
if (pma_status & (1 << 2)) {
printf("PMA Training complete.\n"); // 可使能 Slave TX
}
uint16_t link_status = mdio_read(phy_addr, 1, 0x0001);
if (link_status & (1 << 2)) {
printf("Link Up.\n");
}
```
---
## 📘 总结
| 阶段 | TX 控制(Master) | TX 控制(Slave) | 注意事项 |
| ------------ | ------------- | ------------ | ------------ |
| 自协商阶段 | 可发 | 可发 | 不依赖精准时钟 |
| PMA Training | 必须发 Training | 禁止发(等时钟) | Master 主导 |
| Training 完成 | 可正常发数据 | 可启用 TX | Slave 必须时钟恢复 |
| Link Up | 正常收发 | 正常收发 | PCS、FEC 启用 |
---
如果你有具体使用的 PHY 芯片(如 RTL8221B、YT8521、AR8035 等),我可以给你它的主从角色状态寄存器、TX 启用机制、恢复时钟检测方式等信息,甚至代码模板。
要不要继续?