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

【经验分享】STM32网络之SMI接口

[复制链接]
STMCU小助手 发布时间:2022-4-17 20:43
01、以太网简介
/ a1 y: S* u6 i$ R  S( _STM32F20X和STM32F21的以太网外设可接受和发送数据按照IEE802.3-2002标准。& ]' c+ L" m/ y( o  N

' ^5 t3 E' y. z# l. G& A% X以太网提供一个完整的、灵活的外设去满足不同应用和要求。它支持与外部相连(PHY)的两个标准的工业接口:默认情况使用在IEEE802.3规范中定义的独立介质接口(MII)和精简介质独立接口(RMII)。它可以被用于大量的需求,例如开关(交换机)、网络接口卡等等。
& N! Y3 {2 m- Z- w
4 Y; g$ B7 A' Z9 z8 s; m以太网满足下列标准:- d. F3 `7 K  M, e  b" u! M. ^

  }, J: y9 u9 f+ ]8 l● IEEE 802.3-2002,用于以太网MAC。1 P1 z/ U+ ~! l8 m

2 N- @1 c* d& k● IEEE 1588-2008 标准,用于规定联网时钟同步的精度。3 ?0 {3 Y" |2 S5 v. ~
8 y  r" ~: N9 z% O' X1 w; x
● AMBA 2.0,用于AHB 主/从端口。
$ G/ j; _# [+ V& ^0 b' @& F3 Y/ e0 }  S6 u; @
● RMII 联盟的 RMII规范。
! f% O* S5 e& k2 j
" V4 W( f! T% T* B, U2 t3 Y5 H, g+ ~: O; l% t) w
02、STM32F207的ETH介绍
! j7 @% ]8 @2 G- Z! N
STM32F207支持MII接口和RMII接口。STM32F207以太网外设包括一个MAC802.3(介质访问控制)和一个DMA控制器。它默认情况下支持MII和RMII接口,通过一个选择位进行切换。
3 R4 \4 X6 a2 `1 m, O9 t9 {8 k4 z) V6 b* @6 B8 j
DMA控制器通过AHB主从接口和内核与内存相连。AHB主接口控制数据传输,AHB从接口用于访问控制和状态寄存器(CSR)空间。
/ X  f( K3 M& h) c
4 t) ^9 q/ N, q  ]在MAC内核发送数据之前,数据经过DMA的方式发送到FIFO中缓存。同样的,接收FIFO存储通过线路收到的以太网数据帧,直到这些数据帧通过DMA被传输到系统内存。" W; \! W5 `. q" p" H0 f; C
+ q* t0 K5 t1 J* }4 P
以太网外设也包括一个SMI,用于和外部PHY通讯。通过一组寄存器的配置,用户可以选择MAC和DMA控制器的不同模式和功能。% A6 }9 l% z2 D8 V8 ?

