【网络 MAC 学习专栏 -- 怎样理解 PHY 的 Link Up】

打印 上一主题 下一主题

主题 982|帖子 982|积分 2946

请阅读【嵌入式开辟学习必备专栏 Cache | MMU | AMBA BUS | CoreSight | Trace32 | CoreLink | ARM GCC | CSH】


  
转自: 开心果 Need Car 2022年10月20日 09:50 上海
Overview

PHY 的重要作用是数/模信号转换,功能等同于其他总线的 Transceiver。以是,uC 如果想发送/接收以太网数据,就必要依赖 PHY(确切说是PHY芯片)。如果想让PHY按照预期的状态工作,uC就必要通过接口告诉PHY怎样工作,这个接口是指 MAC(Media Access Control)/PHY 接口。
MAC/PHY的接口关系如下所示:

MAC 通过接口可以访问 PHY的内部寄存器,进而设置 PHY 的工作模式,以此实现 PHY 的 Link UpMAC访问 PHY内部寄存器,重要通过MDC(Management Data Clock)和MDIO(Management Data Input Output)实现。
   手册中描述:PHY内部寄存器的访问,通过 SMA(Station Management Agent)。而SMA中的操纵信息来自MAC,以是,两种表达,本质是一个意思。
  

  • MDC 的最大配置时钟频率为 2.5MHz,用于驱动 MDIO。
  • MDIO 是双向控制线,操纵MDIO时,必要基于(Clause 22或者Clause 45)。
Clause 22/Clause 45

Clause 22 或者 Clause 45是什么呢?
答: 一种访问PHY内部寄存器的报文协议。既然是协议,就会有格式要求,Clause 22或者Clause 45格式的各个位域如下所示:

使用 Clause 22 还是 Clause 45,必要配置 MAC_MDIO_ADDRESS 寄存器的C45E位域,默认环境下,使用 Clause 22,如下所示:

Clause 22

Clause 22 格式 的位域描述如下所示:

表明:


  • IDLE:空闲状态,此时MDIO没有时钟驱动;
  • PREAMBLE:前导码,由32个一连的"1"构成;
  • START:起始位域,2 Bit = 01B;
  • OPCODE:操纵码,2 Bit,

    • 10B表述读取PHY寄存器操纵,
    • 01B表示写PHY寄存器操纵;

  • PHY ADDR:要访问的PHY地址,MAC 最多可以访问 32个PHY,编号0~31;
  • REG ADDR:PHY 寄存器地址,最多可以访问 32个PHY寄存器,这里表示要访问哪个PHY寄存器;
  • TA:Turn Around,反转位(2 Bit):

    • 当 SMA读PHY寄存器时,在TA第一个Bit之前,由MAC(SMA)控制MDIO,哀求目标PHY寄存器的信息;
    • 在TA第一个Bit之后,由PHY控制MDIO,输出对应PHY寄存器中的信息。这也是MDIO双向的原因,操纵时序如下所示:


  • DATA:PHY寄存器中的数据信息。
    当 MAC 写 PHY 寄存器时,MDIO 完全由 MAC 控制,操纵时序如下所示:

Clause 45

Clause45与Clause22的格式一样,只是个别位域信息有所差别,如下所示:

因此,基于Clause 22或者Clause 45协议,完成对PHY内部寄存器的配置,比如:通信速率(100Mbps/1000Mbps)配置、是否全双工、自协商使能与否(auto-negotiation)、指示灯等。PHY配置完成,且配置乐成,意味着:Link Up
PHY Link 状态的软件实现

在软件层面,步伐初始化或者Reset以后,必要重新初始化PHY,通过读取PHY寄存器的Link位域确定PHY的Link状态。
eg:RTL8211F(I) BMSR (Basic Mode Status Register, Address 0x01)寄存器,Bit2(Link Status)指示 PHY的Link状态。代码实现示意所示:
  1. boolean PHY_link_Status(void)
  2. {
  3.     boolean linkEstablished = FALSE;
  4.     uint32 value;
  5.     do
  6.     {
  7.       IfxGeth_phy_Clause22_readMDIORegister(0, PH_BMSR, &value);
  8.       linkEstablished = ((value & (1 << 2)) != 0) ? TRUE : FALSE;
  9.     } while (!linkEstablished);
  10.     return linkEstablished;
  11. }
复制代码
推荐阅读:
https://mp.weixin.qq.com/s/zGwm9DkUHuuuDBwK7hO6vg
https://mp.weixin.qq.com/s/qP6FJvPl5HOkdQWYCstCxw
https://mp.weixin.qq.com/s/HpomnJom2knRo7YACkslBg
https://mp.weixin.qq.com/s/k2cKPkC39jX7YUc7d6U1sw
https://mp.weixin.qq.com/s/dJtMBI9VgefimRZ0_l8GBA

免责声明:如果侵犯了您的权益,请联系站长,我们会及时删除侵权内容,谢谢合作!更多信息从访问主页:qidao123.com:ToB企服之家,中国第一个企服评测及商务社交产业平台。

本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有账号?立即注册

x
回复

使用道具 举报

0 个回复

倒序浏览

快速回复

您需要登录后才可以回帖 登录 or 立即注册

本版积分规则

天空闲话

金牌会员
这个人很懒什么都没写!
快速回复 返回顶部 返回列表