MAC简介
我们知道TCP/IP的协议栈结构有应用层、传输层、网络层和链路层。
其中链路层又可以分为数据链路层和物理层。
那么这里的数据链路层就是MAC内核所作用的地方了。
STM32自带有10/100Mbit/s的以太网MAC内核,它提供地址及媒体访问的控制方式。
MAC内核特性

ST的ETH(以太网)框架

比如发送一个数据,网络层下达一个数据包,经过以太网DMA转发到TX FIFO中(存储器到存储器),然后经过MAC内核利用RMII接口转发到PHY外设中转变成光信号和电信号发送到网络中。
比如接收一个数据包,类似的,PHY接收到了光电的模拟信号,然后利用RMII接口发送到MAC内核处理,然后转发到RX FIFO中,RX FIFO利用以太网DMA转发至网络中。
我们可以看到,RX FIFO 和 TX FIFO都是2KB的,这是为什么呢?我们的以太网帧不能超过1500字节(1.4KB),所以2KB已经足够了。
以太网DMA数据包以DMA方式发送/接收,MAC内核以太网帧发送时,给数据加上一些控制信息;以太网帧接收时,去掉控制信息。
PHY交互接口,有数据通道和管理通道,数据通道是介质接口RMII/MII,管理通道是SMI站管理接口。
SMI站管理接口

允许应用程序通过时钟线和数据线访问任意PHY寄存器,最多支持32个PHY访问。也就是说我们的STM32内嵌的一个MAC内核他可以管理32个PHY芯片。
MDC:周期时钟引脚(最大频率为:2.5MHz)
MDIO:数据输入/输出比特流。

读取和写入的包头和起始都是一样的,操作不一样,一个10一个01.
PADDR就是PHY的地址,我们的SMI站管理接口可以管理多个PHY芯片,如何去管理的呢?就是通过PADDR不同的PHY地址进行管理,每一个PHY芯片对应了唯一的一个PHY地址。
RADDR就是寄存器地址,是PHY设备里面的寄存器地址,可以进行对应的读取和写入。
数据位就是PHY的寄存器,PHY的32个寄存器都是16位的。
MDC的时钟来源是什么呢?MDC时钟来自AHB时钟树分频得来的。
介质接口MII、RMII
我们MAC内核的以太网帧如何转换到PHY当中呢?
这就需要介质接口MII或RMII了,我们一般原则上使用RMII通道进行转换,而不使用MII,通过RMII通道转发到PHY当中,PHY再将信号转换为光电信号至网络当中。

那么MII和RMII有什么异同呢?为什么原则上要使用RMII呢?
如果我们选择的是MII,那么引脚数量会是16个IO,如果是RMII,引脚数量是9个IO。
如果我们选择的是MII,那么参考时钟会是25MHz,如果是RMII,参考时钟是50MHz。
如果我们选择的是MII,那么收发的位宽会是4位/周期,如果是RMII,收发的位宽是2位/周期。

MII介质接口所需要引脚数量为16个,而RMII接口所需要的引脚数量为9个。
MII介质接口的TX_CLK和RX_CLK由PHY芯片提供,它们会让MAC内核以这个时钟采集收发数据,例如,如果我们的传输数据时10M bit/s,那么TX_CLK和RX_CLK的频率会是2.5MHz。因为MII位宽是4位,所以2.5MHz的时钟频率对应10M bit/s。
RMII介质接口的REF_CLK, MAC内核以这个时钟采集收发数据
注意:RX_ER和RX_DV是用来检测以太网帧是否有效性,而CRS和COL以及CRS_DV在全双工模式下无效

介质MII的参考时钟来源有两个:MCO输出25MHz以及外部晶振输出25MHz
介质RMII的参考时钟来源有两个:MCO经过倍频PLL输出50MHz以及外部晶振输出50MHz(必须同时提供PHY和MAC)
注意:MII接口中的TX_CLK和RX_CLK时钟是根据数据传输速率挂钩,10Mbit/s:2.5MHz;100Mbit/s:25MHz

介质MII接口一个周期收发位宽为4位数据,而接口一个周期RMII收发位宽为2位数据
既然RMII位宽变小了,是不是RMII比MII收发速率变慢了?