5.1 初学者重要提示
: \5 [' F b) R6 C1 k5 Q' a7 o 学习本章节后,务必学习STM32参考手册中MAC章节的基础知识讲解,非常重要。
$ E6 A) v/ {0 _* e0 s( M. O% o/ H 实际项目中,关于MAC的配置问题,需要大家学习我们论坛网友发的这个帖子。0 S# g }& ]# j0 }' i U* v( i
$ _7 q( `' {3 B* k( }) S
5.2 什么是MAC
5 b( R4 S( R" V% m0 ^媒体访问控制(MAC,Media Access Control),又称作介质访问控制,简称MAC,是局域网中数据链路层的下层部分,提供地址及媒体访问的控制方式,使得不同设备或网络上的节点可以在多点的网络上通信,而不会互相冲突,上述的特性在局域网中格外重要。早期网络发展时以MAC判别各个网络接口的位置,但后来互联网发展后,才有IP的制定与使用。若只是两台设备之间全双工的通信,因为两台设备可以同时发送及接收数据,不会冲突,因此不需要用到MAC协议。0 L: N, o. L2 I0 W& e5 ?
& u6 J7 x$ ^9 ?" Z0 ~7 w+ H0 `媒体访问控制MAC子层负责解决与媒体接入有关的问题,在物理层的基础上进行无差错的通信。
/ L; a4 |/ n1 w/ ]; ~, r
+ G; C( H4 J0 U, p! j0 P* h) {MAC子层是网络与设备的接口,它从网络层接收数据帧,然后通过媒体访问规则和物理层将数据帧发送到物理链路上。它也从物理层接收数据帧,再送到网络层。总的来说,MAC有三大功能:
! W+ W. e' p. z& ]; R& L6 q& ~6 |# ?5 u0 W) z: A3 I1 {4 y
决定节点何时发送数据包。
q* z4 [; A% S+ l/ S4 Q; z 将数据帧发送到物理层,然后发送到物理链路。0 L; E4 @9 a5 `) t( ]) F% h8 C
从物理层接收数据帧,然后送给网络层处理。
* Y& s* S5 n& }& l3 L" |3 Z& Q其中最重要的是第一点:决定节点何时发送数据包。对于每一种媒体访问控制技术,用来控制节点发送时机的规则叫做媒体访问规则。局域网上的节点不能想要发送数据就发送,节点只能在轮到它的时候才发送。6 d' f7 A8 e& e O! ?3 A7 o
7 k& q7 A( [( T9 R5.3 MAC地址7 ^/ I/ i0 E" z8 a: Z ~. m# k
MAC地址,又称为物理地址、硬件地址,用来定义网络设备的位置。在OSI模型中,第三层网络层负责 IP地址,第二层数据链路层则负责 MAC地址。因此一个主机会有一个MAC地址,而每个网络位置会有一个专属于它的IP地址。/ \& U, {9 I. l$ i8 g4 K
- w! y6 m( e% {2 m1 U1 JMAC地址长度是48bit(6字节),由16进制的数字组成,分为前24位和后24位:& ]/ J H$ f: q8 y" ^
+ U( R# C- R# E/ v) Z 前24位叫做组织唯一标志符(Organizationally Unique Identifier,即OUI),是由IEEE的注册管理机构给不同厂家分配的代码,区分了不同的厂家。
0 x. h2 ?1 U$ \2 O$ a/ r3 D% e# \; J 后24位是由厂家自己分配的,称为扩展标识符。同一个厂家生产的网卡中MAC地址后24位是不同的。/ D( n1 n* u6 [) u) U* k
MAC地址的完整数据格式如下(来自wiki百科):# z$ D k$ s8 B- E8 K! G6 A0 j$ B& _( m$ c
/ X2 r; c* m9 u: d
- g- J* Z* I# s$ M
, I% T3 |, h. x4 x3 B) r# h
第一个字节的后两位比较重要:
, \& p; P3 J1 u7 |
0 l$ h; V3 b+ [$ D5 e2 ib0 = 0:表示MAC单播地址。1 m, ?5 V9 w' ] Z, |( u5 q
$ X; p- ]7 J( W2 q7 Q* w/ Nb0 = 1 : 表示MAC组播地址。
2 N# k1 r6 z( h2 k/ S( T8 b! _6 ^+ i7 M6 X
b1 = 0:表示OUI分配的全球唯一MAC地址。
& i3 m% k% T/ y
+ e% X9 \2 p; X" Sb1 = 1:表示用于本地管理的MAC地址。
+ O ?' P, t% G2 H) B# c2 ?
6 Q. q% [/ ]2 t9 S为了更好地理解,举几个例子:, v% V- W+ z1 G- B
l7 E4 V, ?5 S: V' ? 00:xx:xx:xx:xx:xx是MAC单播地址。. k2 L; t! ?3 v- h
01:xx:xx:xx:xx:xx是MAC组播地址。2 F6 ~& b" m- b9 L! ^, P
01:00:5e:xx:xx:xx是IPv4组播地址。% ], f2 I* D6 w. E# t* X
ff:ff:ff:ff:ff:ff则作为广播地址。( Z4 T! W, d# Z/ c- {& _7 w( c/ ^( a! n
00:50:c2:xx:xx:xx 是意法半导体的MAC地址。
0 i3 o1 f7 M8 e1 R5.4 STM32自带MAC基础知识, ?9 h9 \: e9 _; `
关于STM32自带的MAC部分,STM32参考手册中写的晦涩难懂,特别是中文翻译版本,逻辑混乱,如果可以的话,建议大家看英文版。% U- Z8 P' m2 e0 Y! W3 @! ?# v
7 I. ], u0 q. |
STM32参考手册中对MAC的讲解主要分为三部分:
( t! e3 X. E9 b$ f$ t/ g* \; K
( u+ {7 }% f- g0 W; N0 T$ ~* p MAC的接口MII和RMII。
^- E( {6 y6 h- Z- s) u7 N参考手册中对这一部分讲解的比较详细,也比较容易理解,建议初学者务必读一读。我们这里就不将其复制粘贴过来了。% w$ ?( ]6 l+ \2 ~4 B, Y
) G" w3 d; \! ~3 } MAC802.3帧格式,帧发送,帧接收等方面的讲解。
I3 z$ \7 K$ m# x# ?- J4 w3 E这一个部分知识点理解起来比较困难,配合下一章节的底层驱动就好理解了。
2 r: T2 i6 G x+ y' _; V9 N2 L2 Q; _
MAC的DMA收发方式控制。: X- x; I% X4 ^) p6 m3 P4 I3 }
手册中给出了DMA方式的发送和接收的初始化顺序,在下一章节讲解底层驱动的时候结合驱动代码会理解的更好,建议初学者也读一遍。6 y: g; Q4 { u6 N* ]5 H
- D! e: ~! _& ~- _* r
5.5 以太网PHY基础知识
$ X* f" E$ X. ?; a( g5 m仅有STM32自带的MAC还不能做网络通信,还需要外接以太网PHY芯片才可以,如同RS485通信一样,仅有一个串口是不行的,还需要外接RS485的PHY芯片。
& R$ n3 C% E+ O8 d! t& q) D- ]; s; r, Z1 x
PHY(Port Physical Layer),可称之为端口物理层,是一个对OSI模型物理层的简称。现在常用于STM32的有DP83848,LAN8270,DM9161/9162等。这些PHY芯片都大同小异,基本寄存器都是一样的,只有扩展寄存和厂商专门设置的寄存器不同。如果用户将其中一个PHY驱动成功了,驱动另一个也是非常方便的,下面是DP83848和DM9161/9162的基本寄存器和扩展寄存器:5 I+ D9 D' Y. f1 D
1 |4 R* ]+ Y) s
- /* DP83848C and DM9161 PHY Registers is the same */# ]% P" e/ C- F. F; |
- #define PHY_REG_BMCR 0x00 /* Basic Mode Control Register */
9 a$ y* W+ {2 ~1 I# G: O: h) Z - #define PHY_REG_BMSR 0x01 /* Basic Mode Status Register */
5 L4 |7 W: {! H$ V - #define PHY_REG_IDR1 0x02 /* PHY Identifier 1 */" s& a% X/ F. d9 N( w; c* @, J2 ~
- #define PHY_REG_IDR2 0x03 /* PHY Identifier 2 */
k$ F* J$ [1 k, E# ^4 ?9 l - #define PHY_REG_ANAR 0x04 /* Auto-Negotiation Advertisement */
8 h% h9 {6 w: O& X" S - #define PHY_REG_ANLPAR 0x05 /* Auto-Neg. Link Partner Abitily */
! K% W; @: i* c( m7 a6 c - #define PHY_REG_ANER 0x06 /* Auto-Neg. Expansion Register */- u( `0 ^' }' Q% W$ U; h. M9 P
- #define PHY_REG_ANNPTR 0x07 /* Auto-Neg. Next Page TX .DM9161 NO */
1 ^3 z1 j* A' b9 h+ m' j
1 F/ X6 X8 X* g" B- ]# v/ j! c) Y- /* Register BMCR bit defination */
" J- ]$ Y" ^( M9 Y- a - #define PHY_FULLD_100M 0x2100 /* Full Duplex 100Mbit */
8 z7 ?2 b5 @+ U - #define PHY_HALFD_100M 0x2000 /* Half Duplex 100Mbit */6 i6 [: _: g \# G
- #define PHY_FULLD_10M 0x0100 /* Full Duplex 10Mbit */
# y( w+ A5 k2 q0 o - #define PHY_HALFD_10M 0x0000 /* Half Duplex 10MBit */3 h+ r% x0 ]. @$ {6 y) r: V
- #define PHY_AUTO_NEG 0x1000 /* Select Auto Negotiation */
u- O, y4 A8 R/ e1 ?) \
3 c+ G9 f% Z. C* r- /* PHY Extended Registers only for DP83848C */! H" ]1 V7 e9 R3 q' g( q H5 d
- #define PHY_REG_STS 0x10 /* Status Register */9 D. m% N( @+ ~$ y3 B
- #define PHY_REG_MICR 0x11 /* MII Interrupt Control Register */
/ v4 y- K% t G& ^, y - #define PHY_REG_MISR 0x12 /* MII Interrupt Status Register */$ o( ~0 R% K6 Q# s4 C8 R
- #define PHY_REG_FCSCR 0x14 /* False Carrier Sense Counter */1 T% c; k$ }9 ~/ p" a- @1 j
- #define PHY_REG_RECR 0x15 /* Receive Error Counter */
2 t( D# S, Q3 V) l' ?0 M1 E - #define PHY_REG_PCSR 0x16 /* PCS Sublayer Config. and Status */* a0 Q1 V- f1 m! ` _
- #define PHY_REG_RBR 0x17 /* RMII and Bypass Register */, k7 u0 Z: w2 ^ D: D9 r7 {
- #define PHY_REG_LEDCR 0x18 /* LED Direct Control Register */
$ a( k8 f! w# f2 d0 l - #define PHY_REG_PHYCR 0x19 /* PHY Control Register */
' \7 a) ]6 w6 Q: I: v' [8 b7 T2 y/ M - #define PHY_REG_10BTSCR 0x1A /* 10Base-T Status/Control Register */
1 Q& R7 T( B d# o7 V; I) D - #define PHY_REG_CDCTRL1 0x1B /* CD Test Control and BIST Extens. */. P7 J, I/ H; ~* [' R
- #define PHY_REG_EDCR 0x1D /* Energy Detect Control Register */
6 A5 H! x( U. O! t
3 h2 z7 Z) G, p" R3 H& O4 s- /* PHY Extended Registers only for DM9161 */& ~$ v* l' [8 E$ V6 P1 s# i
- #define PHY_REG_DSCR 0x10 /* Specified Congfiguration Register */' L6 V% A, b8 H- Q+ f `* R6 Q! C: `
- #define PHY_REG_DSCSR 0x11 /* Specified Congfiguration and Status Register */
. B+ N* {' C9 O! G - #define PHY_REG_10BTCSR 0x12 /* 10Base-T Status/Control Register */; v8 y/ @3 ~6 a6 s% i/ m
- #define PHY_REG_PWDOR 0x13 /* Power Down Control Register */
$ s2 m% H/ q& L4 S8 M- Z8 t4 a - #define PHY_REG_CONGFIG 0x14 /* Specified Congfig Register */
# P1 e* h$ r3 [( `7 q5 t3 P - #define PHY_REG_INTERRUPT 0x15 /* Specified interrupt Register */
7 \7 A9 g P' a* q3 \8 X - #define PHY_REG_SRECR 0x16 /* Specified Receive Error Counter */" Q3 d! n7 x( h, l# b0 e! a
- #define PHY_REG_DISCR 0x17 /* Specified Disconnect Counter Register */
0 b: A6 q8 q: L1 a, o+ i - #define PHY_REG_RLSR 0x18 /* Hardware reset latch state Register */
6 Z, X# F: p/ t - #define PHY_REG_PSCR 0x1D /* Power Saving control register */
复制代码 , q- h5 g# P* S; J* l$ e; B
对于初学者来说,了解这些知识点就够了,具体如何配置这些寄存器会在下个章节讲解。! H' a: h' \; o( |& t, G
9 j. n: W+ X2 N, y2 a9 ~
5.6 总结
& V5 g) |& ~4 d+ H1 `1 s, w本章节就为大家讲解这么多,主要是为下章节的讲解做个铺垫。学习完毕本章节后,务必将STM32参考手册中MAC章节读一遍。# F' p3 i' H& P* j
+ t/ r9 h, D9 }( I2 u
: V: M( G- z" T4 P' I8 d+ w: \: v
|