( P' l" a& W2 F% {5 U当使用以太网时,AHB时钟必须至少25MHZ。
" F8 A" {( ]1 s% N' w6 L% h$ s5 x& P3 c) _# v) p7 D! ]
下面是ETH的框图. G8 h! n" f- o0 M% C
& K" D& a  B% X* X' e/ j8 \" D
adcfce9577a28b8ac927ed18f7a20b09.png ' O3 o, U4 x% x$ G

# k0 e4 y. [5 R+ I9 ^关于AHB的连接信息:
6 ~1 ^" n/ w- w- y9 F; `" P* {! u6 C, _
区域1:我们称为SMI接口,用于配置外部PHY芯片。! i8 X+ P4 K- x  ?) A
/ v/ x9 l7 A6 T1 j
区域2:是数据交换接口,也就是上面我们说的MII接口和RMII接口。7 J# |9 g" l0 R0 p

5 U7 K' }; O% m* D* r03、SMI接口
  E  C# x7 ~! ^8 ?5 j7 h3.1、站管理接口:SMI

( W8 y0 ^1 w3 J) |2 K# M4 ?站管理接口允许任何PHY寄存器请求通过2线时钟和数据线。这个接口支持最多到32个PHY。
9 M  a* K& C7 U5 _4 ]" e7 r( e& m( P  s7 p: y8 t; ?
应用程序可以从 32个 PHY中选择一个PHY,然后从任意PHY 包含的32 个寄存器中选择一个寄存器,发送控制数据或接收状态信息。任意给定时间内只能对一个PHY 中的一个寄存器进行寻址。
) E' Y9 e4 w, X* A2 ]& U
5 V" ~8 {# h( @; P  m; H* S0 hMDC 时钟线和 MDIO数据线在微控制器中均用作复用功能I/O:
2 w+ v5 Z; }' @0 `0 w9 g9 i
6 P9 u. t& W8 }MDC:周期性时钟,提供以最大频率2.5 MHz 传输数据时的参考时序。MDC的最短高电平时间和最短低电平时间必须均为160 ns。MDC的最小周期必须为400 ns。在空闲状态下,SMI管理接口将 MDC时钟信号驱动为低电平。
1 L8 r2 E  ^& h7 o- Q
% M- b; `1 \/ m% ^MDIO:数据输入/输出比特流,用于通过MDC 时钟信号向/从PHY 设备同步传输状态信息。
% n9 e$ _1 `( w) M" K
3 d, ]# K1 e. F! _ 5aadc9ece14aa2dc17b459a87429c4c2.png ; v. y" K* o' j. G9 E4 }7 N- h
9 T9 z( `, r9 c: i, L' N' Y
3.2、SMI帧结构
! J4 L4 v% @! M8 x. S, M* n: s& E. |2 _下图给出了读操作和写操作帧结构,位传输必须要求从左到右。' m+ v  s6 `  a0 G1 O* b5 `1 g7 J; ^! M

# a8 g0 {3 J" ]- M# H( G# b4 e2 {% U% _ 1249cde3071b8040a32ad08dbf51063f.png 8 l2 A' G# u' L0 X, y; J8 m: s; l
* C( G; u! B+ R3 v2 V2 @
Preamble(32bit前导符):每个传输(读或者写)都必须以前导符开始,前导符是MDIO线上连续的32个逻辑’1’信号,和对应MDC线上的32个时钟信号。这部分信号用于和PHY设备建立同步。. E1 _0 V" f: e6 l6 }, ~' S$ H
  c4 M( w8 F& m. {0 Y
Start(起始符):帧的起始符定义为’01’,也就是MDIO线从逻辑’1’降到’0’再回到’1’,以标记传输的。. N2 l" D& O7 ^7 Z/ T9 B( q
7 R( p4 Q; W0 Q( a6 H" S, Z
开始。
+ M  C! f" o- \0 `" ?5 E4 F0 u, ^* r1 m
Operation(操作符):用于定义操作的类型:读或者写。! j5 N: b9 J; ?; w. a
5 v( F+ }8 |. G: I
PADDR:PHY的地址有5位,可以区分32个PHY。高位先被发送和接收。
' _* ~1 w' ~0 C/ H, a7 n
0 p0 H: a+ |% \( P+ q1 P; HRADDR:寄存器的地址有5位,可以寻址32个独立的寄存器。高位先被发送和接收。2 {1 E6 z. m9 a( Z+ Y. Q" g( t3 E! {  @, f

! z$ J2 H% [5 o8 k$ ETA:2位的转向符,插在RADDR和数据(DATA)之间,用于避免读操作时发生冲突。读操作时,在TA的这2位时间内,MAC控制器保持MDIO线的高阻状态,PHY设备则先保持1位的高阻状态,在第2位时输出’0’信号。写操作时,在TA的这2位时间内,MAC控制器驱动MDIO线输出’10’信号,而PHY设置则保持高阻状态。
+ r4 g! p% T/ x9 T" u% O3 e8 |6 N' \$ o4 O- ?
DATA(数据):16位的数据域。最先发送和接收的是ETH_MIID寄存器的第15位。8 H, O) d* u5 l' A

, q+ b( f- h& t; E空闲位:MDIO线保持在高阻状态。取消所有的三态驱动,由PHY的上拉电阻保证MDIO线处于逻辑’1’。
; B: p. Q* h3 `* t/ l: f1 |: G9 T% G! w7 q8 x" h
3.3、SMI写操作! B4 `0 |  c$ ]  w" S' O
当应用程序设置了MII写和忙位(以太网MACMII地址寄存器(ETH_MACMIIAR)),SMI接口会向PHY传 送 PHY地 址 和 PHY寄 存 器 地 址 ,然 后 传 输 数 据 (以 太 网 MAC MII 数据 寄 存器(ETH_MACMIIDR))。在SMI接口传输数据的过程中,不能修改MII地址寄存器和MII数据寄存器的内容;在此过程中(忙位为高),对MII地址寄存器或MII数据寄存器的写操作将被忽视,并且不影响整个传输的正确完成。当完成写操作时,SMI接口将清除忙位,告知应用程序。! W8 t5 q: J" i2 ~* l+ u; U

- R! p. B; b0 X8 b! Z下图描述了写操作时的帧格式。2 B  O. G8 w% n& }: }% @2 b, L

. L; k: m8 B) |. y4 j- x 5efc26dded86ce7ca0844c15ce199b47.png   G, w: ]) f! C5 [% ]6 A- q

