STM32-ETH-Lwip以太网通信

互联网模型

通信至少是两个设备的事,需要相互兼容的硬件和软件支持,我们称之为通信协议。以太网通信在结构比较复杂,国际标准组织将整个以太网通信结构制定了 OSI 模型,总共分层七个层,分别为应用层、表示层、会话层、传输层、网络层、数据链路层以及物理层,每个层功能不同,通信中各司其职,整个模型包括硬件和软件定义。 OSI 模型是理想分层,一般的网络系统只是涉及其中几层。

TCP/IP 是互联网最基本的协议,是互联网通信使用的网络协议,由网络层的 IP 协议和传输层的 TCP 协议组成。 TCP/IP 只有四个分层,分别为应用层、传输层、网络层以及网络访问层。虽然 TCP/IP 分层少了,但与 OSI 模型是不冲突的,它把 OSI 模型一些层次整合一起的,本质上可以实现相同功能。

实际上,还有一个 TCP/IP 混合模型,分为五个层,参考图 42-1,它实际与 TCP/IP 四层模型是相通的,只是把网络访问层拆成数据链路层和物理层。这种分层方法对我们学习理解更容易。

5d30805c7de0d71090

设计网络时,为了降低网络设计的复杂性,对组成网络的硬件、软件进行封装、分层,这些分层即构成了网络体系模型。在两个设备相同层之间的对话、通信约定,构成了层级协议。设备中使用的所有协议加起来统称协议栈。 在这个网络模型中,每一层完成不同的任务,都提供接口供上一层访问。而在每层的内部,可以使用不同的方式来实现接口,因而内部的改变不会影响其它层。

在 TCP/IP 混合参考模型中,数据链路层又被分为 LLC 层(逻辑链路层)和 MAC 层(媒体介质访问层)。目前,对于普通的接入网络终端的设备, LLC 层和 MAC 层是软、硬件的分界线。如 PC 的网卡主要负责实现参考模型中的 MAC 子层和物理层,在 PC 的软件系统中则有一套庞大程序实现了 LLC 层及以上的所有网络层次的协议。

由硬件实现的物理层和 MAC 子层在不同的网络形式有很大的区别,如以太网和 Wi-Fi,这是由物理传输方式决定的。但由软件实现的其它网络层次通常不会有太大区别,在 PC上也许能实现完整的功能, 一般支持所有协议,而在嵌入式领域则按需要进行裁剪。

以太网

以太网(Ethernet)是互联网技术的一种,由于它是在组网技术中占的比例最高,很多人直接把以太网理解为互联网。

以太网是指遵守 IEEE 802.3 标准组成的局域网,由 IEEE 802.3 标准规定的主要是位于参考模型的物理层(PHY)和数据链路层中的介质访问控制子层(MAC)。在家庭、企业和学校所组建的 PC 局域网形式一般也是以太网,其标志是使用水晶头网线来连接(当然还有其它形式)。 IEEE 还有其它局域网标准,如 IEEE 802.11 是无线局域网,俗称 Wi-Fi。 IEEE802.15 是个人域网,即蓝牙技术,其中的 802.15.4 标准则是 ZigBee 技术。

现阶段,工业控制、环境监测、智能家居的嵌入式设备产生了接入互联网的需求,利用以太网技术,嵌入式设备可以非常容易地接入到现有的计算机网络中。

PHY层

在物理层,由IEEE 802.3标准规定了以太网使用的传输介质、传输速度、数据编码方式和冲突检测机制,物理层一般是通过一个 PHY 芯片实现其功能的。

  1. 传输介质

传输介质包括同轴电缆、双绞线(水晶头网线是一种双绞线)、光纤。根据不同的传输速度和距离要求,基于这三类介质的信号线又衍生出很多不同的种类。最常用的是“五类线”适用于 100BASE-T 和 10BASE-T 的网络,它们的网络速率分别为 100Mbps 和 10Mbps。

  1. 编码

为了让接收方在没有外部时钟参考的情况也能确定每一位的起始、结束和中间位置,在传输信号时不直接采用二进制编码。在 10BASE-T 的传输方式中采用曼彻斯特编码,在100BASE-T 中则采用 4B/5B 编码。

曼彻斯特编码把每一个二进制位的周期分为两个间隔,在表示“1”时,以前半个周期为高电平,后半个周期为低电平。表示“0”时则相反,见图 42-2

