1.前言
移植需要做的准备工作,下载相关的资料:《基于STM32移植LWIP的资料准备》。
移植过程是基于硬件平台STM32F429,在移植了STM32标准库的基础上面进行移植。
在移植之前需要对我们的硬件及其接口有一些了解。
2.硬件原理图介绍
网卡硬件连接原理图如下:
1:MCU:STM32F429
2:网卡:LAN8720A
备注:硬件网卡LAN8720A是RMII接口与MCU连接的。
- MII即“媒体独立接口”,也叫“独立于介质的接口”。它是IEEE-802.3定义的以太网行业标准。它包括一个数据接口,以及一个MAC和PHY之间的管理接口。
- RMII全称为“简化的媒体独立接口”,是IEEE-802.3u标准的以太网接口之一,比MII有更少的I/O传输.(此处内容来源于网络)
3.SMI(MDC/MDIO)总线接口介绍
3.1 MDIO接口
SMI:串行管理接口(Serial Management Interface),也被称作MII管理接口(MII Management Interface),包括MDC和MDIO两条信号线。MDIO是一个PHY的管理接口,用来读/写PHY的寄存器,以控制PHY的行为或获取PHY的状态,MDC为MDIO提供时钟。
MDIO原本是为MII总线接口定义的,MII用于连接MAC和PHY,包含两种信号接口:
1: 一个数据接口用于MAC和PHY之间接收和发送以太网帧数据。
2: 一个PHY管理接口,即MDIO,用于读写每个PHY的控制寄存器和状态寄存器,以达到控制PHY行为和监控PHY状态的目的。
MDIO是双向的,只支持一个MAC连接最多32个PHY的连接方式,且MAC作为master
,PHY作为slave
。在写PHY寄存器的时候,由MAC驱动MDIO向PHY写入数据;在读PHY寄存器时,前半段由MAC驱动发送寄存器地址,后半段由PHY驱动回复寄存器的值。
MDC要求由MAC输出,是非周期性的,即不要求提供固定频率的时钟,对于PHY芯片则作为输入,以在上升沿触发MDIO的读写。MDC的时钟频率可以是DC-2.5MHz,即最小的时钟周期为400ns。
3.2 MDIO数据传输协议
MDIO数据格式定义在IEEE 802.3以太网标准中,如下图所示(数据传输顺序为从左至右):
Preamble (32bits) | Start (2bits) | OP Code (2bits) | PHYAD (5bits) | REGAD (5bits) | Turn Around (2bits) | Data (16bits) | Idle | |
---|---|---|---|---|---|---|---|---|
Read | 1…1 | 01 | 10 | A4A3A2A1A0 | R4R3R2R1R0 | Z0 | D15…D0 | Z* |
Write | 1…1 | 01 | 01 | A4A3A2A1A0 | R4R3R2R1R0 | 10 | D15…D0 | Z* |
上图中*表示高阻态,这时MDIO的状态由一个外部的1.5KΩ电阻决定。
Preamble+Start:32bits的前导码以及2bit的开始位。
OP Code:2bits的操作码,10表示读,01表示写。
PHYAD:5bits的PHY地址,一般PHY地址从0开始顺序编号,例如6口switch中PHY地址为0-5。
REGAD:5bits的寄存器地址,即要读或写的寄存器。
Turn Around:2bits的TA,在读命令中,MDIO在此时由MAC驱动改为PHY驱动,并等待一个时钟周期准备发送数据。在写命令中,不需要MDIO方向发生变化,则只是等待两个时钟周期准备写入数据。
Data:16bits数据,在读命令中,PHY芯片将读到的对应PHYAD的REGAD寄存器的数据写到Data中,在写命令中,MAC将要写入对应PHYAD的REGAD寄存器的值写入Data中。
Idle:空闲状态,此时MDIO无源驱动,处高阻状态,但一般用上拉电阻使其处在高电平。
需要注意的是,为了保证PHY能准确采样,当MAC向MDIO写数据的时候,需要在MDC的上升沿之前就把数据写到MDIO上,要求等待10ns以上再发出一个MDC的上升沿。而为了保证MAC能准确采样,当PHY向MDIO写数据时,这个clock-to-data的delay时间范围可以是0-300ns(小于上面提到的400ns)。这个规定使接口的实现变得简单,但一定程度上限制了总线带宽。
IEEE 802.3还定义了扩展的SMI数据格式,包括read,write以及set address和read increment,不过我们在此不做讨论。
4.LAN8720A简介
-
从datasheet中可以了解到
LAN8720A
仅支持RMII接口的10Mbps、100Mbps。 -
PHYAD[0]: PHY地址配置(参考:Datasheet 3.7.1)
将PHYAD0位驱动为高电平或低电平,以为每个PHY提供唯一的地址。在硬件复位结束时(默认= 0b),该地址被锁存到内部寄存器中。在多PHY应用程序(例如转发器)中,控制器能够通过唯一地址管理每个PHY。每个PHY检查每个管理数据帧中相关位中的匹配地址。 识别到匹配后,PHY会响应该特定帧。 PHY地址还用于为加扰器提供种子。 在多PHY应用中,这可确保加扰器不同步,并在整个频谱上分散电磁辐射。设备的SMI地址可以通过硬件配置为0或1。如果有需要地址大于1,则用户可以使用软件配置PHY地址。 通过特殊模式寄存器的
PHYAD
位写入PHY地址(在某个地址建立SMI通信之后)。 PHYAD0硬件配置与RXER引脚复用。备注:根据前面的硬件原理图,
PHYAD0
引脚是未连接,所以默认PHY地址为0
。(在后续编程中会使用到该地址) -
REF_CLK的配置(参考:Datasheet 3.7.4 )
通过nINTSEL来配置两个模式:REF_CLK输入模式(nINT)和REF_CLK输出模式。 配置模式决定了nINT / REFCLKO引脚的功能。 nINTSEL配置锁定在POR(Power-On Reset)和nRST(pin reset)的上升沿。 默认情况下,通过内部上拉电阻将nINTSEL配置为nINT模式。RMII REF_CLK是连续时钟,可为CRS_DV,RXD [1:0],TXEN,TXD [1:0]和RXER提供时序参考。
- 配置REF_CLK输入模式,XTAL1 / CLKIN引脚驱动50MHz REF_CLK。 这是使用RMII时的传统系统配置,请参见第3.7.4.1节。
- 配置REF_CLK输出模式,设备产生50MHz RMII REF_CLK,此时nINT中断功能不可用(该引脚复用2个功能)。 REF_CLK输出模式允许将低成本25MHz晶振用作REF_CLK的参考。这种配置可以降低系统成本,请参见第3.7.4.2节。
备注: 根据前面的硬件原理图,
nINTSEL
引脚被10K电阻下拉到GND,所以REF_CLK
为输出模式。 -
LED的配置
提供两个LED信号作为指示收发器工作的状态:- LED1:每当设备检测到有效链接时,LED1输出就被驱动为激活状态,而当CRS处于活动状态(高电平)指示活动时,LED1输出将闪烁。
- LED2:当工作速度为100Mbps时,LED2输出被驱动为激活状态。 当工作速度为10Mbps或线路隔离时,此LED指示灯将不活动。
备注:根据前面的硬件原理图,
LED1
和LED2
都是高电平驱动。LED的2个引脚都有2个功能复用引脚:
1: REGOFF = 0,将会使能内部+1.2V调节器。
2: nINTSEL = 0,将会设置REF_CLK为输出模式。 -
在驱动移植过程中我们比较关注的Registers Map,后面移植会使用到它,如下:
IEEE802.3标准第22条要求的寄存器0到6,以及规范允许的“供应商专用”寄存器16到31。 不支持的寄存器(例如7到15)将被读取为十六进制“ FFFF”。
备注:后面编程主要用到上面的3个寄存器:
0: Basic Control Register
1: Basic Status Register
31: PHY Special Control/Status Register