你的浏览器版本过低,可能导致网站不能正常访问!
为了你能正常使用网站功能,请使用这些浏览器。

【经验分享】STM32网络之MII和RMII接口

[复制链接]
STMCU小助手 发布时间:2022-4-17 20:35
SMI接口主要是用于和外部PHY芯片通信,配置PHY寄存器用的。
6 I8 V- n! t  k( w2 @$ N, ^6 S5 _" Q) V# B. k5 }
真正网络通信的数据流并不是通过SMI接口传输的,是通过MII接口或者RMII通信的。8 h. I: T! \& r  I; k& d7 W
) f) m6 L( ~/ }
1、MII接口4 n" {9 u; y9 E# h
介质独立接口(MII) 定义了10 Mbit/s 和100 Mbit/s 的数据传输速率下MAC 子层与PHY 之间的互连。
3 x4 m/ e" p' H, H1 P. j1 m9 a9 a7 N* p( }  i' X9 N8 {$ u
f78ab27878bb2382acc1af236eed1070.png
) `' L$ Q& n8 o6 ?4 G/ M
* \' M* @2 |! b' \: u9 c3 H# r管脚定义介绍:8 O. x8 B  e! ?* u  ]
- u. k& G, j5 J
1.MII_TX_CLK:连续时钟信号。该信号提供进行 TX 数据传输时的参考时序。标称频率为:速率为 10 Mbit/s 时为 2.5 MHz;速率为 100 Mbit/s 时为 25 MHz。/ K8 k" f! T6 i; N' C- g

- c* p! p7 B: N; |# E2.MII_TXD[3:0]:数据发送信号。该信号是 4 个一组的数据信号,由 MAC 子层同步驱动,在MII_TX_EN 信号有效时才为有效信号(有效数据)。MII_TXD[0] 为最低有效位,MII_TXD[3] 为最高有效位。禁止MII_TX_EN 时,发送数据不会对 PHY 产生任何影响。
+ X1 [' B5 i4 Y4 G, m! [# ?2 A$ j% A1 }9 H, N  Q
3.MII_TX_EN:发送使能信号。该信号表示 MAC 当前正针对 MII 发送半字节。该信号必须与报头的前半字节进行同步 (MII_TX_CLK),并在所有待发送的半字节均发送到 MII时必须保持同步。
; H; x( r4 `3 n5 X( o+ r
+ \) E- Z; m( r! X" ]4.MII_RX_CLK:连续时钟信号。该信号提供进行 RX 数据传输时的参考时序。标称频率为:速率为 10 Mbit/s 时为 2.5 MHz;速率为 100 Mbit/s 时为 25 MHz。) [- ?1 D6 M, O

7 ~1 [9 [7 S4 ^0 U, n5.MII_RXD[3:0]:数据接收信号。该信号是 4 个一组的数据信号,由 PHY 同步驱动,在MII_RX_DV 信号有效时才为有效信号(有效数据)。MII_RXD[0] 为最低有效位,MII_RXD[3] 为最高有效位。当 MII_RX_DV 禁止、MII_RX_ER 使能时,特定的MII_RXD[3:0] 值用于传输来自 PHY 的特定信息。
6 v" g4 t0 P4 t( l7 z4 f* ?/ o  Y$ ^, ]* \
6.MII_RX_ER:接收错误信号。该信号必须保持一个或多个周期 (MII_RX_CLK),从而向MAC 子层指示在帧的某处检测到错误。该错误条件必须通过 MII_RX_DV验证。; E/ y$ @7 g9 O+ m) T
( ~6 c; a% m- ]3 z  B
7.MII_RX_DV:接收数据有效信号。该信号表示 PHY 当前正针对 MII 接收已恢复并解码的半字节。该信号必须与恢复帧的头半字节进行同步 (MII_RX_CLK),并且一直保持同步到恢复帧的最后半字节。该信号必须在最后半字节随后的第一个时钟周期之前禁止。为了正确地接收帧,MII_RX_DV 信号必须在时间范围上涵盖要接收的帧,其开始时间不得迟于 SFD 字段出现的时间。- x% j4 c0 y, Z6 P1 R# E, Y' ]

( W' u! x$ a- a, j8.MII_CRS:载波侦听信号。当发送或接收介质处于非空闲状态时,由 PHY 使能该信号。发送和接收介质均处于空闲状态时,由 PHY 禁止该信号。PHY 必须确保 MII_CS 信号在冲突条件下保持有效状态。该信号无需与 TX 和 RX 时钟保持同步。在全双工模式下,该信号没意义。
& G; C: ^1 f5 O- J) t/ r
& r6 m% B6 F6 v9.MII_COL:冲突检测信号。检测到介质上存在冲突后,PHY 必须立即使能冲突检测信号,并且只要存在冲突条件,冲突检测信号必须保持有效状态。该信号无需与 TX 和 RX 时钟保持同步。在全双工模式下,该信号没意义。# S0 I, j2 w3 P9 h% O1 p

' a% o9 i4 R0 M8 |/ z/ v10.MDC:MDC信号属于SMI接口( q' m* @2 H  C) E
, m" a/ k  T* A% s7 Q- g/ ?
11.MDIO:MDIO信号属于SMI接口
/ b5 m8 x3 l% q5 }4 r, W, E# y5 `) Y- Y$ d0 J1 x( G
下图TX接口信号编码, d' i. y3 d: b; n6 {

! K9 R! h3 b' ~' t5 u. E: I 9d918643b2cc56037b549b4663d997ec.png 5 S9 A8 k7 v7 d, t- x) Z! l
% ]1 u3 h/ }/ c# D
下图RX 接口信号编码
, }9 N$ b2 m( i0 y+ s4 h
; k8 K$ c; L- ^% X7 }' J 724f91a7cb805d25cdb603cfaeeaf5a9.png # A  w$ `8 P; W/ C$ b" p
' G7 s$ m! p" H- W: y" r! X+ X
MII接口的时钟源
4 I% b+ U2 b" k$ d1 i; M/ W( K9 s
* ]5 R' F% c5 q/ F( X$ j要生成TX_CLK 和RX_CLK 时钟信号,必须向外部PHY 提供25MHz 时钟,如图所 示。除了使用外部 25 MHz石英晶体提供该时钟,还可以通过STM32F20xx 微控制器的MCO引脚输出该信号。这种情况下,必须对PLL 倍频进行配置,以通过25 MHz 外部石英晶体在MCO 引脚上获得所需频率。4 |: G$ T$ p* Y) a/ n' J1 i7 X1 q6 r