5d3080728c8e653405

采用曼彻斯特码在每个位周期都有电压变化,便于同步。但这样的编码方式效率太低,只有 50%。

在 100BASE-T 采用的 4B/5B 编码是把待发送数据位流的每 4 位分为一组,以特定的 5位编码来表示,这些特定的 5 位编码能使数据流有足够多的跳变,达到同步的目的,而且效率也从曼彻斯特编码的 50%提高到了 80%。

  1. CSMA/CD 冲突检测

早期的以太网大多是多个节点连接到同一条网络总线上(总线型网络),存在信道竞争问题,因而每个连接到以太网上的节点都必须具备冲突检测功能。以太网具备 CSMA/CD冲突检测机制,如果多个节点同时利用同一条总线发送数据,则会产生冲突,总线上的节点可通过接收到的信号与原始发送的信号的比较检测是否存在冲突,若存在冲突则停止发送数据,随机等待一段时间再重传。

现在大多数局域网组建的时候很少采用总线型网络,大多是一个设备接入到一个独立的路由或交换机接口,组成星型网络,不会产生冲突。但为了兼容,新出的产品还是带有冲突检测机制。

MAC子层

  1. MAC 的功能

MAC 子层是属于数据链路层的下半部分,它主要负责与物理层进行数据交接,如是否可以发送数据,发送的数据是否正确,对数据流进行控制等。它自动对来自上层的数据包加上一些控制信号,交给物理层。接收方得到正常数据时,自动去除 MAC 控制信号,把该数据包交给上层。

  1. MAC 数据包

IEEE 对以太网上传输的数据包格式也进行了统一规定,见图 42-3。该数据包被称为MAC 数据包。

5d30808a45c8c14302

MAC 数据包由前导字段、帧起始定界符、目标地址、源地址、数据包类型、数据域、填充域、校验和域组成。

  • 前导字段,也称报头,这是一段方波,用于使收发节点的时钟同步。内容为连续 7 个字节的 0x55。字段和帧起始定界符在 MAC 收到数据包后会自动过滤掉。
  • 帧起始定界符(SFD): 用于区分前导段与数据段的,内容为 0xD5。
  • MAC 地址: MAC 地址由 48 位数字组成,它是网卡的物理地址,在以太网传输的最底层,就是根据 MAC 地址来收发数据的。部分 MAC 地址用于广播和多播,在同一个网络里不能有两个相同的 MAC 地址。 PC 的网卡在出厂时已经设置好了 MAC 地址,但也可以通过一些软件来进行修改,在嵌入式的以太网控制器中可由程序进行配置。数据包中的 DA 是目标地址, SA 是源地址。
  • 数据包类型: 本区域可以用来描述本 MAC 数据包是属于 TCP/IP 协议层的 IP 包、 ARP包还是 SNMP 包,也可以用来描述本 MAC 数据包数据段的长度。 如果该值被设置大于 0x0600,不用于长度描述,而是用于类型描述功能,表示与以太网帧相关的 MAC客户端协议的种类。
  • 数据段: 数据段是 MAC 包的核心内容,它包含的数据来自 MAC 的上层。其长度可以从 0~1500 字节间变化。
  • 填充域:由于协议要求整个 MAC 数据包的长度至少为 64 字节(接收到的数据包如果少于 64 字节会被认为发生冲突,数据包被自动丢弃),当数据段的字节少于 46 字节时,在填充域会自动填上无效数据,以使数据包符合长度要求。
  • 校验和域: MAC 数据包的尾部是校验和域,它保存了 CRC 校验序列,用于检错。

以上是标准的 MAC 数据包, IEEE 802.3 同时还规定了扩展的 MAC 数据包,它是在标准的 MAC 数据包的 SA 和数据包类型之间添加 4 个字节的 QTag 前缀字段,用于获取标志的 MAC 帧。前 2 个字节固定为 0x8100,用于识别 QTag 前缀的存在;后两个字节内容分别为 3 个位的用户优先级、 1 个位的标准格式指示符(CFI)和一个 12 位的 VLAN 标识符。

TCP/IP协议栈