6 p, R, c' K+ {! v  J! f3.4、SMI读操作
* b8 R5 h. ~  ^! ?$ K5 d当程序把以太网MACMII地址寄存器(ETH_MACMIIAR)的MII忙位置为’1’,而保持MII写位为’0’,SMI接口则发送PHY地址和PHY寄存器地址,执行读PHY寄存器的操作。在整个传输过程中,应用程序不能修改MII地址寄存器和MII数据寄存器的内容。在传输过程中(忙位为高),对MII地址寄存器或者MII数据寄存器的写操作将被忽视,并且不影响整个传输的正确完成。在读操作完成后,SMI接口将清除忙位,并把从PHY读回的数据更新到MII数据寄存器中。
4 Z2 c& K& N1 W/ x1 {. L; l  x0 m# s, ^5 j* \
下图描述了读操作的帧格式
- o/ X$ \, U/ `! E2 ]5 }: Y
, ]) ]) Q+ {9 b f04b50697b1ca6dcc10d123ca2c027d7.png
$ m* o) o: [8 y6 s, T& E2 h& D# y2 e- g: J) [/ a- ^: E. a
3.5、SMI时钟选择
$ @8 I$ z3 n. H6 U8 KMAC 启动管理写/读操作。SMI时钟是一个分频时钟,其时钟源为应用时钟(AHB时钟)。分频系数取决于MII地址寄存器中设置的时钟范围。这里既然说到了时钟,就再次提一下上文提到的内容:当使用以太网时,AHB时钟必须至少25MHZ。2 @' g; x. T$ q, y6 k
0 @7 i; W" W+ Y- N/ b& T# w
03d4658bcc1b9564c540226e8abc1564.png
7 R1 g- B* e- k9 o  {9 S* y4 k" M! b* U
04、代码/ l1 Y3 ]  I% r  m. g
STM32的网口的SMI接口初始化是十分简单的。$ c% v9 A5 m, J/ h

  x; I1 w! o  _% A初始化GPIO。
* S% x% P0 E5 Y. ~* f( _  \5 a! [" q. ?3 C( h) B( W
  1. RCC_AHB1PeriphClockCmd(RCC_AHB1Periph_GPIOA |  RCC_AHB1Periph_GPIOC |RCC_AHB1Periph_GPIOF, ENABLE);
    $ O  {% |: ?6 |/ S0 ?
  2. " z  v1 M, p0 M( |
  3. /* Enable SYSCFG clock */4 N6 f0 ^& Z9 ~$ I1 l2 f
  4. RCC_APB2PeriphClockCmd(RCC_APB2Periph_SYSCFG, ENABLE);  
    " s% O% Y) o0 l
  5. GPIO_InitStructure.GPIO_Pin = GPIO_Pin_2;$ G. [. l, U9 ~
  6. GPIO_Init(GPIOA, &GPIO_InitStructure);
    7 S9 [* t( R, v! D: r
  7. GPIO_PinAFConfig(GPIOA, GPIO_PinSource2, GPIO_AF_ETH);
    $ R1 k* a; T6 V4 B
  8.   n" p6 d1 o* H6 D; s+ ?& O% m. c+ R
  9. GPIO_InitStructure.GPIO_Pin = GPIO_Pin_1;2 y6 t+ O/ B4 \+ u# U/ c
  10. GPIO_Init(GPIOC, &GPIO_InitStructure);/ x$ ?6 N* |3 }, w7 I: i5 q
  11. GPIO_PinAFConfig(GPIOC, GPIO_PinSource1, GPIO_AF_ETH);
复制代码

5 t, O9 ]( s; j因为SMI接口需要MAC配合,所以需要是使能MAC的时钟。. h1 f$ Q2 Q% h+ [5 F" K
) [9 N: t5 j" @' j6 l/ ]. R% L
  1. RCC_AHB1PeriphClockCmd(RCC_AHB1Periph_ETH_MAC |RCC_AHB1Periph_ETH_MAC_Tx |RCC_AHB1Periph_ETH_MAC_Rx, ENABLE);
复制代码

. P) H8 @/ H2 s* \2 E' YSMI接口的读函数和写函数。. i1 [+ e% C; u' R6 M/ N

3 g) D. E! J" A1 W( P% a
  1. uint16_t ETH_ReadPHYRegister(uint16_t PHYAddress, uint16_t PHYReg)" e/ v, O- Y) `
  2. uint32_t ETH_WritePHYRegister(uint16_t PHYAddress, uint16_t PHYReg,uint16_t PHYValue)
复制代码
; d+ J. U* q. K1 i0 }, ?6 r

: ^# I% ~% h5 y) B2 B1 g. E% l/ `3 R7 w' Y7 P$ W$ B- o
收藏 评论0 发布时间:2022-4-17 20:43

举报

0个回答

所属标签

相似分享

官网相关资源

关于
我们是谁
投资者关系
意法半导体可持续发展举措
创新与技术
意法半导体官网
联系我们
联系ST分支机构
寻找销售人员和分销渠道
社区
媒体中心
活动与培训
隐私策略
隐私策略
Cookies管理
行使您的权利
官方最新发布
STM32N6 AI生态系统
STM32MCU,MPU高性能GUI
ST ACEPACK电源模块
意法半导体生物传感器
STM32Cube扩展软件包
关注我们
st-img 微信公众号
st-img 手机版