PHY芯片
2025/7/10
什么是PHY
物理层芯片称为PHY、数据链路层芯片称为MAC。
PHY的数据是RJ45网络接口(网线口)穿过了的差分信号,而PHY作用就是将差分信号转为数字信号,这块内容不用深究,制造商都设计好了。我们主要是对phy芯片进行模式选择(比如工作速率,工作模式)
RJ45
RJ45 座子上一般有两个灯,一个黄色(橙色),一个绿色,这两个灯由 PHY 芯片控制。
- 绿色亮的话表示网络连接正常。
- 黄色闪烁的话说明当前正在进行网络通信,黄灯闪动频率快表示网速好。
模块通信
下图是两个主控直接的通信,比如我们的电脑和路由器 ,没有中间的介质也可以连接网络。
如果phy芯片没有,那么可以直接通过两个mac连接进行通信,之所以需要mac 、phy、变压器的目的是为了转换数据类型适配所以的网线,但是在一些电路上,没必要加这么多东西
比如搭载 Linux系统的arm芯片想要网络,可以直接通过mac和网卡芯片连接获取,这时候就需要通过RGMII接口或者MII接口 和 MDIO 连接网卡芯片。
(网卡芯片内置也是mac+phy,有的只有mac 层这个要看具体的手册)
MDIO协议
SMI:串行管理接口(Serial Management Interface),也被称作MII管理接口(MII Management Interface),包括MDC和MDIO两条信号线。MDIO是一个PHY的管理接口,用来读/写PHY的寄存器,以控制PHY的行为或获取PHY的状态,MDC为MDIO提供时钟。
MDIO原本是为MII总线接口定义的,MII用于连接MAC和PHY,包含两种信号接口:
一个数据接口用于MAC和PHY之间接收和发送以太网帧数据。
一个PHY管理接口,即MDIO,用于读写每个PHY的控制寄存器和状态寄存器,以达到控制PHY行为和监控PHY状态的目的。
MDIO是双向的,只支持一个MAC连接最多32个PHY的连接方式,且MAC作为master,PHY作为slave。在写PHY寄存器的时候,由MAC驱动MDIO向PHY写入数据;在读PHY寄存器时,前半段由MAC驱动发送寄存器地址,后半段由PHY驱动回复寄存器的值。
MDC要求由MAC输出,是非周期性的,即不要求提供固定频率的时钟,对于PHY芯片则作为输入,以在上升沿触发MDIO的读写。MDC的时钟频率可以是DC-2.5MHz,即最小的时钟周期为400ns。MDC支持的最大时钟频率根据具体PHY决定。
如图为SMI应用框图。STA设备通过MDIO接口与PHY通信。STA(StaTIon Management)为主控设备,比如MCU、MAC、ONU等。PHY为从设备。一个STA最多管理32个PHY。MDC信号由STA控制,MDIO信号根据通信方式的不同可以由STA或者PHY接管控制。如图通常MDIO会接一个电阻上拉至接口电源。
从上面的连接图可以看到MDIO是用来连接主设备和多个PHY设备,并且通过MDIO来传输数据
那么传输的是数据主要是传输链接状态、传输速度与选择、断电、低功率休眠状态TX/RX模式选择、自动协商]自动协商控制、环回模式控制等。
MDIO读写时序
Preamble+Start:32bits的前导码以及2bit的开始位。
OP Code:2bits的操作码,10表示读,01表示写。
PHYAD:5bits的PHY地址,一般PHY地址从0开始顺序编号,例如6口switch中PHY地址为0-5。(MAX-32个)
REGAD:5bits的寄存器地址,即要读或写的寄存器。
Turn Around:2bits的TA,在读命令中,MDIO在此时由MAC驱动改为PHY驱动,并等待一个时钟周期准备发送数据。在写命令中,不需要MDIO方向发生变化,则只是等待两个时钟周期准备写入数据。
Data:16bits数据,在读命令中,PHY芯片将读到的对应PHYAD的REGAD寄存器的数据写到Data中,在写命令中,MAC将要写入对应PHYAD的REGAD寄存器的值写入Data中。
Idle:空闲状态,此时MDIO无源驱动,处高阻状态,但一般用上拉电阻使其处在高电平,上拉电阻一般为1.5K。(空闲电平是低电平)
MDIO没那么重要
MDIO在上面说到的两个模块通信,我提到了 arm芯片和网卡芯片直接需要,换个话说不连接也可以使得网络畅通,因为网络的数据传输是靠RGMII不是靠MDIO,MDIO的作用是用来查看一些状态和功能,还有简单的控制,网卡芯片内置可以写死,arm层只要有网卡就可以通讯。
很多时候需要通过mdio来进行读写控制,只是在网络通讯正常后的升级优化,用来方便查看状态,就像写了个前端网页来看后台数据。
如果mido没有读通,或者读取的数据是0xfffff,那么不一定是mdio的问题,很多时候是网卡本身没有启动!
PHY 芯片寄存器地址空间为 5 位,地址 0-31 共 32 个寄存器, IEEE 定义了 0-15 这 16 个寄存器的功能, 16~31 这 16 个寄存器由厂商自行实现。 也就是说不管你用的哪个厂家的 PHY 芯片,其中 0~15 这 16 个寄存器是一模一样的。 仅靠这 16 个寄存器是完全可以驱动起 PHY 芯片的,至少能保证基本的网络数据通信。