标准 TCP/IP 协议是用于计算机通信的一组协议,通常称为 TCP/IP 协议栈,通俗讲就是符合以太网通信要求的代码集合,一般要求它可以实现图 42-1 中每个层对应的协议,比如应用层的 HTTP、 FTP、 DNS、 SMTP 协议,传输层的 TCP、 UDP 协议、网络层的 IP、ICMP 协议等等。关于 TCP/IP 协议详细内容推荐阅读《TCP-IP 详解》和《用 TCP/IP 进行网际互连》理解。

Windows 操作系统、 UNIX 类操作系统都有自己的一套方法来实现 TCP/IP 通信协议,它们都提供非常完整的 TCP/IP 协议。对于一般的嵌入式设备,受制于硬件条件没办法支持使用在 Window 或 UNIX 类操作系统的运行的 TCP/IP 协议栈,一般只能使用简化版本的TCP/IP 协议栈,目前开源的适合嵌入式的有 uIP、 TinyTCP、 uC/TCP-IP、 LwIP 等等。其中LwIP 是目前在嵌入式网络领域被讨论和使用广泛的协议栈。本章内容其中一个目的就是移植 LwIP 到开发板上运行。

为什么需要协议栈

物理层主要定义物理介质性质, MAC 子层负责与物理层进行数据交接,这两部分是与硬件紧密联系的,就嵌入式控制芯片来说,很多都内部集成了 MAC 控制器,完成 MAC 子层功能,所以依靠这部分功能是可以实现两个设备数据交换,而实际传输的数据就是 MAC数据包,发送端封装好数据包,接收端则解封数据包得到可用数据,这样的一个模型与使用 USART 控制器实现数据传输是非常类似的。但如果将以太网运用在如此基础的功能上,完全是大材小用,因为以太网具有传输速度快、可传输距离远、支持星型拓扑设备连接等等强大功能。功能强大的东西一般都会用高级的应用,这也是设计者的初衷。

使用以太网接口的目的就是为了方便与其它设备互联,如果所有设备都约定使用一种互联方式,在软件上加一些层次来封装,这样不同系统、不同的设备通讯就变得相对容易了。而且只要新加入的设备也使用同一种方式,就可以直接与之前存在于网络上的其它设备通讯。这就是为什么产生了在 MAC 之上的其它层次的网络协议及为什么要使用协议栈的原因。又由于在各种协议栈中 TCP/IP 协议栈得到了最广泛使用, 所有接入互联网的设备都遵守 TCP/IP 协议。 所以,想方便地与其它设备互联通信,需要提供对 TCP/IP 协议的支持。

各网络层的功能

用以太网和 Wi-Fi 作例子,它们的 MAC 子层和物理层有较大的区别,但在 MAC 之上的 LLC 层、网络层、传输层和应用层的协议,是基本上同的,这几层协议由软件实现,并对各层进行封装。根据 TCP/IP 协议,各层的要实现的功能如下:

LLC 层: 处理传输错误;调节数据流,协调收发数据双方速度,防止发送方发送得太快而接收方丢失数据。主要使用数据链路协议。

网络层: 本层也被称为 IP 层。 LLC 层负责把数据从线的一端传输到另一端,但很多时候不同的设备位于不同的网络中(并不是简单的网线的两头)。此时就需要网络层来解决子网路由拓扑问题、路径选择问题。在这一层主要有 IP 协议、 ICMP 协议。

传输层: 由网络层处理好了网络传输的路径问题后,端到端的路径就建立起来了。传输层就负责处理端到端的通讯。在这一层中主要有 TCP、 UDP 协议

应用层: 经过前面三层的处理,通讯完全建立。应用层可以通过调用传输层的接口来编写特定的应用程序。而 TCP/IP 协议一般也会包含一些简单的应用程序如 Telnet 远程登录、FTP 文件传输、 SMTP 邮件传输协议。

实际上,在发送数据时,经过网络协议栈的每一层,都会给来自上层的数据添加上一个数据包的头,再传递给下一层。在接收方收到数据时,一层层地把所在层的数据包的头去掉,向上层递交数据,参考图 42-4。

5d30809f58a7b56884

以太网外设(ETH)

