本文主要总结MDIO接口相关知识。
MII接口
MII(Media Independent Interface)(介质无关接口)或称为媒体独立接口,MII接口是MAC与PHY连接的标准接口。它是IEEE802.3的以太网行业标准。MII接口提供了MAC与PHY之间、PHY与STA(Station Management)之间的互联技术。“媒体独立”表明在不对MAC硬件重新设计或替换的情况下,任何类型的PHY设备都可以正常工作。它是一种用于将不同的PHY与相同的网络控制器(MAC)相连接的通用总线。
STA(Station management entity):管理实体,一般为MAC或CPU,通过SMI(Serial Manage Interface)对PHY的行为、状态进行管理和控制,而具体管理和控制动作是通过读写PHY内部的寄存器实现的。
MII和MDIO关系
MII接口包括一个数据接口和一个MAC和PHY之间的管理接口(MDIO接口)。数据接口包括分别用于发送器和接收器的两条独立信道,每条信道都有自己的数据时钟和控制信号。
管理接口是个双信号接口:一个是时钟信号,一个是数据信号。通过管理接口,上层能监视和控制PHY。
其中时钟信号就是MDC,它是由MAC输出,是非周期性的,即不要求提供固定频率的时钟,对于PHY芯片则作为输入,在上升沿触发MDIO的读写。MDC的时钟频率可以是DC-2.5MHz,即最小的时钟周期为400ns。
数据信号就是MDIO,它是一根双向的数据线,MAC作为master,PHY作为slave。在写PHY寄存器的时候,由MAC驱动MDIO向PHY写入数据;在读PHY寄存器时,前半段由MAC驱动发送寄存器地址,后半段由PHY驱动回复寄存器的值。
以10M,100M端口为例,MII和MDIO结构图如下:

IEEE802.3在两个章节定义了PHY的管理接口:
1、22.2.4 Management functions
2、45. Management Data Input/Output (MDIO) Interface
Clause22和Clause 45
Clause22定义GE及以下速率(10/100/1000M)PHY的管理接口;
Clause45定义10G及以上速率PHY的管理接口;
STA通过管理接口对PHY寄存器进行读写操作。
Clause 22帧
Clause 22帧格式:
1)PRE
PRE即preamble。MAC访问PHY寄存器之前,连续发送32个”1“,用于和PHY进行同步。
2)ST
ST即Start of frame,是2个固定的比特0和1。
3)OP
OP即Operation Code。读操作的操作码是10,写操作的操作码是01。
4)PHYAD
PHYAD即PHY address,表示5个bit位的PHY地址。PHY地址是由硬件连接决定的。硬件设计时,把PHY芯片的引脚电平上拉或者下拉,就可以设定PHY的地址。首先发送接收高位地址。
5)REGAD
REGAD即Register Address,表示PHY内部的寄存器地址。MII管理接口中,寄存器地址是5位的。首先发送接收高位地址。
6)TA
TA即Turn Around。寄存器地址字段和管理帧的数据字段之间有2bit的转换间隙,以避免读操作时冲突。读操作的TA域从高阻态变为0,写操作的TA域则是从1变为0。如下图所示:

高阻态是一个数字电路里常见的术语,指的是电路的一种输出状态,既不是高电平也不是低电平,如果高阻态再输入下一级电路的话,对下级电路无任何影响,和没接一样,如果用万用表测的话有可能是高电平也有可能是低电平,随它后面接的东西定的。
7)DATA
数据域为16bit,和PHY寄存器的宽度一致。读操作中,DATA域是从PHY层读到的数据;写操作中,DATA域是要写入PHY寄存器的值。
Clause 22限制
由上可知,Clause 22只有5bit的寄存器空间和PHY地址空间,这样导致能访问的PHY寄存器只有32个。千兆以下的PHY比较简单,只有32个寄存器,MAC通过Clause 22管理接口访问这些PHY寄存器已经足够,但是10G以上的PHY比较复杂,PHY层被划分为多个子层,PCS子层、PMA子层、PMD子层,Clause 22很难满足要求。

