OSI 的 7 层基准模型中 PHY 属于第一层 ——物理层。PHY 是数据链路层的媒体访问控制部分和媒体的接口。PHY 对所有传输的数据只是进行编码转化,没有对有效数据信号进行任何分析或改变,但是MAC 所有的数据传输都必须经过 PHY 发送和接收才能传输到目标 MAC。PHY 还可以完成连接判断,自动协商以及冲突检测。MAC 可以通过修改 PHY 的寄存器完成对自动协商的监控,当然也可以读取 PHY 的寄存器来判断 PHY 的状态。4 A, Z3 M) L/ _+ I# O& a9 t2 r
一. PHY 寄存器" o4 {' z( J+ o6 l0 G$ y/ K2 ]5 E
IEEE802.3 标准中定义了 PHY 的基本寄存器,寄存器偏移 00h ~ 0fh。其中最重要的就是 BCR(BasicControl Register, offset: 00h),BSR(Basic Status Register, offset: 01h)。MAC 通过 SMI 接口访问 BCR 来控制 PHY 的工作模式,也可以通过访问 BSR 来得知 PHY 的工作状态。需要注意的是,有时 PHY 的工作速率和工作模式不一定是通过访问 BSR 来得到的,因此在使用STM32 MAC 外设与不同的 PHY 通讯时,可能需要修改寄存器定义。以下是 ST 所提供的驱动中关于PHY 寄存器的定义(节选自 stm32f4xx_hal_conf.h)。
) Z% E A7 C8 ~" a3 P( ^) S5 p& D2 l
- /* Section 3: Common PHY Registers */
& Z. m+ ?1 Y2 p+ w% ^% h. K) V - #define PHY_BCR ((uint16_t)0x00) /*!< Transceiver Basic Control Register */
4 l4 R! v# Q' _3 i - #define PHY_BSR ((uint16_t)0x01) /*!< Transceiver Basic Status Register */
! T/ i! G2 z3 U( I- m z" K& w - #define PHY_RESET ((uint16_t)0x8000) /*!< PHY Reset */1 f6 n( R! X- l7 c4 L
- #define PHY_LOOPBACK ((uint16_t)0x4000) /*!< Select loop-back mode */) T9 Y. w! t9 Z1 [$ J' q
- #define PHY_RESTART_AUTONEGOTIATION ((uint16_t)0x0200) /*!< Restart auto-negotiation
- t0 j+ C% ^1 V& |% r - function */
+ n% Q; m, n$ R2 v# m$ B" E - #define PHY_POWERDOWN ((uint16_t)0x0800) /*!< Select the power down mode */
! A% L- f$ W/ g1 z9 t( Z8 ` - #define PHY_AUTONEGO_COMPLETE ((uint16_t)0x0020) /*!< Auto-Negotiation process* j; H9 ]2 K- R8 S
- completed */4 ?6 ~3 o5 @7 ?# y# h
复制代码 二.PHY AutoStrapping3 p, s. d& I1 R+ x0 P7 ]( b3 d
现在的多数 PHY 都具有 AutoStrapping 功能,即可以在硬件设计时,通过上下拉电阻设定某些引脚的电平,PHY 复位后自动将引脚电平读入指定的寄存器标志位,以相应的方式工作。需要注意的有以下几项:
5 x9 |/ k* v2 P, e6 m+ ?5 Q/ m% L, C1. PHY 寄存器地址6 X4 r4 q" d( A+ J
SMI 接口访问 PHY 时除了需要 PHY 的寄存器偏移,也需要 PHY 的地址,这个地址是在AutoStrapping 中指定的。当然,随后也可以通过 SMI 接口软件修改 PHY 的寄存器地址。- /**
" m. L3 J- x+ H& r3 l4 r Z' S - * @brief Reads a PHY register# ]8 _4 V$ q1 s' t# \' z
- * @param heth: pointer to a ETH_HandleTypeDef structure that contains* s/ j! m9 T) y
- * the configuration information for ETHERNET module
8 i" I1 H6 R! V+ z- W( f - * @param PHYReg: PHY register address, is the index of one of the 32 PHY1 j1 W ?6 C3 l% h+ |8 T
- register.; f: i8 O: Y+ L( O# c
- * This parameter can be one of the following values:4 s, \9 v9 h- u% h* B5 O
- * PHY_BCR: Transceiver Basic Control Register,! j2 U- r4 j) z$ B; l
- * PHY_BSR: Transceiver Basic Status Register.3 X# q5 q: B% n9 F
- * More PHY register could be read depending on the used PHY4 ^2 o. t, r& I/ {0 r' I
- * @param RegValue: PHY register value. ^. \/ R% t0 C- c+ e( ~, h
- * @retval HAL status
9 i5 ?1 P# T$ F0 X1 j6 a& ^4 u - */& ?7 \* c4 \: u; Y
- HAL_StatusTypeDef HAL_ETH_ReadPHYRegister(ETH_HandleTypeDef *heth, uint16_t PHYReg,4 w) a) v! w& f: ^
- uint32_t *RegValue)
复制代码 , o* l. W: p4 w0 V! r
2. 工作模式, d) _: g7 m4 I! ~
工作模式首先需要注意的是是否使能自动协商功能,自动协商遵循的原则就是双方寻找最快的方式。也可以在不使能自动协商的情况下直接指定 PHY 的工作模式(例如半双工 10Mbits/s)。在 ST 的驱动中,为了准确的获得此信息,通过 SMI 接口读取寄存器标志位。
$ I) g0 v4 A4 |# X, y0 k! j3 F+ N% d+ W! ^& h! n
3. LED 接口& k1 u9 y1 e. Z' C
PHY 中一般都包括指示 LED,用来指示链接状态和 Activity 情况。这些也是可以在此项中设置的。4. 其它此外,PHY 的 AutoStrapping 中一般还具有 Loopback 等功能。' e( ~ _0 v2 ^' {! j
( a" H( P- y7 l2 h三. 总结9 v3 c8 I% ~; D6 m
MAC 和 PHY 并不困难,在应用时,硬件工程师应该阅读 PHY 的参考手册,并在原理图中标明所选定的工作方式以方便软件工程师编写驱动程序。, {9 X5 V5 P5 D- h) L5 C
) M. y3 _: Z6 G0 l, U
$ ^ G/ F$ `5 B2 A2 S' U/ r; C% s7 l. B1 W9 L' ~& P
|