STM32F42x 系列控制器内部集成了一个以太网外设,它实际是一个通过 DMA 控制器进行介质访问控制(MAC),它的功能就是实现 MAC 层的任务。借助以太网外设,STM32F42x 控制器可以通过 ETH 外设按照 IEEE 802.3-2002 标准发送和接收 MAC 数据包。ETH 内部自带专用的 DMA 控制器用于 MAC, ETH 支持两个工业标准接口介质独立接口(MII)和简化介质独立接口(RMII),用于与外部 PHY 芯片连接。 MII 和 RMII 接口用于 MAC数据包传输, ETH 还集成了站管理接口(SMI)接口专门用于与外部 PHY 通信,用于访问PHY 芯片寄存器。

物理层定义了以太网使用的传输介质、传输速度、数据编码方式和冲突检测机制,PHY 芯片是物理层功能实现的实体,生活中常用水晶头网线+水晶头插座+PHY 组合构成了物理层。

ETH 有专用的 DMA 控制器,它通过 AHB 主从接口与内核和存储器相连, AHB 主接口用于控制数据传输,而 AHB 从接口用于访问“控制与状态寄存器” (CSR)空间。在进行数据发送是,先将数据有存储器以 DMA 传输到发送 TX FIFO 进行缓冲,然后由 MAC 内核发送;接收数据时, RX FIFO 先接收以太网数据帧,再由 DMA 传输至存储器。 ETH 系统功能框图见图 42-5。
1655873-20190718222750983-108778775.png

SMI接口

SMI 是 MAC 内核访问 PHY 寄存器标志接口,它由两根线组成,数据线 MDIO 和时钟线 MDC。 SMI 支持访问 32 个 PHY,这在设备需要多个网口时非常有用,不过一般设备都只使用一个 PHY。 PHY 芯片内部一般都有 32 个 16 位的寄存器,用于配置 PHY 芯片属性、工作环境、状态指示等等,当然很多 PHY 芯片并没有使用到所有寄存器位。 MAC 内核就是通过 SMI 向 PHY 的寄存器写入数据或从 PHY 寄存器读取 PHY 状态,一次只能对一个PHY 的其中一个寄存器进行访问。 SMI 最大通信频率为 2.5MHz,通过控制以太网 MACMII 地址寄存器 (ETH_MACMIIAR)的 CR 位可选择时钟频率。

  1. SMI帧格式

SMI 是通过数据帧方式与 PHY 通信的,帧格式如表 42-1,数据位传输顺序从左到右。

1655873-20190718222807499-66962337.png

PADDR 用于指定 PHY 地址,每个 PHY 都有一个地址,一般由 PHY 硬件设计决定,所以是固定不变的。 RADDR 用于指定 PHY 寄存器地址。 TA 为状态转换域, 若为读操作,MAC 输出两个位高阻态,而 PHY 芯片则在第一位时输出高阻态,第二位时输出“0”。若为写操作, MAC 输出“10”, PHY 芯片则输出高阻态。 数据段有 16 位,对应 PHY 寄存器每个位,先发送或接收到的位对应以太网 MAC MII 数据寄存器(ETH_MACMIIDR)寄存器的位 15。

  1. SMI读写操作

当以太网 MAC MII 地址寄存器 (ETH_MACMIIAR)的写入位和繁忙位被置 1 时, SMI将向指定的 PHY 芯片指定寄存器写入 ETH_MACMIIDR 中的数据。写操作时序见图 42-6。

1655873-20190718222846236-1727703981.png

当以太网 MAC MII 地址寄存器 (ETH_MACMIIAR)的写入位为 0 并且繁忙位被置 1 时,SMI 将从向指定的 PHY 芯片指定寄存器读取数据到 ETH_MACMIIDR 内。读操作时序见图42-7。

1655873-20190718222859422-2107453925.png

MII和RMII接口

介质独立接口(MII)用于连接 MAC 控制器和 PHY 芯片,提供数据传输路径。 RMII 接口是 MII 接口的简化版本, MII 需要 16 根通信线, RMII 只需 7 根通信,在功能上是相同的。 图 42-8 为 MII 接口连接示意图, 图 42-9 为 RMII 接口连接示意图。

1655873-20190718222923222-928363146.png

 TX_CLK:数据发送时钟线。标称速率为 10Mbit/s 时为 2.5MHz;速率为 100Mbit/s 时

为 25MHz。 RMII 接口没有该线。

 RX_CLK:数据接收时钟线。标称速率为 10Mbit/s 时为 2.5MHz;速率为 100Mbit/s 时

