以太网移植操作

以太网:ST芯片内只有集成了MAC,并没有PHY,所以要外接一个LAN8720(DM9000)以太网芯片,之所以不集成到芯片内部是可能还是因为该芯片是模拟电路,如果添加进去会造成一定的功耗或IC的工艺不够

通信过程:MAC---》MII/RMII接口--》PHY

1.STM32F4以太网(Ethernet)MAC

1.1、MAC简介

STM32F407自带有10/100Mbit/s的以太网MAC内核,这个以太网MAC内核有 如下特性:

1、支持外部PHY接口实现10/100Mbit/s数据传输速率。

2、通过符合IEEE802.3的MII接口与外接快速以太网PHY进行通信

3、支持全双工和半双工操作

4、报头和帧起始数据(SFD)在发送路径中插入、在接收路径中删除

5、可逐帧控制CRC和pad自动生成。

6、可编程帧长度,支持高大16KB的巨型帧。

7、可编程帧间隔。

8、支持通过MDIO接口配置和管理PHY设备

 

STM32F407的ETH框图如下:

1.2、F407的MAC有3种接口:SMI、MII和RMII。

1.2.1、SMI站管理接口,程序中可以通过这个接口来访问PHY寄存器,SMI接口有两条线:数据线MDIO和时钟线MDC,该接口支持访问多达32个PHY。

MDC:周期性时钟,提供以最大频率 2.5 MHz 传输数据时的参考时序,在空闲状态下, SMI 管理接口将MDC 时钟信号驱动为低电平。

MDIO:数据输入/输出比特流,用于通过 MDC时钟信号向/从PHY 设备同步传输状态信息。

1.2.2、 MII介质独立接口:定义了 10Mbit/s 和100 Mbit/s 的数据传输速率下MAC 子层与PHY 之间的互连。


TX_CLK和RX_CLK为发送和接收连续时钟,当速率为10Mbit/s时为2.5MHZ,速率为100Mbit/s时为25MHZ。

要生成TX_CLK和RX_CLK时钟,必须向外部PHY提供25MHZ时钟,通常我们使用25M的晶振,也可以使用STM32F4xx的MCO引脚输出25MHZ的时钟。

 1.2.3、RMII精简介质独立接口:规范降低了 10/100Mbit/s 下微控制器以太网外设与外部PHY 间的引脚数。根据 IEEE 802.3u 标准,MII 包括16 个数据和控制信号的引脚。RMII 规范将引脚数减少为 7 个(引脚数减少62.5%)。不过RMII接口的参考时钟必须是50MHZ


RMII时钟源:通常使用50MHZ的时钟驱动PHY或使用嵌入式PLL生成50MHZ频率来驱动PHY。


 

2、LAN8720

2.1、LAN8720简介

LAN8720是低功耗的10/100M以太网PHY层芯片,I/O引脚电压符合IEEE802.3-2005标准。LAN8720支持通过RMII接口与以太网MAC层通信,内置10-BASE-T/100BASE-TX全双工传输模块,支持10Mbps和100Mbps。LAN8720可以通过自协商的方式与目的主机最佳的连接方式(速度和双工模式)。支持HP Auto-MDIX自动翻转功能,无需更换网线即可将连接更改为直连或交叉连接。

1、支持RMII接口以减少引脚数

2、支持全双工和半双工模式

3、可以使用25M晶振以降低成本

4、支持SMI串行管理接口

5、支持MAC接口

 

PHY地址设置

前面说了MAC可以通过SMI接口来读写PHY(LAN8720)的寄存器,SMI最多可以控制32个PHY芯片,通过不同的PHY芯片地址来对不同的PHY操作。LAN8720通过设置RXER/PHYAD0引脚来设置其PHY地址,默认情况下为0,其地址设置如下表所示。我们STM32F407开发板使用的是默认地址,也就是0X00。

 

RXER/PHYAD0引脚状态

PHY地址

上拉

0X01

下拉(默认)

0X00

 nINT/REFCLKO配置

nINTSEL引脚(2号引脚)用于设置nINT/REFCLKO引脚(14号引脚)的功能。nINTSEL配置如下表所示。我们STM32F407开发板使用的是REF_CLK Out模式

nINTSEL引脚值

模式

 nINT/REFCLKO引脚功能

nINTSEL=0

REF_CLK Out模式

作为REF_CLK时钟源

nINTSEL=1

REF_CLK In模式

作为中断引脚

 REF_CLK In模式

当工作在REF_CLKIn模式时,50MHz的外部时钟信号应接到LAN8720的XTAL1/CKIN引脚(5号引脚)和STM32F407的RMII_REF_CLK(PA1)引脚上,如下图所示。


REF_CLKOut模式

为了降低成本,LAN8720可以从外部的25MHz的晶振中产生REF_CLK时钟。到要使用此功能时应工作在REF_CLK Out模式时。当工作在REF_CLO Out模式时REF_CLK的时钟源如下图所示。

 

 2.2、LAN8720寄存器

PHY是由IEEE 802.3定义的,一般通过SMI对PHY进行管理和控制,也就是读写PHY内部寄存器。PHY寄存器的地址空间为5位,可以定义0~31共32个寄存器,但是随之PHY芯片功能的增加,很多PHY芯片采用分页技术来扩展地址空间,定义更多的寄存器,在这里我们不讨论这种情况。IEEE 802.3定义了0~15这16个寄存器的功能,16~31寄存器由芯片制造商自由定义。

BCR寄存器(0)


