GD32F450以太网(1):ETH MAC外设接口简介
本文归纳总结了ETH外设接口的大概原理和引脚的作用说明,若需要详细资料,请参考用户手册
1. GD选型手册GD32F450部分
通过选型手册可知,GD32F450的全型号都集成了一个以太网外设 ETH MAC,
2. ETH MAC外设简介
GD32F450系列控制器内部集成了一个以太网外设,支持10Mbps或100Mbps数据传输速率 ,它实际是一个通过DMA控制器进行介质访问控制(MAC),它的功能就是实现 MAC 层的任务。借助以太网外设,GD32F450控制器可以通过ETH外设按照IEEE 802.3-2002和IEEE 1588-2008标准发送和接收MAC数据包。
ETH 内部自带专用的DMA控制器用于MAC,ETH支持两个工业标准接口介质独立接口(MII)和简化介质独立接口(RMII)用于与外部 PHY 芯片连接。 通过对SYSCFG_CFG1寄存器的相关位进行设置,可以配置使用 MII 还是 RMII 接口用于MAC 数据包传输,ETH还集成了站管理接口(SMI)接口专门用于与外部 PHY 通信,用于访问 PHY 芯片寄存器。
物理层定义了以太网使用的传输介质、传输速度、数据编码方式和冲突检测机制,PHY芯片是物理层功能实现的实体,生活中常用水晶头网线+水晶头插座+PHY组合构成了物理层。 ETH 有专用的DMA控制器,它通过 AHB 主从接口与内核和存储器相连,AHB主接口用于控制数据传输,而AHB从接口用于访问“控制与状态寄存器” (CSR)空间。在进行数据发送是,先将数据有存储器以DMA传输到发送TX FIFO 进行缓冲,然后由 MAC 内核发送;接收数据时,RX FIFO先接收以太网数据帧,再由DMA传输至存储器。ETH系统功能框图见下图:
发送数据模块包括:
-
TxDMA控制器:用于从存储器中读取描述符和数据,以及将状态写入存储器; -
TxMTL:用于对发送数据的控制,管理和存储。 TxMTL内含TxFIFO,用于缓存待MAC发送的数据; -
MAC发送控制寄存器组:用于管理和控制数据帧的发送。
接收数据模块包括:
- RxDMA控制器:用于从存储器中读取描述符,以及将数据与状态写入存储器;
- RxMTL:用于对接收数据的控制,管理和存储。 RxMTL实现了RxFIFO,用于存储待转发到系统存储的帧数据;
- MAC接收控制寄存器组:用于管理数据帧的接收和标示接收状态。 MAC内含接收过滤器,采用多种过滤机制,滤除特定的以太网帧。
注意: 在使用以太网模块时, AHB的频率应至少为25MHz。
3. ETH引脚接口说明
ETH的接口整体分为两个部分,一部分是用来通信以太网数据的MII/RMII接口,另一部分是用来控制PHY芯片内部寄存器的SMI接口。
以太网模块通过MII/RMII接口与片外PHY连接,传送与接收以太网包。 MII或RMII模式由软件选择。
通过SMI接口对PHY芯片进行管理,可以配置以太网通信模式和检测通信状态等。
3.1 MII 和 RMII 接口
介质独立接口(MII)用于链接 MAC 控制器和 PHY 芯片,提供数据传输路径。
RMII 接口是 MII 接口的简化版本, MII 需要16根通信线, RMII 只需7根通信,在功能上是相同的。 下面两个图分别是 MII 接口连接示意图和RMII 接口连接示意图:
3.1.1 MII 接口连接示意图:
接口说明:
- MII_TX_EN:发送使能信号,此信号必须与数据前导符的起始位同步出现,并在传输完毕前 一直保持。
- MII_TX_CLK:发送数据使用的时钟信号,对于10Mbit/s的数据传输,此时钟为2.5MHz,对于100M bit/s的数据传输,此时钟为25MHz。
- MII_TXD[3:0]:发送数据线,每次传输4位数据,数据在MII_TX_EN信号有效时有效。MII_TXD[0]是数据的最低有效位, MII_TXD[3]是最高有效位。当MII_TX_EN信号无效时, PHY忽略传输的数据。
- MII_RX_DV:接收数据使能信号,由PHY控制,当PHY准备好数据供MAC接收时,该信号有效。此信号必须和帧数据的第一个4位同步出现,并保持有效直到数据传输完成。在传送最后4位数据后的第一个时钟之前,此信号必须变为无效状态。为了正确地接收帧,有效电平不能滞后于数据线上的帧首界定码出现。
- MII_RX_ER:接收出错信号,保持一个或多个时钟周期(MII_RX_CLK) 的有效状态,表明MAC在接收过程中检测到错误。具体错误原因需结合MII_RX_DV的状态及MII_RXD[3:0]的数据值,详见下表:(接收接口信号编码)。
- MII_RX_CLK:接收数据使用的时钟信号,对于10Mbit/s的数据传输,此时钟为2.5MHz,对于100M bit/s的数据传输,此时钟为25MHz。
- MII_RXD[3:0]:接收数据线,每次接收4位数据,数据在MII_RX_DV信号有效时有效。MII_RXD[0]是数据的最低位, MII_RXD[3]是最高位。当MII_RX_DV无效,而MII_RX_ER有效时, MII_RXD[3:0]数据值代表特定的信息请参考下表:(接收接口信号编码)。
- MII_CRS:载波侦听信号,仅工作在半双工模式下,由PHY控制。当发送或接收介质非空闲时,此信号有效。 PHY必需保证MII_CRS信号在发生冲突的整个时间段内都保持有效。此信号不需要与发送/接收的时钟同步。
- MII_COL:冲突检测信号,仅工作在半双工模式下,由PHY控制。当检测到介质发生冲突时,
此信号有效,并且在整个冲突的持续时间内,保持此信号有效。此信号不需要与发送/接收的时 钟同步。
接收接口信号编码表:
MII_RX_ER | MII_RX_DV | MII_RXD[3:0] | 说明 |
---|
0 | 0 | 0000 to 1111 | 正常的帧间隔 | 0 | 1 | 0000 to 1111 | 正常的数据接收 | 1 | 0 | 0000 | 正常的帧间隔 | 1 | 0 | 0001 to 1101 | 保留 | 1 | 0 | 1110 | 载波错误指示 | 1 | 0 | 1111 | 保留 | 1 | 1 | 0000 to 1111 | 数据接收出错 |
MII 时钟源: 为了产生TX_CLK和RX_CLK时钟信号,外部PHY模块必需有来自外部的25MHz时钟驱动。该时钟不需要与MAC时钟相同。可以使用外部的25MHz晶振或者微控制器的时钟输出引脚CK_OUTx(x=0,1)提供这一时钟。当时钟来源为CK_OUTx(x=0,1)引脚时需配置合适的PLL,保证CK_OUTx(x=0,1)引脚输出的时钟为25MHz。
3.1.2 RMII 接口连接示意图:
精简媒体独立接口(RMII) 规范减少了以太网通信所需要的引脚数。根据IEEE 802.3标准, MII接口需要16个引脚用于数据和控制信号,而RMII标准则将引脚数减少到了7个。 RMII具有以下特性:
- 只有一个时钟信号,且该时钟信号需要提高到50MHz
- MAC和外部的以太网PHY需要使用同样的时钟源
- 使用2位宽度的数据收发
接口说明:
- RMII_TX_EN:发送使能信号,此信号必须与数据前导符的起始位同步出现,并在传输完毕前 一直保持。
- RMII_TXD[1:0]:发送数据线,每次传输2位数据,数据在RMII_TX_EN信号有效时有效。RMII_TXD[0]是数据的最低有效位,RMII_TXD[1]是最高有效位。当RMII_TX_EN信号无效时, PHY忽略传输的数据。
- RMII_RX_DV:接收数据使能信号,由PHY控制,当PHY准备好数据供MAC接收时,该信号有效。其他意义请参考MII_RX_DV说明。
- RMII_RXD[1:0]:接收数据线,每次接收2位数据,数据在RMII_RX_DV信号有效时有效。RMII_RXD[0]是数据的最低位, RMII_RXD[1]是最高位。其他意义请参考MII_RXD[3:0]说明。
- RMII_REF_CLK:发送和接收数据使用的时钟信号,对于10Mbit/s的数据传输,此时钟为5MHz,对于100M bit/s的数据传输,此时钟为50MHz。
RMII 时钟源:
RMII_REF_CLK是发送和接收数据同时使用的时钟信号,为了产生RMII_REF_CLK时钟信号,外部PHY模块必需有来自外部的50MHz时钟驱动。将相同的时钟源接到MAC和以太网PHY的REF_CLK引脚保证两者时钟源的同步。可以使用外部的25MHz晶振通过PHY芯片内部倍频产生50M(有的PHY芯片支持),再输出到MCU,或者直接外接一个50M时钟同时接到PHY的REF_CLK引脚和MAC,再或者用微控制器的时钟输出引脚CK_OUTx(x=0,1)提供这一时钟。当时钟来源为CK_OUTx(x=0,1)引脚时需配置合适的PLL,保证CK_OUTx(x=0,1)引脚输出的时钟为50MHz。
3.1.3 关于MII 和 RMII 接口的注意事项
- 对于MII 接口,有上面那个
接收接口信号编码表 来表示数据的正常还是异常。对于 RMII 接口,我并不清楚怎样表示数据的正常还是异常,但是猜测MII 和 RMII 接口对于数据正常还是异常表示方法是不同的。 - MII/RMII 位传输顺序:正常我们数据都是8位的,那么不管是MII还是RMII接口,都要分段发送(每次4bit或2bit),发送接收的次序都是低位先出。MII和RMII之间的区别主要是数据位数和发送次数的不同。 MII上是先发送/接收低4位数据,再发送/接收高4位。在RMII上则是先发送/接收最低2位数据,再次低2位数据,次高2位数据,和最高2位数据。
例如:一个字节数据为10011101b(从左到右顺序:高位到低位)。使用MII发送需2个时钟周期:1101 -> 1001(从左到右顺序:高位到低位);使用RMII发送需4个时钟周期: 01 -> 11 -> 01 -> 10(从左到右顺序:高位到低位)。 - 上面的引脚只是 MII 和 RMII 接口的引脚,实际还会有SMI站点管理接口引脚,同时PHY芯片也会有一些引脚(如PHY的reset复位引脚,可选的还有INT引脚);
- 针对不同的PHY 芯片,对MII 和 RMII 接口支持也不相同,有的两种接口都支持,有的只支持其中一种接口。
针对上面两种接口,这里做了一个接口对比,能更好的理解MII 和 RMII 接口:
- TX_EN:数据发送使能。在整个数据发送过程保存有效电平。
- TX_CLK:数据发送时钟线。标称速率为 10Mbit/s 时为 2.5MHz;速率为100Mbit/s 时为 25MHz。 RMII 接口没有该线。
- TXD[3:0]或 TXD[1:0]:数据发送数据线。对于 MII 有 4 位, RMII 只有 2 位。只有在 TX_EN 处于有效电平数据线才有效。
- RX_DV:接收数据有效信号,功能类似 TX_EN,只不过用于数据接收,由 PHY芯片负责驱动。对于 RMII 接口,是把 CRS 和 RX_DV 整合成 CRS_DV 信号线,当介质处于不同状态时会自切换该信号状态。
- RX_ER:仅用于 MII 接口,接收错误信号线,由 PHY 驱动,向 MAC 控制器报告在帧某处检测到错误。
- RX_CLK:数据接收时钟线。标称速率为 10Mbit/s 时为 2.5MHz;速率为100Mbit/s 时为 25MHz。 RMII 接口没有该线。
- RXD[3:0]或 RXD[1:0]:数据接收数据线,由 PHY 芯片负责驱动。对于 MII 有 4位, RMII 只有 2 位。在 MII 模式,当 RX_DV 禁止、 RX_ER 使能时,特定的RXD[3:0]值用于传输来自 PHY 的特定信息。
- CRS:仅用于 MII 接口,载波侦听信号,由 PHY 芯片负责驱动,当发送或接收介质处于非空闲状态时使能该信号。在全双工模式该信号线无效。
- COL:仅用于 MII 接口,冲突检测信号,由 PHY 芯片负责驱动,检测到介质上存在冲突后该线被使能,并且保持至冲突解除。在全双工模式该信号线无效。
- REF_CLK:仅用于 RMII 接口,由外部时钟源提供 50MHz 参考时钟。因为要达到 100Mbit/s 传输速度, MII 和 RMII 数据线数量不同,使用 MII 和 RMII 在时钟线的设计是完全不同的。对于 MII 接口,一般是外部为 PHY 提供 25MHz 时钟源,再由 PHY 提供 TX_CLK 和 RX_CLK 时钟。对于 RMII 接口,一般需要外部直接提供 50MHz 时钟源,同时接入 MAC 和 PHY。
更为详细说明请参考用户手册
3.2 SMI站点管理接口
站点管理接口(SMI) 通过MDC时钟线与MDIO数据线这两条线与外部PHY通讯,可以通过其访问任意PHY的任意寄存器。 SMI接口可以支持最多32个PHY,应用程序可以从 32 个 PHY 中选择一个 PHY,然后从任意 PHY 包含的 32 个寄存器中选择一个寄存器,发送控制数据或接收状态信息。但在任意给定时间内只能对一个 PHY 中的一个寄存器进行寻址。
SMI站点管理接口连接示意图:
MDC时钟线和MDIO数据线具体作用如下:
- MDC:最高频率为2.5MHz的时钟信号,在空闲状态下该引脚保持为低电平状态。在传输数据时该信号的高电平和低电平的最短保持时间为160ns,信号的最小周期为400ns;
- MDIO:用于与PHY之间的数据传输,与MDC时钟线配合,接收/发送数据。
SMI接口的时钟源由AHB时钟分频得到。为了保证MDC时钟频率不超过2.5MHz,需根据AHB时钟频率对PHY控制寄存器中相关位进行设置,选择合适的分频系数。 下表的时钟范围列出了对应AHB时钟范围的分频系数的选择 :
AHB时钟 | MDC 时钟 | 选择位 |
---|
150~240MHz | AHB clock/102 | 0x4 | 35~60MHz | AHB clock/26 | 0x3 | 20~35MHz | AHB clock/16 | 0x2 | 100~150 MHz | AHB clock/62 | 0x1 | 60~100MHz | AHB clock/42 | 0x0 |
详细说明请参考用户手册
4. ETH对应GD32F450引脚配置
下面列出了MAC模块所用引脚在MII/RMII模式下默认及重映射的功能和具体配置 。
注意: 对任意接口模式(MII/RMII),有的MAC信号有两个引脚可以选择,这时候就要根据板子的引脚设计选择一个合适的引脚,不可以两个引脚都选,只能将其中的一个引脚映射到AF11 。
MAC信号 | 引脚配置(AF11) | MII可选引脚(1) | MII可选引脚(2) | RMII可选引脚(1) | RMII可选引脚(2) |
---|
ETH_MDC | 推挽复用输出,高速 (50MHz) | PC1 | - | PC1 | - | ETH_MII_TXD2 | 推挽复用输出,高速 (50MHz) | PC2 | - | - | - | ETH_MII_TX_CLK | 推挽复用输出,高速 (50MHz) | PC3 | - | - | - | ETH_MII_CRS | 推挽复用输出,高速 (50MHz) | PA0 | PH2 | - | - | ETH_MII_RX_CLK ETH_RMII_REF_CLK | 推挽复用输出,高速 (50MHz) | PA1 | - | PA1 | - | ETH_MDIO | 推挽复用输出,高速 (50MHz) | PA2 | - | PA2 | - | ETH_MII_COL | 推挽复用输出,高速 (50MHz) | PA3 | PH3 | - | - | ETH_MII_RX_DV ETH_RMII_CRS_DV | 推挽复用输出,高速 (50MHz) | PA7 | - | PA7 | - | ETH_MII_RXD0 ETH_RMII_RXD0 | 推挽复用输出,高速 (50MHz) | PC4 | - | PC4 | - | ETH_MII_RXD1 ETH_RMII_RXD1 | 推挽复用输出,高速 (50MHz) | PC5 | - | PC5 | - | ETH_MII_RXD2 | 推挽复用输出,高速 (50MHz) | PB0 | PH6 | - | - | ETH_MII_RXD3 | 推挽复用输出,高速 (50MHz) | PB1 | PH7 | - | - | ETH_PPS_OUT | 推挽复用输出,高速 (50MHz) | PB5 | PG8 | PB5 | PG8 | ETH_MII_TXD3 | 推挽复用输出,高速 (50MHz) | PB8 | PE2 | - | - | ETH_MII_RX_ER | 推挽复用输出,高速 (50MHz) | PB10 | PI10 | - | - | ETH_MII_TX_EN ETH_RMII_TX_EN | 推挽复用输出,高速 (50MHz) | PB11 | PG11 | PB11 | PG11 | ETH_MII_TXD0 ETH_RMII_TXD0 | 推挽复用输出,高速 (50MHz) | PB12 | PG13 | PB12 | PG13 | ETH_MII_TXD1 ETH_RMII_TXD1 | 推挽复用输出,高速 (50MHz) | PB13 | PG14 | PB13 | PG14 |
到此,ETH外设接口简介就介绍完了,关于ETH的使用,请看我的其他文章。
|