为 25MHz。 RMII 接口没有该线。

 TX_EN:数据发送使能。在整个数据发送过程保存有效电平。

 TXD[3:0]或 TXD[1:0]:数据发送数据线。对于 MII 有 4 位, RMII 只有 2 位。只有在TX_EN 处于有效电平数据线才有效。

 CRS:载波侦听信号,由 PHY 芯片负责驱动,当发送或接收介质处于非空闲状态时使能该信号。在全双工模式该信号线无效。

 COL:冲突检测信号,由 PHY 芯片负责驱动,检测到介质上存在冲突后该线被使能,并且保持至冲突解除。在全双工模式该信号线无效。

 RXD[3:0]或 RXD[1:0]:数据接收数据线,由 PHY 芯片负责驱动。对于 MII 有 4 位,RMII 只有 2 位。在 MII 模式,当 RX_DV 禁止、 RX_ER 使能时,特定的 RXD[3:0]值用于传输来自 PHY 的特定信息。

 RX_DV:接收数据有效信号,功能类似 TX_EN,只不过用于数据接收,由 PHY 芯片负责驱动。对于 RMII 接口,是把 CRS 和 RX_DV 整合成 CRS_DV 信号线,当介质处于不同状态时会自切换该信号状态。

 RX_ER:接收错误信号线,由 PHY 驱动,向 MAC 控制器报告在帧某处检测到错误。

 REF_CLK:仅用于 RMII 接口,由外部时钟源提供 50MHz 参考时钟。

因为要达到 100Mbit/s 传输速度, MII 和 RMII 数据线数量不同,使用 MII 和 RMII 在时钟线的设计是完全不同的。对于 MII 接口,一般是外部为 PHY 提供 25MHz 时钟源,再由 PHY 提供 TX_CLK 和 RX_CLK 时钟。对于 RMII 接口,一般需要外部直接提供 50MHz时钟源,同时接入 MAC 和 PHY。

开发板板载的 PHY 芯片型号为 LAN8720A,该芯片只支持 RMII 接口,电路设计时参考图 42-9。

ETH 相关硬件在 STM32F42x 控制器分布参考表 42-2。

1655873-20190718222954438-1303606638.png

其中, PPS_OUT 是 IEEE 1588 定义的一个时钟同步机制。

MAC数据包发送和接受

ETH 外设负责 MAC 数据包发送和接收。利用 DMA 从系统寄存器得到数据包数据内容, ETH 外设自动填充完成 MAC 数据包封装,然后通过 PHY 发送出去。在检测到有MAC 数据包需要接收时, ETH 外设控制数据接收,并解封 MAC 数据包得到解封后数据通过 DMA 传输到系统寄存器内。

  1. MAC 数据包发送

MAC 数据帧发送全部由 DMA 控制,从系统存储器读取的以太网帧由 DMA 推入 FIFO,然后将帧弹出并传输到 MAC 内核。帧传输结束后,从 MAC 内核获取发送状态并传回DMA。在检测到 SOF(Start Of Frame)时, MAC 接收数据并开始 MII 发送。在 EOF(End Of Frame)传输到 MAC 内核后,内核将完成正常的发送,然后将发送状态返回给 DMA。如果在发送过程中发送常规冲突, MAC 内核将使发送状态有效, 然后接受并丢弃所有后续数据,直至收到下一 SOF。检测到来自 MAC 的重试请求时,应从 SOF 重新发送同一帧。如果发送期间未连续提供数据, MAC 将发出下溢状态。在帧的正常传输期间,如果 MAC 在未获得前一帧的 EOF 的情况下接收到 SOF,则将忽略该 SOF 并将新的帧视为前一帧的延续。MAC 控制 MAC 数据包的发送操作,它会自动生成前导字段和 SFD 以及发送帧状态返回给 DMA,在半双工模式下自动生成阻塞信号,控制 jabber(MAC 看门狗)定时器用于在传输字节超过 2048 字节时切断数据包发送。 在半双工模式下, MAC 使用延迟机制进行流量控制,程序通过将 ETH_MACFCR 寄存器的 BPA 位置 1 来请求流量控制。 MAC 包含符合

IEEE 1588 的时间戳快照逻辑。 MAC 数据包发送时序参考图 42-10。