BSR寄存器(1)

 在ST的以太网驱动库stm32f4x7_eth.h中定义了PHY的BCR和BSR寄存器的地址和这两个寄存器对应bit的意义,如下:

#define PHY_BCR               0          /*!< Transceiver Basic ControlRegister */

#define PHY_BSR               1          /*!< Transceiver Basic StatusRegister */

#define PHY_Reset                            ((uint16_t)0x8000)

#define PHY_Loopback                         ((uint16_t)0x4000)
#define PHY_FULLDUPLEX_100M               ((uint16_t)0x2100)

#define PHY_HALFDUPLEX_100M             ((uint16_t)0x2000)

#define PHY_FULLDUPLEX_10M              ((uint16_t)0x0100)

#define PHY_HALFDUPLEX_10M              ((uint16_t)0x0000)

#define PHY_AutoNegotiation                    ((uint16_t)0x1000)

…………                                          

#define PHY_AutoNego_Complete              ((uint16_t)0x0020)

#define PHY_Linked_Status                      ((uint16_t)0x0004)

#define PHY_Jabber_detection                   ((uint16_t)0x0002)


LAN8720特殊功能寄存器(31)

LAN8720的特殊功能寄存器中的bit2~4是我们关心的,因为从这3个bit中,我们可以判断出当前开发板网络的双工方式和网速。这个寄存器的地址和bit的意义需要我们手动添加到ST的以太网驱动库文件stm32f4x7_eth_conf.h中

3、硬件连接


4、以太网DMA描述符

4.1、以太网DMA描述符

F407有一个以太网专用的DAM,DMA可以在CPU完全不干预的情况下,通过描述符有效地将数据从源传送到目标,接收缓冲区和发送缓冲区的数据都可以通过以太网DMA来传送。

共有两个描述符:一个用于接收,一个用于发送。描述符是一种链表,最后一个描述符会指回第一个描述符以构成环形结构。描述符列表位于主机的物理存储空间,两个列表的基址分别写入ETH_DMARDLAR寄存器和ETH_DMATDLAR寄存器中。每个描述符最多可指向两个缓冲区,描述符一共有两种结构:环形结构和链接结构。

4.2、DMA描述符链接结构

在ST提供的以太网驱动库stm32f4x7_eth.c中使用是链接结构,链接结构如下


 描述符注意事项:

 1、一个以太网数据包可以跨越一个或多个DMA描述符     

 2、一个DMA描述符只能用于一个以太网数据包

 3、DMA描述符列表中的最后一个描述符指向第一个,形成链式结构!


描述符不是实际存在的物理结构,而是在程序中通过软件实现的,其实就是一个结构体!在ST的以太网驱动库stm32f4x7_eth.h中有个结构体ETH_DMADESCTypeDef,这个结构体就是DMA描述符!!!

typedef struct  {

  __IO uint32_t   Status;                  //状态

  uint32_t   ControlBufferSize;     //控制和buffer1,buffer2的长度

  uint32_t   Buffer1Addr;           //buffer1地址

  uint32_t   Buffer2NextDescAddr;   //buffer2地址或下一个描述符地址

//一下只有增强的以太网DMA描述符含有

#ifdef USE_ENHANCED_DMA_DESCRIPTORS

  uint32_t   ExtendedStatus;                //增强描述符状态

  uint32_t   Reserved1;                    //保留

  uint32_t   TimeStampLow;                 //时间戳低位

  uint32_t   TimeStampHigh;        //时间戳高位

#endif

} ETH_DMADESCTypeDef;

 

描述符有分为增强描述符和常规描述符,我们只讲常规描述符!因为我们的网络例程只使用到了常规描述符。常规描述符和增强描述符的结构体成员变量不同。常规描述符只使用了描述符的前4个成员变量。

常规描述符和增强描述符又有发送描述符和接收描述符两种,下图是常规Tx DMA描述符:

常规Tx DMA描述符中TDES0的bit20用来表示描述符中的第二个地址是用来保存下一个描述符地址还是第二个缓冲区的地址,这点很重要!

常规Rx DMA描述符如下!


常规Tx DMA描述符和常规Rx DMA描述符的成员变量的意义不同!

常规Rx DMA描述符中RDES1的bit14用来表示描述符中的第二个地址是用来保存一个描述符地址还是第二个缓冲区的地址。

我们说过ST官方以太网库stm32f4x7中使用链接结构的DMA描述符,那么在以太网描述符结构体ETH_DMADESCTypeDef中Buffer1Addr就是缓冲区的地址,Buffer2NextDescAddr就是下一个描述符的地址,如下图。


在stm32f4x7_eth.c中定义了两个DMA描述符数组,一个用于DMA接收,一个用于DMA发送,如下:

__align(4) ETH_DMADESCTypeDef  DMARxDscrTab[ETH_RXBUFNB];

__align(4) ETH_DMADESCTypeDef  DMATxDscrTab[ETH_TXBUFNB];

接收和发送描述的大小通过宏ETH_RXBUFNB和ETH_TXBUFNB来定义,默认都为5。

我们知道以链接结构太网描述符的Buffer1Addr成员用来存放缓冲区地址,那么数据缓冲区在哪里?这个数据缓冲区也是定义为数组的,如下:

__align(4) uint8_tRx_Buff[ETH_RXBUFNB][ETH_RX_BUF_SIZE];

__align(4) uint8_tTx_Buff[ETH_TXBUFNB][ETH_TX_BUF_SIZE];

                                                                                                                                   作者:广东松山电子实验室

展开阅读全文

没有更多推荐了,返回首页