2、链路协商概念:自协商(Auto-Negotiation)原理、速度与双工模式协商过程

自协商(Auto-Negotiation)是 IEEE 802.3 标准中定义的一项关键技术,它允许连接在共享链路两端的 PHY 设备自动选择双方都能支持的最高性能工作模式(速度与双工)。该机制通过链路启动或中断恢复时的电气脉冲序列完成协商,无需人工干预。

2.1 自协商的核心目标

  • 自动匹配最高性能:在两端能力集中选择“最大公约数”,优先保证链路建立,再追求最高速率与全双工。
  • 向后兼容:支持 10BASE-T、100BASE-TX、1000BASE-T 等不同代际的以太网标准。
  • 故障恢复:当链路中断或对端设备更换时,自动重新协商,无需复位或人工配置。
调试要点:在嵌入式调试中,若发现链路协商失败或协商到非预期模式(如 10M 半双工),应首先检查自协商是否被硬件或驱动强制关闭,以及两端能力集是否匹配。

2.2 自协商工作原理

自协商基于 FLP Burst(Fast Link Pulse Burst) 机制。在链路空闲或启动阶段,PHY 发送一组编码脉冲序列,其中包含本端支持的速度与双工能力信息。对端 PHY 接收并解析该序列后,与自身能力集进行“与”运算,选出最优公共模式。

关键步骤:
  1. 能力宣告:两端 PHY 通过 FLP Burst 发送本端能力寄存器(如 1000BASE-T 全双工、100BASE-TX 半双工等)。
  2. 能力比较:接收端解析 FLP 中的“技术能力字段”,与本端支持的能力进行优先级排序。
  3. 模式选择:按照 IEEE 定义的优先级表(速率优先,同速率下全双工优先)选择最高公共模式。
  4. 确认与锁定:两端交换确认码(Ack),锁定协商结果,进入正常数据收发状态。
自协商流程(FLP Burst 交互) PHY A 发送 FLP PHY A 解析 FLP 能力比较与选择 确认锁定 PHY B 发送 FLP PHY B 解析 FLP 能力比较与选择 确认锁定 FLP 脉冲序列交换

2.3 速度与双工模式协商过程

协商过程严格遵循 IEEE 802.3 定义的优先级表。当两端能力集存在多个交集时,按以下顺序选择:

优先级 速度 双工模式 典型应用
1(最高) 1000BASE-T 全双工 千兆以太网
2 1000BASE-T 半双工 极少使用
3 100BASE-TX 全双工 快速以太网
4 100BASE-TX 半双工 兼容旧设备
5 10BASE-T 全双工 低速链路
6(最低) 10BASE-T 半双工 最低兼容模式
常见调试陷阱:如果一端强制设为 100M 全双工,另一端开启自协商,则自协商端会因无法收到 FLP 而回退到“并行检测”模式,最终可能协商为 100M 半双工,导致链路性能下降或丢包。调试时应优先检查两端自协商状态是否一致。

2.4 并行检测(Parallel Detection)

当对端设备不支持自协商(如老式 10BASE-T 集线器)时,本端 PHY 会启用并行检测机制:通过检测链路上是否存在正常链路脉冲(Normal Link Pulse, NLP)或特定的空闲信号,直接推断对端速度,并默认选择半双工模式。

并行检测流程 未收到 FLP 检测 NLP / 空闲信号 推断速度 + 半双工 结果:链路建立,但双工模式固定为半双工

2.5 自协商能力寄存器结构

在 PHY 芯片中,自协商能力通过标准 MII 管理寄存器(MMD)暴露给 MAC 层或驱动。核心寄存器包括:

寄存器地址 名称 功能描述
0 BMCR(基本模式控制寄存器) Bit 12:自协商使能;Bit 13:重启自协商
1 BMSR(基本模式状态寄存器) Bit 5:自协商完成标志;Bit 3:链路状态
4 ANAR(自协商广告寄存器) 本端宣告的能力集(速度+双工)
5 ANLPAR(自协商链路伙伴能力寄存器) 对端宣告的能力集(只读)
6 ANER(自协商扩展状态寄存器) 并行检测状态、协商失败原因
调试命令示例(Linux mdio 工具):
# 读取 PHY 0 的 ANAR 寄存器(地址 4)
mdio eth0 0x04

# 读取 ANLPAR 寄存器(地址 5),查看对端能力
mdio eth0 0x05

# 重启自协商(设置 BMCR 的 Bit 13 和 Bit 12)
mdio eth0 0x00 0x1200

2.6 协商失败常见原因

  • 电缆故障:线缆断芯、接触不良导致 FLP 脉冲丢失。
  • 对端自协商关闭:对端强制设置速度/双工,本端无法完成能力交换。
  • 能力集不匹配:两端无公共交集(如一端仅支持 1000M,另一端仅支持 10M)。
  • PHY 寄存器配置错误:ANAR 寄存器被意外清零或写入无效值。
  • 电磁干扰:强噪声环境导致 FLP 脉冲被误判。
实战建议:在嵌入式系统启动阶段,应轮询 BMSR 寄存器的 Bit 5(自协商完成)和 Bit 3(链路状态),并设置超时重试机制(通常 2~3 秒)。若超时未完成,可尝试读取 ANER 寄存器获取失败原因,或手动重启自协商。