1655873-20190718223024797-1162715383.png

  1. MAC 数据包接收

MAC 接收到的数据包填充 RX FIFO,达到 FIFO 设定阈值后请求 DMA 传输。在默认直通模式下,当 FIFO 接收到 64 个字节(使用 ETH_DMAOMR 寄存器中的 RTC 位配置)或完整的数据包时,数据将弹出,其可用性将通知给 DMA。 DMA 向 AHB 接口发起传输后,数据传输将从 FIFO 持续进行,直到传输完整个数据包。完成 EOF 帧的传输后,状态字将弹出并发送到 DMA 控制器。在 Rx FIFO 存储转发模式(通过 ETH_DMAOMR 寄存器中的RSF 位配置)下,仅在帧完全写入 Rx FIFO 后才可读出帧。

当 MAC 在 MII 上检测到 SFD 时,将启动接收操作。 MAC 内核将去除报头和 SFD,然后再继续处理帧。检查报头字段以进行过滤, FCS 字段用于验证帧的 CRC 如果帧未通过地址滤波器,则在内核中丢弃该帧。 MAC 数据包接收时序参考图 42-11。

1655873-20190718223103994-1954402363.png

MAC过滤

MAC 过滤功能可以选择性的过滤设定目标地址或源地址的 MAC 帧。它将检查所有接收到的数据帧的目标地址和源地址,根据过滤选择设定情况,检测后报告过滤状态。针对目标地址过滤可以有三种,分别是单播、多播和广播目标地址过滤;针对源地址过滤就只有单播源地址过滤。

单播目标地址过滤是将接收的相应 DA 字段与预设的以太网 MAC 地址寄存器内容比较,最高可预设 4 个过滤 MAC 地址。多播目标地址过滤是根据帧过滤寄存器中的 HM 位执行对多播地址的过滤,是对 MAC 地址寄存器进行比较来实现的。单播和多播目标地址过滤都还支持 Hash 过滤模式。广播目标地址过滤通过将帧过滤寄存器的 BFD 位置 1 使能,这使得 MAC 丢弃所有广播帧。

单播源地址过滤是将接收的 SA 字段与 SA 寄存器内容进行比较过滤。

MAC 过滤还具备反向过滤操作功能,即让过滤结构求补集。

PHY:LAN8720

LAN8720A 是 SMSC 公司(已被 Microchip 公司收购)设计的一个体积小、功耗低、全能型 10/100Mbps 的以太网物理层收发器。它是针对消费类电子和企业应用而设计的。LAN8720A 总共只有 24Pin,仅支持 RMII 接口。由它组成的网络结构见图 42-12。

1655873-20190718223135481-1123492552.png

LAN8720A 通过 RMII 与 MAC 连接。 RJ45 是网络插座,在与 LAN8720A 连接之间还需要一个变压器,所以一般使用带电压转换和 LED 指示灯的 HY911105A 型号的插座。一般来说,必须为使用 RMII 接口的 PHY 提供 50MHz 的时钟源输入到 REF_CLK 引脚,不过LAN8720A 内部集成 PLL,可以将 25MHz 的时钟源陪频到 50MHz 并在指定引脚输出该时钟,所以我们可以直接使其与 REF_CLK 连接达到提供 50MHz 时钟的效果。

LAN8720A 内部系统结构见图 42-13。

1655873-20190718223201150-2135335171.png

LAN8720A 有各个不同功能模块组成,最重要的要数接收控制器和发送控制器,其它的基本上都是与外部引脚挂钩,实现信号传输。部分引脚是具有双重功能的,比如PHYAD0 与 RXER 引脚是共用的,在系统上电后 LAN8720A 会马上读取这部分共用引脚的电平,以确定系统的状态并保存在相关寄存器内,之后则自动转入作为另一功能引脚。

PHYAD[0]引脚用于配置 SMI 通信的 LAN8720A 地址,在芯片内部该引脚已经自带下拉电阻,默认认为 0(即使外部悬空不接),在系统上电时会检测该引脚获取得到 LAN8720A的地址为 0 或者 1,并保存在特殊模式寄存器(R18)的 PHYAD 位中,该寄存器的 PHYAD有 5 个位,在需要超过 2 个 LAN8720A 时可以通过软件设置不同 SMI 通信地址。PHYAD[0]是与 RXER 引脚共用。

