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

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

[复制链接]
STMCU小助手 发布时间:2022-4-17 20:43
01、以太网简介9 z: s% T3 b5 |6 D6 S; _$ h6 F5 y
STM32F20X和STM32F21的以太网外设可接受和发送数据按照IEE802.3-2002标准。! j, L3 X7 S4 M6 a9 q9 k

) t3 {% r" H! W! j以太网提供一个完整的、灵活的外设去满足不同应用和要求。它支持与外部相连(PHY)的两个标准的工业接口:默认情况使用在IEEE802.3规范中定义的独立介质接口(MII)和精简介质独立接口(RMII)。它可以被用于大量的需求,例如开关(交换机)、网络接口卡等等。
. T$ K9 I6 `" V! o1 Y: X7 ?
; X7 z! c+ Y0 _" i2 ]: N以太网满足下列标准:6 A, ~# h* L( f% r2 E9 D2 v
$ E, Y% |. ~7 s( R2 |0 s& n) ^* H2 L
● IEEE 802.3-2002,用于以太网MAC。9 v8 ^$ a, E: P

- P+ \/ H' ?: |& M● IEEE 1588-2008 标准,用于规定联网时钟同步的精度。' G( Q0 N+ e' K# S' e0 G/ j: W+ t

/ R) p3 y, J% G3 g& c* ?+ P1 g● AMBA 2.0,用于AHB 主/从端口。+ ~$ L. ]8 r( ~; y' y- r

( @3 {0 U% e2 O4 r● RMII 联盟的 RMII规范。+ _( }' B5 `4 x2 P8 g

! U. e1 h4 y( r& O5 L2 i  g' I. s  B, f1 T; C
02、STM32F207的ETH介绍

4 {! U8 J! R  c, PSTM32F207支持MII接口和RMII接口。STM32F207以太网外设包括一个MAC802.3(介质访问控制)和一个DMA控制器。它默认情况下支持MII和RMII接口,通过一个选择位进行切换。- a4 w2 q6 p) q
, \. N) G- S  p. y" O5 }: b$ H
DMA控制器通过AHB主从接口和内核与内存相连。AHB主接口控制数据传输,AHB从接口用于访问控制和状态寄存器(CSR)空间。
# \4 R6 Q# x: V; @! @$ v9 H6 F& w- F' Y% @5 d. ]8 D; A: E
在MAC内核发送数据之前,数据经过DMA的方式发送到FIFO中缓存。同样的,接收FIFO存储通过线路收到的以太网数据帧,直到这些数据帧通过DMA被传输到系统内存。
( {% D. r7 M3 a( S
9 Y5 _( ^( S  L以太网外设也包括一个SMI,用于和外部PHY通讯。通过一组寄存器的配置,用户可以选择MAC和DMA控制器的不同模式和功能。9 T# i: K* f& V: J

( D6 P9 p2 B4 y( r1 i当使用以太网时,AHB时钟必须至少25MHZ。2 F9 w. M) k; W

& c/ u' b, `$ |3 E6 u1 |下面是ETH的框图
# W/ J) i7 G6 Y. S- [* J" h; Z1 d, [! V0 D% a$ S
adcfce9577a28b8ac927ed18f7a20b09.png
' ]; ^1 i  Z  ]6 ]3 v# i  x  n- u4 f6 k! v
关于AHB的连接信息:
4 T, n) O2 n# y' F0 |& Y
5 {5 Y8 Y  D& e区域1:我们称为SMI接口,用于配置外部PHY芯片。7 ^/ z9 u/ u! f' B
% I6 S7 z  k& K* e1 g* K
区域2:是数据交换接口,也就是上面我们说的MII接口和RMII接口。" h3 P! M( }0 C2 v; u5 e

. q$ c6 [# ~  v1 X: B03、SMI接口
  l$ \0 B% J8 k0 S3.1、站管理接口:SMI

/ s* F+ k( \% [2 N站管理接口允许任何PHY寄存器请求通过2线时钟和数据线。这个接口支持最多到32个PHY。
9 H* W$ h4 H" I2 g) z! R# k9 B: j
% `, F! p' m; a应用程序可以从 32个 PHY中选择一个PHY,然后从任意PHY 包含的32 个寄存器中选择一个寄存器,发送控制数据或接收状态信息。任意给定时间内只能对一个PHY 中的一个寄存器进行寻址。2 S* r, \$ U7 F
. S6 Q& x. z( H
MDC 时钟线和 MDIO数据线在微控制器中均用作复用功能I/O:+ h$ U# M/ E) z0 S' X

& Z( J* ?3 X- e5 v+ JMDC:周期性时钟,提供以最大频率2.5 MHz 传输数据时的参考时序。MDC的最短高电平时间和最短低电平时间必须均为160 ns。MDC的最小周期必须为400 ns。在空闲状态下,SMI管理接口将 MDC时钟信号驱动为低电平。
" X% p, s" h" R$ f- @4 M- `
8 G* e2 u3 Z3 t; VMDIO:数据输入/输出比特流,用于通过MDC 时钟信号向/从PHY 设备同步传输状态信息。0 B9 ?  N1 v) k7 E. n( t% I* z

0 Q3 r3 P) P0 c" c" |" Z3 B" \ 5aadc9ece14aa2dc17b459a87429c4c2.png
' Z3 p$ F9 Z$ s" }& s8 I& N: i/ M# ?! L7 P& b3 O
3.2、SMI帧结构
  F3 I( I6 E& L2 n6 t! I& x) D下图给出了读操作和写操作帧结构,位传输必须要求从左到右。# f$ _* P1 P! o9 z- a7 e5 ?
5 u/ a7 A* \8 G7 G" S* I
1249cde3071b8040a32ad08dbf51063f.png
& b7 |: p4 a: |) x) U
2 w6 J8 k  r3 A3 q$ ?Preamble(32bit前导符):每个传输(读或者写)都必须以前导符开始,前导符是MDIO线上连续的32个逻辑’1’信号,和对应MDC线上的32个时钟信号。这部分信号用于和PHY设备建立同步。
" ^# e9 k! d% |. B7 k( L% O& A
3 g' K+ f+ j* m) b! F! J- R8 F  UStart(起始符):帧的起始符定义为’01’,也就是MDIO线从逻辑’1’降到’0’再回到’1’,以标记传输的。3 F7 x% `' ]* J
: @- `9 S: R0 s" D7 i) m
开始。
  D3 T4 j* G5 n9 g) y1 h
+ @6 k0 T( R6 Y' X* ]# R# i* d- OOperation(操作符):用于定义操作的类型:读或者写。; X7 x$ R* c& R. w4 E& [% h& x1 _

* G; w8 S# \9 @* Q8 U$ G6 APADDR:PHY的地址有5位,可以区分32个PHY。高位先被发送和接收。5 ~/ q0 c) @) h, _$ ]9 ~

8 o8 o) L' |. T7 T. L( PRADDR:寄存器的地址有5位,可以寻址32个独立的寄存器。高位先被发送和接收。; k: s. B( r) B9 G

  ^4 j0 j; m7 H+ a; u3 UTA:2位的转向符,插在RADDR和数据(DATA)之间,用于避免读操作时发生冲突。读操作时,在TA的这2位时间内,MAC控制器保持MDIO线的高阻状态,PHY设备则先保持1位的高阻状态,在第2位时输出’0’信号。写操作时,在TA的这2位时间内,MAC控制器驱动MDIO线输出’10’信号,而PHY设置则保持高阻状态。" T8 I& _* X, G4 T' f, m' W6 u0 z
4 B! E/ K' b( o$ R! s
DATA(数据):16位的数据域。最先发送和接收的是ETH_MIID寄存器的第15位。
* L5 U+ y% k  x
% I  o; X) m: J) }( Y空闲位:MDIO线保持在高阻状态。取消所有的三态驱动,由PHY的上拉电阻保证MDIO线处于逻辑’1’。
& j, W7 f7 h8 k$ p! |/ K. C6 m0 p& D7 }+ T2 M
3.3、SMI写操作3 s) M- d& ^4 m0 v, q( }
当应用程序设置了MII写和忙位(以太网MACMII地址寄存器(ETH_MACMIIAR)),SMI接口会向PHY传 送 PHY地 址 和 PHY寄 存 器 地 址 ,然 后 传 输 数 据 (以 太 网 MAC MII 数据 寄 存器(ETH_MACMIIDR))。在SMI接口传输数据的过程中,不能修改MII地址寄存器和MII数据寄存器的内容;在此过程中(忙位为高),对MII地址寄存器或MII数据寄存器的写操作将被忽视,并且不影响整个传输的正确完成。当完成写操作时,SMI接口将清除忙位,告知应用程序。+ Z& S9 l0 I8 H- `  r% T
& ~5 [1 [: c* h
下图描述了写操作时的帧格式。" V/ Y& |5 p, P  ]1 g* l" H
' s0 [: `+ I- Z
5efc26dded86ce7ca0844c15ce199b47.png
1 ~- F( v1 x# K! a* @
- N( _- g. m0 S$ Y3 a3.4、SMI读操作  w1 Y0 u1 ~% d1 A; e
当程序把以太网MACMII地址寄存器(ETH_MACMIIAR)的MII忙位置为’1’,而保持MII写位为’0’,SMI接口则发送PHY地址和PHY寄存器地址,执行读PHY寄存器的操作。在整个传输过程中,应用程序不能修改MII地址寄存器和MII数据寄存器的内容。在传输过程中(忙位为高),对MII地址寄存器或者MII数据寄存器的写操作将被忽视,并且不影响整个传输的正确完成。在读操作完成后,SMI接口将清除忙位,并把从PHY读回的数据更新到MII数据寄存器中。
: h- F# p, _  ]  D* e! G3 T8 V0 N& \; t9 r. R+ p; V
下图描述了读操作的帧格式
4 b. }4 H! H! o- |' U8 L$ g: O( b7 j/ l; f; T  O
f04b50697b1ca6dcc10d123ca2c027d7.png 6 _. Q1 q2 ~6 q

. ?) |9 e( ?# f5 o9 n3.5、SMI时钟选择
2 F$ l: V- B: I  S. MMAC 启动管理写/读操作。SMI时钟是一个分频时钟,其时钟源为应用时钟(AHB时钟)。分频系数取决于MII地址寄存器中设置的时钟范围。这里既然说到了时钟,就再次提一下上文提到的内容:当使用以太网时,AHB时钟必须至少25MHZ。
" r7 R& W3 \* T! ]0 c
5 h$ X# \1 Q% a8 O, A 03d4658bcc1b9564c540226e8abc1564.png ; l; S7 x; q- t7 }4 R

. M  D; E) y$ W/ J: X, K04、代码
. o  [/ ^$ L" SSTM32的网口的SMI接口初始化是十分简单的。/ Z# L7 H0 P4 [$ u, i( i8 ?& C

  ~0 ?8 e3 G& U6 T! j( W  t初始化GPIO。# f. a  U* @* d% L1 ~

$ D9 K4 t$ o# t+ a
  1. RCC_AHB1PeriphClockCmd(RCC_AHB1Periph_GPIOA |  RCC_AHB1Periph_GPIOC |RCC_AHB1Periph_GPIOF, ENABLE);6 K; Z1 ^% ?; T5 ^
  2. 9 l1 v) C6 g' ~; W0 n8 a$ e5 S
  3. /* Enable SYSCFG clock */7 n9 _7 @7 a* _2 `0 L! O) F
  4. RCC_APB2PeriphClockCmd(RCC_APB2Periph_SYSCFG, ENABLE);  & q+ E7 D4 \/ q) v, D. b' b
  5. GPIO_InitStructure.GPIO_Pin = GPIO_Pin_2;
    " i  a# e, ^; b' S" G$ E0 C' a
  6. GPIO_Init(GPIOA, &GPIO_InitStructure);7 }3 s% K  p3 f/ c8 X
  7. GPIO_PinAFConfig(GPIOA, GPIO_PinSource2, GPIO_AF_ETH);% n4 e0 A5 g  \1 @- X0 g3 m. e
  8. 9 n; m* W, o' D: H: `
  9. GPIO_InitStructure.GPIO_Pin = GPIO_Pin_1;. W8 \- ?+ B9 n- k
  10. GPIO_Init(GPIOC, &GPIO_InitStructure);
    ! _, S" G- v% x! v2 i( m) f" H  Q
  11. GPIO_PinAFConfig(GPIOC, GPIO_PinSource1, GPIO_AF_ETH);
复制代码
5 F3 W+ U9 v/ _- b/ X/ V8 t
因为SMI接口需要MAC配合,所以需要是使能MAC的时钟。7 [  d" W/ E; X: d  j+ ~3 N0 Y7 w

( H$ X1 ~, f0 \* v/ k; R1 J8 }
  1. RCC_AHB1PeriphClockCmd(RCC_AHB1Periph_ETH_MAC |RCC_AHB1Periph_ETH_MAC_Tx |RCC_AHB1Periph_ETH_MAC_Rx, ENABLE);
复制代码

  L$ b1 e$ ]' z+ [: nSMI接口的读函数和写函数。1 V8 `6 s7 Z/ S% Z4 S

. r$ N, |* p! [) u! ^7 L
  1. uint16_t ETH_ReadPHYRegister(uint16_t PHYAddress, uint16_t PHYReg)  O& ?! b& O' H! i
  2. uint32_t ETH_WritePHYRegister(uint16_t PHYAddress, uint16_t PHYReg,uint16_t PHYValue)
复制代码
" e) M' f/ I" [) p8 M& i$ S
$ Z5 F  w$ I* s2 [! r% e5 V5 p
1 n" i6 d4 y- F, o
赞 收藏 评论0 发布时间:2022-4-17 20:43

举报

0个回答

所属标签

相似技术帖

官网相关资源

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