7 l  g) L1 \$ T6 ? 193bccbcfc4cb27fd1bf9f5d01ed1df4.png # ?* F" M; E' |  j

6 W( |* Y& E$ e! G" R& t对应的代码
$ w* R6 B0 d6 h: j
- n0 {  ]% g1 G8 O/ i- l+ d
  1. /* Enable GPIOs clocks */
    " J8 Q# [1 D. p' C" l
  2. RCC_AHB1PeriphClockCmd(RCC_AHB1Periph_GPIOA,ENABLE);
    3 V8 C( \) ~. ?2 t$ j" F

  3. & Q7 X, Z/ |( \( n' ?- h5 \
  4. /* Enable SYSCFG clock */
      T5 y% e+ c6 n" L# t0 Z
  5. RCC_APB2PeriphClockCmd(RCC_APB2Periph_SYSCFG, ENABLE);  - E# u1 V3 Q2 E; E2 e

  6. 4 x, |9 o: n" M( T7 J
  7. /* Configure MCO (PA8) */' n; R% h2 G8 T6 L
  8. GPIO_InitStructure.GPIO_Pin = GPIO_Pin_8;! S% u3 Z- Z% F& h+ U
  9. GPIO_InitStructure.GPIO_Speed = GPIO_Speed_100MHz;$ f( H, P) m0 _' q( Z( U
  10. GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF;
    # e& W/ l8 [% t5 E3 w% h6 v* L- m
  11. GPIO_InitStructure.GPIO_OType = GPIO_OType_PP;; p2 p5 q- k& @* o. W- g
  12. GPIO_InitStructure.GPIO_PuPd = GPIO_PuPd_NOPULL ;  9 `1 b) ]! {2 M
  13. GPIO_Init(GPIOA, &GPIO_InitStructure);
    $ D' S+ l$ k; ]' j- [0 i
  14. /* Output HSE clock (25MHz) on MCO pin (PA8) to clock the PHY */4 Q3 u2 }% ?1 @! G- |7 ~, Z  \
  15. RCC_MCO1Config(RCC_MCO1Source_HSE, RCC_MCO1Div_1);
复制代码

- m# v, b. U0 A5 y2、RMII接口
+ \" k9 d9 ?9 P
Reduced media-independent interface: RMII(精简介质独立接口)。精简介质独立接口(RMII) 规范降低了10/100 Mbit/s 下微控制器以太网外设与外部PHY 间的引脚数。
+ }  H" w% x( n% P1 ^7 J, {
& o. n* [$ V$ w6 W根据IEEE 802.3u 标准,MII包括16 个数据和控制信号的引脚。RMII规范将引脚数减少为 7 个(引脚数减少62.5%)。引脚的含义参考MII接口即可。3 B* w- J" ^" O) E7 B
" t3 N! L& R/ s" a3 c
4288f6037be85b367479cb763bd18691.png ' R! L" G6 }4 E1 L0 i0 |+ K" J$ e
' G+ [, S" L/ V% y$ w$ ~
RMII接口是MAC和PHY之间的实例化对象。这些有助于MAC的MII接口转化为RMII接口。RMII接口具有以下特点3 @8 ^, R6 h: s! u& i

- ]1 T" i/ a! e- {6 N9 p% Q. D1.10-Mbit/s 和 100-Mbit/s 的运行速率" R3 d4 S( ^! D8 _# X4 M% g
2 r9 i/ B8 _2 Q- c( O3 r
2.参考时钟必须是 50 MHz
% ?2 P$ P4 [3 u4 ?# g3 b! L3 \& J
3.相同的参考时钟必须从外部提供给 MAC 和外部以太网 PHY
4 E# L3 g/ ?) i3 t5 c* F, Z
& v# C. `9 g2 d& B$ r4.它提供了独立的 2 位宽(双位)的发送和接收数据路径5 V+ v) f! h& U! {$ N2 z

, u! I9 g% i6 i2 W这里时钟管脚比MII接口少,有一个非常重要的点,那就是RMII接口时钟源必须是50MHZ
8 [8 t8 N3 n" C" [) v! J* i8 j: t( p+ q8 A6 h! b. |
RMII接口时钟源$ j8 B8 g8 ?: j* v

8 S* R% V" E- b  f- A7 [* XSTM32F207xx控制器可以从MCO引脚提供50MHz时钟信号,当然用户需要配置PLL来产生这一时钟。5 v$ Y* `! q4 o' e+ s

' O! z* P' L! l d50816964d9c16a023f44b8b1983e95f.png   E2 \. i, l) X
8 I7 w1 e! B6 [" a+ U; a
使用外部50 MHz 时钟驱动PHY 或使用嵌入式PLL 生成50 MHz 频率信号来驱动PHY。
, h, u; `! O& S& N! b% c3 g5 M$ W6 g+ y) Y6 M, m
3、两种接口对应的引脚
, i( j" J& F+ [' J; qSTM32F207VCT6(100pin)的芯片
' y# }  \- G; C, l% p: K
5 F0 T3 D5 ]5 {3 I( E* D# s
  1. Ethernet pins configuration( m0 j% G) s% f* ^, k. w
  2. ETH_MDIO -------------------------> PA2  pin 25* \7 M; f# s  j4 k0 ~+ J8 k$ @) q) ~( x* G
  3. ETH_MDC --------------------------> PC1  pin 16
    4 e0 D1 {$ p# W* W4 t+ N; `2 {0 j6 v
  4. ETH_PPS_OUT ----------------------> PB5  pin 91
    / R' u: F3 b" I2 I5 O
  5. ETH_MII_CRS ----------------------> PA0  pin 23
    : I% B5 `2 `! e0 A3 D' l/ Q
  6. ETH_MII_COL ----------------------> PA3  pin 26. |3 k7 D9 u' E0 Q  |
  7. ETH_MII_RX_ER --------------------> PB10 pin 47
    # f2 [6 Z+ F7 S* M+ Q* C" W
  8. ETH_MII_RXD2 ---------------------> PB0  pin 35
    # Z1 M% _. |# n
  9. ETH_MII_RXD3 ---------------------> PB1  pin 36
    3 h  N5 M6 ~% D
  10. ETH_MII_TX_CLK -------------------> PC3  pin 18
    1 ?( \3 S5 D: a9 U4 ?5 q" l4 R
  11. ETH_MII_TXD2 ---------------------> PC2  pin 17
    " G8 K2 b( h  c
  12. ETH_MII_TXD3 ---------------------> PB8  pin 95
    - X: I; K. K! f/ P* x
  13. ETH_MII_RX_CLK/ETH_RMII_REF_CLK---> PA1  pin 24
    - X7 T, V/ ]/ z- W' X( s
  14. ETH_MII_RX_DV/ETH_RMII_CRS_DV ----> PA7  pin 329 n% `" i6 y* z% c4 Z' u9 _3 U
  15. ETH_MII_RXD0/ETH_RMII_RXD0 -------> PC4  pin 33
    : l' d& B% c" S( h
  16. ETH_MII_RXD1/ETH_RMII_RXD1 -------> PC5  pin 34
    & J% r, y9 p7 ]* s' d
  17. ETH_MII_TX_EN/ETH_RMII_TX_EN -----> PB11 pin 48
    * j, k2 p  r4 Z# P2 m+ M( X
  18. ETH_MII_TXD0/ETH_RMII_TXD0 -------> PB12 pin 51
    6 [' h' A9 {6 l) O3 c: o$ w# G
  19. ETH_MII_TXD1/ETH_RMII_TXD1 -------> PB13 pin 527 h5 l9 S7 L& p( R& K$ G8 j; a- n
复制代码

1 Q: t- h; @4 E# R其中ETH_PPS_OUT这个管脚ST官方demo屏蔽,不属于MII接口也不属于RMII接口。下面不将其统计进入。
4 {$ {, |' c/ |+ g  `( ~
0 u8 d% E$ v$ Z( z( X. aMII 共15个接口加上SMI接口,共17个引脚。(没有包含25MHz时钟的引脚), R) S; R! F7 H2 c8 N# h( C6 y  d

. g1 G+ D  ~' F: P" ~: R 3fd756e4a852b9a7a6869e64de11d3c9.jpg
" `; ]4 ~6 T; W$ N; @  @+ I. O% J: E
RMII共7个接口加上SMI接口,共9个引脚。
  U" b( C7 n! r# w, }& n: Y# G$ C+ Q. Z. u, Y2 {& F8 b
fbfbee9397e007b52da3316d00799b78.jpg
: ^$ ], \0 J* e  o  V7 d2 T" e5 q& W* T
除了上述我自行统计的MII接口和RMII接口对应的pin之外,ST官方在参考手册也给出了对应图,如下:1 [' s* J3 _9 e4 V4 S
% t. o! ^- c, \% K/ y- v
ee4b1f778d8b908c372e5c0c89e3c0de.jpg 6 s+ k/ T, ^9 d
( p: l0 @) T3 p+ g6 l! r
4、MII和RMII的选择- o& p  a# ^9 {, H: L- d
使用SYSCFG_PMC 寄存器(注意:这里和F107不同,F107是AFIO_MAPR寄存器)中的23配置位MII_RMII_SEL选择MII 或RMII 模式。以太网控制器处于复位模式或使能时钟前,应用程序必须设置MII/RMII 模式。
% r0 W% f: Y) y% F, f- u
/ U# M. v  T) f8 \3 a" m2 _6 l对应的ST库函数为
+ Z! \# G& _/ e4 P3 c+ x# c
/ j. M+ g$ Y/ T( N- N8 K+ P4 c
  1. //函数入参可选以下5 `+ p4 ?& x+ U( b5 x  o
  2. //SYSCFG_ETH_MediaInterface_MII: MII mode selected3 f6 F& i0 K+ F0 d  r7 u& {$ Y
  3. //SYSCFG_ETH_MediaInterface_RMII: RMII mode selected7 b: V! r% s) O' u
  4. void SYSCFG_ETH_MediaInterfaceConfig(uint32_t SYSCFG_ETH_MediaInterface)
复制代码

/ z! k% B3 g2 U6 o; `% n' ZMII/RMII 内部时钟方案
- C% \' @' @' a; h
; }3 B% U) ?) I* n支持MII 和RMII 以及10 和100 Mbit/s 运行所需的时钟方案,如下图所示。
5 a- F) N4 q% U  W
- x7 H, N  ^$ m# s9 n- ^ b43dee48124f6c4ac9911d14cf6c760b.png ; Q* [" @$ v/ H; w4 g

+ M' I, g; s9 c; x' |$ u. z* W+ u" s/ u注意上图红框中:HCLK必须大于25MHz,这个问题点,在上一篇文章《STM32网络之SMI接口》中已经提到了,这里再次提到,如果不满足这个条件,可能会出现奇奇怪怪的问题,不好查找。
0 P& g0 W, W* c0 S2 f2 t1 b5 J5 Z, s* M' D
在官方手册中,还有一句
8 ^6 A! i* v! O8 M/ E: C( p7 c: v
' S4 [! [9 B% }% s. c 1c78c4642e556f89599c20b618840314.png ; I4 g3 S5 s  L3 h# t& \
9 _0 u( @4 h- C# t! x; Y) J
要节省引脚,需在同一个GPIO 引脚上复用RMII_REF_CK 和MII_RX_CLK 这两个输入时钟信号。
5 K: p  y, s* U5 N# ]- j$ b0 E8 I2 p" Q0 O- v' b8 U

+ t: d2 q! W3 W2 D- u  t+ p% w
赞 收藏 评论0 发布时间:2022-4-17 20:35

举报

0个回答

所属标签

相似技术帖

官网相关资源

关于
我们是谁
投资者关系
意法半导体可持续发展举措
创新与技术
意法半导体官网
联系我们
联系ST分支机构
寻找销售人员和分销渠道
社区
媒体中心
活动与培训
隐私策略
隐私策略
Cookies管理
行使您的权利
官方最新发布
人形机器人运动控制、感知与智能配电
半导体创新技术与应用方向
EE架构与软件定义汽车
12V/48V 汽车智能配电(SPD)
区域控制单元(ZCU)与分区架构
关注我们
st-img 微信公众号
st-img 手机版