Clause 22扩展
前期,对于PHY上述限制,采用的一个比较通用的做法是单独设立一个PAGE寄存器,然后将寄存器映射到不同的PAGE上,每个PAGE是32Word空间。
以88E1111为例,我们需要首先在Page寄存器22写值,选择对应的Page,然后再访问该Page上的寄存器。虽然这个方案暂时解决了寄存器空间不够的问题,但是由于IEEE没有对应的规范,各个厂商实现的都不一样,驱动需要根据不同的PHY芯片写不同的接口代码。
88E1111寄存器如下图:
Clause 45
终于在2000年的时候IEEE发布了IEEE 802.3 Clause 45规范来解决这个问题。
Clause 45帧格式:
Clause45 管理接口硬件上和Clause 22管理接口一致,但是管理帧结构发生了变化。通过MDIO接口访问PHY寄存器时,需要知道端口地址、MMD设备地址和寄存器地址。
和Clause 22管理接口相比,Clause 45接口的读和写操作变复杂了,操作一个寄存器需要完成两步,首先要传送寄存器地址信息,然后才能读或者写对应的寄存器。
和Clause 22管理接口的管理帧相比,Clause 45接口的管理帧的主要差异如下:
1)ST
ST即Start of frame。Clause 22管理接口的管理帧的ST域是01,Clause 45接口管理帧中的ST域的值是00。
2)PRTAD
PRTAD即Port Address。PRTAD和Clause 22管理接口的管理帧的PHY address一致。
3)DEVAD
DEVED是Device Address,该域是MMD设备的5位ID。这个域对应Clause 22管理接口的管理帧的寄存器地址域。
4)ADDRESS/DATA
MDIO接口的地址操作中,这个域用来传送需要访问的寄存器的16位地址。
Clause 22管理接口中,寄存器地址只有5位;Clause 45接口中,寄存器地址变为16位。
Clause 45接口的读写操作中,这个域是读出或者待写入的数据。
Clause 45接口,单个STA通过单个MDIO接口最多可以访问32个PHY,每个PHY最多支持32个MMD,每个MMD最多可支持65536个寄存器。
Clause 45结构:
MMD(MDIO Manageable Device):MDIO管理设备,通过IEEE802.3标准Clause 45规定的MDIO接口进行管理。在Clause 45接口的定义中,PHY层被划分为多个MMD设备,每个MMD内部的寄存器的地址分配和Clause 22管理接口中的地址类似,不过寄存器的数量多出很多。
IEEE 802.3标准规定的MMD设备地址:
读写时序
Clause 22
读时序:
1、MDIO master 驱动输出前导符,前导符为高电平1。连续发送32个“1”,用于和PHY进行同步。
2、发送2bit的固定的启动开始标志,01b
3、发送2bit的操作码,读是10b
4、发送5bit的Phy addr,通过该地址来识别对应的PHY芯片
5、发送5bit的寄存器地址,寻址范围是32 Word
6、对于读时序的前半部分由MDIO master侧驱动 ,通过一个高阻态bit time切换到slave驱动,slave驱动后驱动一个bit的0
7、slave 输出寻址的寄存器和16bit的值
8、总线进入高阻态,读时序结束
写时序:
1、MDIO master 驱动输出前导符,前导符为高电平1。连续发生32个“1”,用于和PHY进行同步。
2、发送2bit的固定的启动开始标志,01b
3、发送2bit的操作码,写是01b
4、发送5bit的Phy addr,通过该地址来识别对应的PHY芯片
5、发送5bit的寄存器地址,寻址范围是32 Word
6、发送2bit固定的周转码,为10b
7、输出要写入寄存器的16bit值
8、总线进入高阻态,写时序结束
Clause 45
设置地址时序:
1、MDIO master驱动输出前导符,前导符为高电平1。连续发送32个“1”,用于和PHY进行同步
2、发送2bit的固定的启动开始标志,00b
3、发送2bit的操作码,写地址是00b
4、发送5bit的Phy addr,通过该地址来识别对应的PHY芯片
5、发送5bit的设备地址,寻址范围是32 Word。(可以理解为PHY的二级地址)
6、发送2bit固定的周转码,为10b
7、发送要写入的16bit的地址值
8、总线进入高阻态,写地址时序结束
写时序:
1、MDIO master驱动输出前导符,前导符为高电平1。连续发生32个“1”,用于和PHY进行同步
2、发送2bit的固定的启动开始标志,00b
3、发送2bit的操作码,写操作是01b
4、发送5bit的Phy addr,通过该地址来识别对应的PHY芯片
5、发送5bit的设备地址,寻址范围是32 Word。(可以理解为PHY的二级地址)
6、发送2bit固定的周转码,为10b
7、发送要写入的16bit的地址值
8、总线进入高阻态,写时序结束
读时序:
1、MDIO master驱动输出前导符,前导符为高电平1。连续发送32个“1”,用于和PHY进行同步
2、发送2bit的固定的启动开始标志,00b
3、发送2bit的操作码,读操作是11b
4、发送5bit的Phy addr,通过该地址来识别对应的PHY芯片
5、发送5bit的设备地址,寻址范围是32 Word。(可以理解为PHY的二级地址)
6、发送2bit固定的周转码,为Z0b
7、slave输出16bit的寄存器值
8、总线进入高阻态,读时序结束
增量读时序:
1、MDIO master驱动输出前导符,前导符为高电平1。连续发送32个“1”,用于和PHY进行同步
2、发送2bit的固定的启动开始标志,00b
3、发送2bit的操作码,对于增量读操作是10b
4、发送5bit的Phy addr,通过该地址来识别对应的PHY芯片
5、发送5bit的设备地址,寻址范围是32 Word。(可以理解为PHY的二级地址)
6、发送2bit固定的周转码,为Z0b
7、slave输出16bit的寄存器值(每次都较上一次多偏移一单位地址)
8、总线进入高阻态,增量读时序结束增量读:就是连续读出一段空间的地址,这时候先通过设置地址的时序写寄存器的地址,再依次重复调用增量读命令去读寄存器,每次在接收到增量读地址帧并完成读操作后,MMD将地址寄存器递增1。直到读完该空间最后一个寄存器。
总结
1、Clause 45寄存器地址从5bit扩展到16bit,既可以访问到65536个寄存器
2、Clause 45引入了MMD概念,每个PHY最多可支持32个MMD
3、Clause 22只需要1帧就可以完成读写,而Clause 45需要2帧(第一次发送地址协议帧指定寄存器,第二次发送帧去读写数据)才可以完成读写
