MDIO接口介绍
MAC 和PHY 芯片有一个配置接口,即MDIO 接口,可以配置PHY 芯片的工作模式以及获取PHY 芯片的若干状态信息。PHY 芯片内部包含一系列寄存器,用户通过这些寄存器来配置PHY 芯片的工作模式以及获取PHY 芯片的若干状态信息,如连接速率、双工模式、自协商状态等。
MDIO 接口也称为SMI 接口(Serial Management Interface,串行管理接口),包括ETH_MDC(数据管理时钟)和ETH_MDIO(数据管理输入输出)两条信号线。ETH_MDC 为ETH_MDIO 提供时钟,ETH_MDC的最大时钟不能超过12.5Mhz。ETH_MDIO 为双向数据引脚,既用于发送数据,也用于接收数据。
MDIO接口协议
MDIO接口的协议如下:
Preamble:32 位前导码,由MAC 端发送32 位逻辑“1”,用于同步PHY 芯片。
ST(Start of Frame):2 位帧开始信号,用01 表示。
OP(Operation Code):2 位操作码,读:10 写:01。
PHYAD(PHY Address):5 位PHY 地址,用于表示与哪个PHY 芯片通信,因此一个MAC 上可以连接多个PHY 芯片。
REGAD(Register Address):5 位寄存器地址,可以表示共32 位寄存器。
TA(Turnaround):2 位转向,在读命令中,MDIO 在此时由MAC 驱动改为PHY 驱动,在第一个TA位,MDIO 引脚为高阻状态,第二个TA 位,PHY 将MDIO 引脚拉低,准备发送数据;在写命令中,不需要MDIO 方向发生变化,MAC 固定输出2’b10,随后开始写入数据。
DATA:16 位数据,在读命令中,PHY 芯片将读到的对应PHYAD 的REGAD 寄存器的数据写到DATA中;在写命令中,PHY 芯片将接收到的DATA 写入REGAD 寄存器中。需要注意的是,在DATA 传输的过程中,高位在前,低位在后。
IDLE:空闲状态,此时MDIO 为无源驱动,处于高阻状态,但一般用上拉电阻使其上拉至高电平。
MDIO读时序
MDIO 接口读时序图如下图所示:
上图是以PHY 地址为0x01,从寄存器地址0x00 读出数据为例。
需要注意的是,在读时序整个过程中,MDC 时钟由MAC侧发出。
整个读时序可以分为三个部分
1. MDIO上MAC发出,PHY读入
MAC控制发出前导码(32位1)+帧开始(01)+操作码(10)+PHY地址+寄存器地址。
此时PHY 在MDC的上升沿采集MDIO数据,为了保证数据的稳定性,MAC在MDC的下降沿更新MDIO数据。(上图中的竖线对应的即是采集时间)
2. Turn around MDIO上PHY发出,MAC读入
在Turn around 部分时,MDIO由MAC控制改为PHY 控制,此时MAC 在MDC的上升沿采集MDIO数据,为了保证数据的稳定性,PHY在MDC的下降沿更新MDIO数据。(刚好反过来)。在第一个TA 位,MDIO 引脚为高阻状态,第二个TA 位为低电平,表示PHY 芯片成功响应,并且接下来会输出16 位寄存器数据;而如果第二个TA 位处于高电平,则PHY 芯片响应失败,有可能PHY 地址不正确或者其它时序的错误。
3. PHY发送从指定寄存器读出的数据 MDIO上PHY发出,MAC读入
PHY输出16 位寄存器数据 。
在读操作结束后,MAC 将MDIO 引脚输出高阻,此时MDIO 引脚的外部上拉电阻会将MDIO 引脚拉高,此时MDIO 接口处于空闲状态。
MDIO写时序
写时序相对简单一些,MDIO 接口写时序图如下图所示:
上图是以PHY 地址为0x01,向寄存器地址0x00 写入0x1340 为例。
在整个写操作过程中,MDC 时钟和MDIO 引脚一直由MAC 端驱动,按照MDIO 接口写通信协议开始传输数据。需要注意的是,PHY 在MDC 时钟的上升沿采集数据,为保证数据的稳定传输,MAC 在MDC 的下降沿将数据更新至MDIO 引脚。在写操作结束后,MAC 将MDIO 引脚输出高阻,此时MDIO 引脚的外部上拉电阻会将MDIO 引脚拉高,此时MDIO 接口处于空闲状态。
注:文章参考正点原子FPGA教程,本人正在学习FPGA相关知识,在此记录一下~~