MODE[2:0]引脚用于选择 LAN8720A 网络通信速率和工作模式,可选 10Mbps 或100Mbps 通信速度,半双工或全双工工作模式,另外 LAN8720A 支持 HP Auto-MDIX 自动翻转功能,即可自动识别直连或交叉网线并自适应。一般将 MODE 引脚都设置为 1,可以让 LAN8720A 启动自适应功能,它会自动寻找最优工作方式。 MODE[0]与 RXD0 引脚共用、MODE[1]与 RXD1 引脚共用、 MODE[2]与 CRS_DV 引脚共用。

nINT/REFCLKO 引脚用于 RMII 接口中 REF_CLK 信号线,当 nINTSEL 引脚为低电平时,它也可以被设置成 50MHz 时钟输出,这样可以直接与 STM32F42x 的 REF_CLK 引脚连接为其提供 50MHz 时钟源,这种模式要求为 XTAL1 与 XTAL2 之间或为 XTAL1/CLKIN提供 25MHz 时钟,由 LAN8720A 内部 PLL 电路陪频得到 50MHz 时钟,此时nIN/REFCLKO 引脚的中断功能不可用,用于 50MHz 时钟输出。当 nINTSEL 引脚为高电平时, LAN8720A 被设置为时钟输入,即外部时钟源直接提供 50MHz 时钟接入 STM32F42x的 REF_CLK 引脚和 LAN8720A 的 XTAL1/CLKIN 引脚,此时 nINT/REFCLKO 可用于中断功能。 nINTSEL 与 LED2 引脚共用,一般使用下拉

REGOFF 引脚用于配置内部+1.2V 电压源, LAN8720A 内部需要+1.2V 电压,可以通过VDDCR 引脚输入+1.2V 电压提供,也可以直接利用 LAN8720A 内部+1.2V 稳压器提供。当REGOFF 引脚为低电平时选择内部+1.2V 稳压器。 REGOFF 与 LED1 引脚共用。

SMI 支持寻址 32 个寄存器, LAN8720A 只用到其中 14 个,参考表 42-3。

1655873-20190718223225774-565074721.png

序号与 SMI 数据帧中的 RADDR 是对应的,这在编写驱动时非常重要,本文将它们标记为 R0~R31。寄存器可规划为三个组: Basic、 Extended 和 Vendor-specific。 Basic 是 IEEE802.3 要求的, R0 是基本控制寄存器,其位 15 为 Soft Reset 位,向该位写 1 启动LAN8720A 软件复位,还包括速度、自适应、低功耗等等功能设置。 R1 是基本状态

寄存器。Extended 是扩展寄存器,包括 LAN8720A 的 ID 号、制造商、版本号等等信息。 Vendorspecific 是供应商自定义寄存器, R31 是特殊控制/状态寄存器,指示速度类型和自适应功能。

LwIP:轻型TCP/IP协议栈

LwIP 是 Light Weight Internet Protocol 的缩写,是由瑞士计算机科学院 Adam Dunkels等开发的适用于嵌入式领域的开源轻量级 TCP/IP 协议栈。它可以移植到含有操作系统的平台中,也可以在无操作系统的平台下运行。由于它开源、占用的 RAM 和 ROM 比较少、支持较为完整的 TCP/IP 协议、且十分便于裁剪、调试,被广泛应用在中低端的 32 位控制器平台。可以访问网站: http://savannah.nongnu.org/projects/lwip/ 获取更多 LwIP 信息。

目前, LwIP 最新更新到 1.4.1 版本,我们在上述网站可找到相应的 LwIP 源码下载通道。我们下载两个压缩包: lwip-1.4.1.zip 和 contrib-1.4.1.zip, lwip-1.4.1.zip 包括了 LwIP 的实现代码, contrib-1.4.1.zip 包含了不同平台移植 LwIP 的驱动代码和使用 LwIP 实现的一些应用实例测试。

以太网通信实验:无操作系统Lwip移植

参考引用:

  1. 野火---《零死角玩转STM32-F429挑战者》
  2. 《STM32F4xx中文参考手册》
  3. 《Cortex-M4内核编程手册》

转载于:https://www.cnblogs.com/luoxiao23/p/11210494.html

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值