之前的文章主要介绍了STM32的ExternalPHY Intereface部分,《STM32网络电路设计》也就是下图区域1。 本文将重点讲解STM32的MAC控制器,也就是下图区域2。$ s6 D/ S" c* {3 f1 O) O6 i 01 STM32的MAC概述' Q0 l2 m: `8 u4 u3 y& y STM32的MAC控制器全称是:MediaAccess Control。1 c# D' }% t' a4 L 2 M4 A( M+ ~; }* D$ y STM32F207的MAC控制器支持的模式7 A2 f* s: ~+ d) I! I! j3 Y 7 z' a7 a7 e4 O9 c6 J! I+ Z8 \ 符合IEEE 802.3 MAC# ^8 ]5 s/ c* R# y# A. Q 0 ~- I8 c2 U5 h z4 T0 T0 ? . E) w' k9 |5 l- o 10/100Mbps网络 % x/ t% O# ~8 V1 w5 M 全双工和半双工通信2 u0 t/ p/ j1 d R9 k9 q: P 7 F. K. U- v( K7 O* e+ p+ J 和外部PHY的MII接口和RMII接口 支持前导码和帧起始数据(SFD)插入或删除 L$ p% q9 y# r: K! j3 N 支持IPv4的头部checksum校验和检查 # n) u; o/ w* a. m6 R5 _ T3 E 支持以太网唤醒( r Y3 y( n1 E( O0 R4 T$ k & V( _, d2 B; `% _4 g 有效载荷检查 其实ST在设计MAC控制器时,设计了其他功能,PTP(IEEE1588)精确时间协议,MMC网络统计功能,这些功能并不常用,本人也没有接触,就不再讲解。 : k4 A( f0 J: E( m" M, z 对于上面说到的:支持前导码和帧起始数据(SFD)插入或删除。 + ^" j: N- _1 K, Z: J+ H 之前的推文《以太网数据首部》中并没有说到前导码和帧起始数据(SFD)。一个以太网数据结构如下:8 Q5 ^+ F+ I, ?1 ` @1 c7 y& ]* k4 U 大多数网络设备都是支持前导码和帧起始数据(SFD)插入或删除。所以可以说,这是网络硬件设备在以太网帧前打包的数据。个人认为并不属于TCP/IP协议簇的内容。 b2 p% {$ J& T! f# H# o7 @4 L ( x4 t# B$ V* t0 |$ A* A 02 MAC地址过滤 STM32的MAC控制器支持MAC地址过滤的。 ( s; h+ N, J- c0 l0 ~ 目的地址过滤: ·单播过滤3 X' e. j* U* [) V, `6 M ·组播过滤( s4 o, X. W5 W3 d ·广播过滤 " L$ g5 L9 Q3 T5 f% H4 V 3 J$ I. b) O" v# U; V$ b7 r+ k& l 注意:广播过滤会导致ARP广播也收不到,具体请看《TCP/IP协议簇中ARP协议》。0 I7 c. Z1 f3 v$ I; V/ v 源地址过滤: 单播过滤. f1 V( A9 F2 B; L O0 A: S $ X# u7 N# u5 _; B6 F STM32的MAC控制器还支持:规则翻转,比如,原来只允许单播过滤接收,翻转之后,只有单播不接收。 在STM32实际项目开发中,只需要调用ST的库文件即可) r6 a% d; }- O+ g0 C# E/ D9 A9 e 1 r( Q3 @; V! `* H * e3 o, K' y9 E. i0 w/ i ETH_InitStructure.ETH_BroadcastFramesReception =ETH_BroadcastFramesReception_Enable;//允许接收所有广播帧 关于MAC地址相关信息,什么是广播,MAC地址表示方法,请看之前的推文《以太网数据首部》。4 S( n1 D7 S2 H/ b ; L* [9 R F; W- X 03 有效载荷检查 0 B$ x7 Q. M c 有效载荷检查其实是IP协议要求长度必须大于46个字节,不足时填充pad字节,具体细节请看《5000字“肝”了这篇IP协议》。0 \0 Q7 O6 b' p n6 E, V7 ]4 B' f, W 2 y- l1 t& Y. S- O0 W 当从应用程序接收的字节数低于60时(DA+SA+LT+Data),零被附加到发送帧以使数据长度正好为46字节,以满足最小数据字段的要求IEEE802.3要求。+ C' W; m1 i! k1 H* a& X + e h# D5 @' U- `, r/ w/ q, t' n 04 Checksum校验和 首先明确,STM32的MAC控制器并不能对TCP/IP协议中所有的Checksum自动校验。STM32实现了IPv4,ICMP,TCP和UDP协议的Checksum校验和。 发送的时候,STM32会自动计算Checksum校验和并自动插入。 / m$ F# [) k/ W% i, i% a& m6 t0 B- O 接收的时候,STM32会自动校验Checksum校验和是否正确。( K0 I: D% \; t K4 S ; @- |5 c8 a# v+ _; Q; s: L 上述功能可以通过以下操作开启:' Q1 ~" l' x7 d, D4 u 通过在ETH_MACCR寄存器中设置IPCO位来启用接收校验和卸载。: a1 |- ~6 Z4 Q& M/ Q7 s, x1 F 通过在TDES1寄存器中设置CIC位,在传输时启用校验和计算和插入。$ c. k# G& v4 `5 j6 n & W+ c6 p2 a$ @- }; |- o' N 但实际代码开发中,并不需要操作寄存器,使用ST的库接口如下:$ I: T& }. O7 T
|