4. Marvell PHY寄存器与MDIO访问实战

Marvell以太网PHY(如88E1512、88E1510、88E6390系列)的绝大多数配置与状态都通过MDIO接口访问内部寄存器完成。理解MDIO/MDC的时序、掌握寄存器映射结构、熟悉扩展寄存器页切换机制,是后续链路调优、自协商控制、SerDes参数调整的基础。本节从接口时序出发,逐步深入到寄存器读写与状态读取的实际操作。

一、MDIO/MDC接口时序

MDIO(Management Data Input/Output)是IEEE 802.3定义的双线管理接口:MDC为管理时钟,由MAC或管理控制器驱动;MDIO为双向数据线,在MDC上升沿采样。一次完整的寄存器访问由32位前导码(Preamble)、2位起始码(ST)、2位操作码(OP)、5位PHY地址(PHYAD)、5位寄存器地址(REGAD)、2位转向位(TA)以及16位数据(DATA)组成,共64个MDC周期。

关键时序参数:MDC频率通常不超过2.5MHz(部分器件支持到12.5MHz甚至25MHz,需查数据手册);MDIO在MDC上升沿必须稳定,建立时间典型要求≥10ns,保持时间≥10ns。读操作时,TA阶段由PHY驱动MDIO,主机需在TA第二位释放总线;写操作时TA由主机驱动。若时序不满足,常见现象是读到全1(0xFFFF)或全0,或PHY地址扫描时全部响应。

实操建议:用示波器同时抓MDC与MDIO,确认前导码为32个连续1、ST为01、读操作OP为10、写操作OP为01。若前导码不足32位,部分PHY会忽略该帧。

二、寄存器映射结构

Marvell PHY的寄存器空间分为标准寄存器(0x00~0x1F)和扩展寄存器。标准寄存器遵循IEEE 802.3 Clause 22定义,包括:

  • 0x00 控制寄存器(BMCR):自协商使能、重启自协商、速率/双工强制、掉电、隔离等。
  • 0x01 状态寄存器(BMSR):链路状态、自协商完成、能力指示。
  • 0x02/0x03 PHY标识符(PHYID1/PHYID2):用于识别具体型号,如88E1512的PHYID2通常为0x0152。
  • 0x04 自协商通告寄存器(ANAR)。
  • 0x05 自协商链路伙伴能力(ANLPAR)。
  • 0x09 千兆控制寄存器(GBCR)。
  • 0x0A 千兆状态寄存器(GBSR)。
  • 0x11 特定状态寄存器(PHY Specific Status),Marvell常用此寄存器读取实际链路速率、双工和页状态。

扩展寄存器通过页切换机制访问,典型页包括:页0(铜口寄存器)、页1(光纤/SerDes寄存器)、页2(MAC接口与时钟)、页3(LED与中断)、页4(测试与调试)、页6(扩展状态)。每页内部仍使用0x00~0x1F的寄存器地址,但物理上映射到不同的寄存器组。

三、扩展寄存器页切换

Marvell PHY通过寄存器0x16(扩展寄存器地址)和0x1D(扩展寄存器数据)实现页内寄存器访问,通过寄存器0x1F或0x16写入页号实现页切换。以88E1512为例,切换到页1的典型序列为:

// 切换到页1(光纤/SerDes页)
MDIO_Write(PHY_ADDR, 0x16, 0x0001);  // 写页号到0x16
// 读取页1内寄存器0x00
uint16_t val = MDIO_Read(PHY_ADDR, 0x00);
// 切回页0
MDIO_Write(PHY_ADDR, 0x16, 0x0000);

注意:部分Marvell PHY使用0x1F作为页寄存器,部分使用0x16,需根据具体型号确认。页切换后,标准寄存器0x00~0x1F的映射会改变,因此读写扩展寄存器后务必切回页0,否则后续对BMCR/BMSR的访问会出错。

四、读写与状态读取实战

以下以88E1512为例,演示完整的寄存器读写与状态读取流程。假设PHY地址为0x08,MDC频率为2.5MHz。

步骤1:识别PHY。读取寄存器0x02和0x03,确认PHYID。88E1512的PHYID1通常为0x0141,PHYID2为0x0152。若读到0xFFFF,检查MDC/MDIO连线、上拉电阻和PHY地址。

步骤2:软复位。向BMCR(0x00)写入0x8000,等待至少100ms,再读BMCR确认bit15自动清零。

步骤3:配置自协商。向BMCR写入0x1140(自协商使能、重启自协商、速率/双工由自协商决定),向ANAR(0x04)写入0x01E1(通告10/100/1000M全双工能力)。

步骤4:读取链路状态。轮询BMSR(0x01)的bit2(Link Status)和bit5(Auto-Negotiation Complete)。链路建立后,读取PHY Specific Status(0x11)获取实际速率和双工:bit14:13表示速率(00=10M,01=100M,10=1000M),bit12表示双工(1=全双工)。

步骤5:访问扩展页。切换到页1,读取SerDes状态寄存器,确认光纤侧链路状态;切回页0。

常见问题:读BMSR时bit2为latching low,即链路断开后第一次读会清零,需连续读两次或使用0x11寄存器获取实时状态。另外,页切换后未切回页0,会导致后续BMCR写入无效,表现为自协商无法启动。

五、寄存器访问检查表

检查项预期值/操作异常处理
PHYID1/PHYID20x0141/0x0152(88E1512)检查MDIO上拉、PHY地址、MDC频率
BMCR bit15写0x8000后自动清零确认页0、等待≥100ms
BMSR bit2链路建立后为1连续读两次,或读0x11
页寄存器0x16或0x1F写入页号查数据手册确认;操作后切回页0
MDC频率≤2.5MHz(保守值)降低频率或检查建立/保持时间
MDIO帧结构与寄存器页切换路径 MDIO 64位帧结构(读操作) Preamble 32×1 ST 01 OP 10 PHYAD 5b REGAD 5b TA Z0 DATA 16b MDC上升沿采样;TA阶段读操作由PHY驱动MDIO,主机释放 标准寄存器映射(页0) 0x00 BMCR 0x01 BMSR 0x02/03 PHYID 0x04 ANAR 0x11 PHY Status 扩展寄存器页切换 页0(铜口) 0x16 ← 0x0000 页1(光纤/SerDes) 0x16 ← 0x0001 页2(MAC/时钟) 0x16 ← 0x0002 页3(LED/中断) 0x16 ← 0x0003 切页 切页 切页 操作完成后必须切回页0,否则BMCR/BMSR访问失效 链路状态读取路径 读BMSR(0x01) bit2=1? bit5=1? 读0x11获取速率/双工 bit14:13速率 bit12双工

掌握上述流程后,即可对Marvell PHY进行完整的寄存器级控制。实际调试中,建议先用MDIO扫描确认PHY地址,再读取PHYID验证型号,然后按“复位→配置→读状态”的顺序操作。每次页切换后记录当前页号,避免因页残留导致后续配置失效。对于88E6390等交换芯片内置PHY,页切换寄存器可能为0x1F,且部分扩展页需要先解锁,具体以数据手册为准。