《嵌入式 - Lwip开发指南》第2章 LWIP开发环境简介

Posted Bruceoxl

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了《嵌入式 - Lwip开发指南》第2章 LWIP开发环境简介相关的知识,希望对你有一定的参考价值。

开发环境:
Keil:V5.30
开发板:STM32 Nucleo-F746ZG开发板
LWIP:V2.1.2
PHY芯片:LAN8742A

在LWIP 教程中 PHY 层使用的是LAN8742A芯片,相当于物理层, STM32F746自带的 MAC 层相当于数据链路层,而 LWIP 提供的就是网络层、传输层的功能,应用层是需要用户自己根据应用需求去实现的。

本文将介绍整个网络开发环境所需的环境与资源。

2.1开发板简介

NUCLEO-F746ZG开发板的处理器是STM32F746ZGT6U,基于ARM 32位Cortex®-M7内核,带FPU DSP指令、MPU、ST ART加速器、L1缓存、零等待周期执行、最高主频216MHz、性能高达462 DMIPS/2.14 DMIPS/MHz (Dhrystone 2.1)。

1.1 M Flash,320 k SRAM,最高32位数据总线的FMC可用于扩展SRAM, PSRAM, SDRAM/LPSDR SDRAM, NOR/NAND等。
2.支持Quad-SPI
3.8080/6800并行LCD接口,LCD-TFT控制器,最高支持XGA分辨率,带图形加速器
4.1.7 V to 3.6 V灵活电源选择,Sleep, Stop , Standby三种低功耗模式和RTC事实时钟
5.3个12位ADC ,2个12位DAC
6.18个定时器,其中包括一个低功耗定时器和2个32位定时器
7.25个通信接口,包括USART,I2C,SPI,CAN,HDMI-CEC等
8.USB2.0接口,网络接口,摄像头接口
9.随机数发生器,CRC校验




2.2 STM32 的 ETH 外设

Nucleo-F746ZG控制器内部集成了一个以太网外设,它实际是一个通过 DMA 控制器进行介质访问控制 (MAC),它的功能就是实现 MAC 层的任务。

以太网提供了可配置、灵活的外设,用以满足客户的各种应用需求。它支持与外部物理层(PHY) 相连的两个工业标准接口:默认情况下使用的介质独立接口 (MII)(在 IEEE 802.3 规范中定义)和简化介质独立接口 (RMII)。它有多种应用领域,例如交换机、网络接口卡等。Nucleo-F746ZG借助以太网外设,STM32F746 控制器可以通过 ETH 外设按照 IEEE 802.3-2002 标准发送和接收 MAC 数据包。遵循IEEE 1588-2008 标准,用于规定联网时钟同步的精度。

ETH 内部自带专用的 DMA 控制器用于 MAC, ETH 支持两个工业标准接口介质独立接口 (MII)和简化介质独立接口 (RMII) 用于与外部 PHY 芯片连接。 MII 和 RMII 接口用于 MAC 数据包传输, ETH 还集成了站管理接口 (SMI) 接口专门用于与外部 PHY 通信,用于访问 PHY 芯片寄存器。

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

【注】当使用以太网时, AHB 时钟频率必须至少为 25 MHz。

2.2.1站管理接口:SMI

站管理接口 (SMI) 允许应用程序通过 2 线时钟和数据线访问任意 PHY 寄存器。该接口支持访问多达 32 个 PHY。

应用程序可以从 32 个 PHY 中选择一个 PHY,然后从任意 PHY 包含的 32 个寄存器中选择一个寄存器,发送控制数据或接收状态信息。任意给定时间内只能对一个 PHY 中的一个寄存器进行寻址。
MDC 时钟线和 MDIO 数据线在微控制器中均用作复用功能 I/O:

  • MDC:周期性时钟,提供以最大频率 2.5 MHz 传输数据时的参考时序。 MDC 的最短高电平时间和最短低电平时间必须均为 160 ns。 MDC 的最小周期必须为 400 ns。在空闲状态下, SMI 管理接口将 MDC 时钟信号驱动为低电平。

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

SMI 帧格式

下表中给出了与读操作或写操作有关的帧结构,位传输顺序必须从左到右。

管理帧包括八个字段:

  • 报头:每个事务(读取或写入)均可通过报头字段启动,报头字段对应于 MDIO 线上 32个连续的逻辑“1”位以及 MDC 上的 32 个周期。该字段用于与 PHY 设备建立同步。
  • 起始:帧起始由 < 01> 模式定义,用于验证线路从默认逻辑“ 1”状态变为逻辑“ 0”状态,然后再从逻辑“0”状态变为逻辑“1”状态。
  • 操作:定义正在发生的事务(读取或写入)的类型。
  • PADDR: PHY 地址有 5 位,可构成 32 个唯一 PHY 地址。最先发送和接收地址的MSB 位。
  • PADDR:寄存器地址有 5 位,从而可在所选 PHY 设备中对 32 个不同的寄存器进行寻址。最先发送和接收地址的 MSB 位。
  • TA:周转字段在 RADDR 和 DATA 字段间定义了一个 2 位模式,以避免在读取事务期间出现竞争现象。读取事务时, MAC 控制器将 TA 的 2 个位驱动为 MDIO 线上的高阻态。 PHY 设备必须将 TA 的第一位驱动为高阻态,将 TA 的第二位驱动为“0”。写入事务时, MAC 控制器针对 TA 字段驱动 <10> 模式。 PHY 设备必须将 TA 的 2 个位驱动为高阻态。
  • 数据:数据字段为 16 位。最先发送和接收的位必须为 ETH_MIID 寄存器的位 15。
  • 空闲: MDIO 线驱动为高阻态。三态驱动器必须禁止, PHY 的上拉电阻使线路保持逻辑“1”状态。

SMI 写操作
当应用程序将 MII 写入位和繁忙位(在以太网 MAC MII 地址寄存器 (ETH_MACMIIAR) 中)置 1 时, SMI 将通过传输 PHY 地址、 PHY 中的寄存器地址以及写入数据(在以太网 MACMII 数据寄存器 (ETH_MACMIIDR) 中)来触发对 PHY 寄存器进行写操作。事务进行期间,应用程序不应更改 MII 地址寄存器的内容或 MII 数据寄存器。在此期间对 MII 地址寄存器或MII 数据寄存器执行的写操作将会忽略(繁忙位处于高电平状态),事务将无错完成。写操作完成后, SMI 将通过复位繁忙位进行指示。

下图显示了写操作的帧格式。

SMI 时钟选择

MAC 启动管理写/读操作。 SMI 时钟是一个分频时钟,其时钟源为应用时钟( AHB 时钟)。分频系数取决于 MII 地址寄存器中设置的时钟范围。下表显示了如何设置时钟范围。

2.2.2介质独立接口: MII

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

  • MII_TX_CLK:连续时钟信号。该信号提供进行 TX 数据传输时的参考时序。标称频率为:速率为 10 Mb/s 时为 2.5 MHz;速率为 100 Mb/s 时为 25 MHz。
  • MII_RX_CLK:连续时钟信号。该信号提供进行 RX 数据传输时的参考时序。标称频率为:速率为 10 Mb/s 时为 2.5 MHz;速率为 100 Mb/s 时为 25 MHz。
  • MII_TX_EN:发送使能信号。该信号表示 MAC 当前正针对 MII 发送半字节。该信号必须与报头的前半字节进行同步 (MII_TX_CLK),并在所有待发送的半字节均发送到 MII时必须保持同步。
  • MII_TXD[3:0]:数据发送信号。该信号是 4 个一组的数据信号,由 MAC 子层同步驱动,在MII_TX_EN 信号有效时才为有效信号(有效数据)。 MII_TXD[0] 为最低有效位,MII_TXD[3] 为最高有效位。禁止 MII_TX_EN 时,发送数据不会对 PHY 产生任何影响。
  • MII_CRS:载波侦听信号。当发送或接收介质处于非空闲状态时,由 PHY 使能该信号。发送和接收介质均处于空闲状态时,由 PHY 禁止该信号。 PHY 必须确保 MII_CS 信号在冲突条件下保持有效状态。该信号无需与 TX 和 RX 时钟保持同步。在全双工模式下,该信号没意义。
  • MII_COL:冲突检测信号。检测到介质上存在冲突后, PHY 必须立即使能冲突检测信号,并且只要存在冲突条件,冲突检测信号必须保持有效状态。该信号无需与 TX 和 RX 时钟保持同步。在全双工模式下,该信号没意义。
  • MII_RXD[3:0]:数据接收信号。该信号是 4 个一组的数据信号,由 PHY 同步驱动,在MII_RX_DV 信号有效时才为有效信号(有效数据)。 MII_RXD[0] 为最低有效位,MII_RXD[3] 为最高有效位。当 MII_RX_EN 禁止、 MII_RX_ER 使能时,特定的MII_RXD[3:0] 值用于传输来自 PHY 的特定信息。
  • MII_RX_DV:接收数据有效信号。该信号表示 PHY 当前正针对 MII 接收已恢复并解码的半字节。该信号必须与恢复帧的头半字节进行同步 (MII_RX_CLK),并且一直保持同步到恢复帧的最后半字节。该信号必须在最后半字节随后的第一个时钟周期之前禁止。为了正确地接收帧, MII_RX_DV 信号必须在时间范围上涵盖要接收的帧,其开始时间不得迟于 SFD 字段出现的时间。
  • MII_RX_ER:接收错误信号。该信号必须保持一个或多个周期 (MII_RX_CLK),从而向MAC 子层指示在帧的某处检测到错误。该错误条件必须通过 MII_RX_DV 验证。

TX 接口信号编码

RX 接口信号编码

MII 时钟源
要生成 TX_CLK 和 RX_CLK 时钟信号,必须向外部 PHY 提供 25MHz 时钟,如图 474 所示。除了使用外部 25 MHz 石英晶体提供该时钟,还可以通过 STM32F75xxx 和 STM32F74xxx 微控制器的 MCO 引脚输出该信号。这种情况下,必须对 PLL 倍频进行配置,以通过 25 MHz外部石英晶体在 MCO 引脚上获得所需频率。

2.2.3精简介质独立接口:RMII

精简介质独立接口 (RMII) 规范降低了 10/100 Mb/s 下微控制器以太网外设与外部 PHY 间的引脚数。根据 IEEE 802.3u 标准, MII 包括 16 个数据和控制信号的引脚。 RMII 规范将引脚数减少为 7 个(引脚数减少 62.5%)。

RMII 是 MAC 和 PHY 之间的实例化对象。这有助于将 MAC 的 MII 转换为 RMII。 RMII 具有以下特性:

 支持 10 Mb/s 和 100 Mb/s 的运行速率
 参考时钟必须是 50 MHz
 相同的参考时钟必须从外部提供给 MAC 和外部以太网 PHY
 它提供了独立的 2 位宽(双位)的发送和接收数据路径

RMII 时钟源

使用外部 50 MHz 时钟驱动 PHY 或使用嵌入式 PLL 生成 50 MHz 频率信号来驱动 PHY。

如果使用RMII接口时,50MHz时钟来源有以下几种方式:

方式一:外部时钟

一个50MHz的外部晶振同时给MAC和PHY供应50MHz时钟,MCU其他的部分用自己独立的时钟。这个方式需要外挂一颗晶振。

方式二:与MCU共用外部时钟
MAC, PHY, MCU都用一颗50MHz外部晶振统一提供时钟源。

方式三:STM32输出时钟源
把50MHz换成25MHz,通过STM32的MCO引脚可以输出同样的25MHz时钟给PHY,然后用PHY内部的PLL配置出50MHz时钟反补给STM32的MAC,这样就满足了PHY和MAC都是50MHz。

值得注意的是,以上设计针对STM32XX7系列,而Nucleo-F746ZG开发板的MCU是ST_Link过来的8MHz时钟, 和上面两种方法完全不匹配,因此这里选择了第一种方式,只是PHY挂载的是一颗25MHz的晶振,然后经过PLL倍频到50MHz给MAC




2.3 PHY 层芯片:LAN8742A

LAN8742A是 SMSC 公司 (已被 Microchip 公司收购) 设计的一个体积小、功耗低、全能型10/100Mbps 的以太网PHY 层收发器,I/O 引脚电压符合 IEEE802.3-2005 标准。它是针对消费类电子和企业应用而设计的。 LAN8742A总共只有 24Pin,仅支持 RMII 接口。LAN8742A可以通过自协商的方式与目的主机最佳的连接方式(速度和双工模式),支持 HP Auto-MDIX 自动翻转功能,无需更换网线即可将连接更改为直连或交叉连接。

LAN8742A的主要特点如下:

 高性能的 10/100M 以太网传输模块
 支持 RMII 接口以减少引脚数
 支持全双工和半双工模式
 两个状态 LED 输出
 可以使用 25M 晶振以降低成本
 支持自协商模式
 支持 HP Auto-MDIX 自动翻转功能
 支持 SMI 串行管理接口
 支持 MAC 接口
 支持WOL网络唤醒功能

LAN8742A组成的网络结构见下图。

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

LAN8742A内部系统结构见下图。

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

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

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

nINT/REFCLKO引脚用于 RMII 接口中 REF_CLK 信号线,当 nINTSEL 引脚为低电平时,也就是REF_CLK Out 模式,nINT/REFCLKO 作为 REF_CLK 时钟源。它也可以被设置成 50MHz 时钟输出,这样可以直接与 STM32F746 的 REF_CLK 引脚连接为其提供50MHz 时钟源,这种模式要求为 XTAL1 与 XTAL2 之间或为 TAL1/CLKIN 提供 25MHz 时钟,由LAN8742A内部 PLL 电路陪频得到 50MHz 时钟,此时 nIN/REFCLKO 引脚的中断功能不可用,用于 50MHz 时钟输出。

当 nINTSEL 引脚为高电平时,也就是REF_CLK In 模式,nINT/REFCLKO 作为中断引脚。LAN8742A被设置为时钟输入,即外部时钟源直接提供 50MHz 时钟接入 STM32F46的REF_CLK 引脚和 LAN8742A的 XTAL1/CLKIN 引脚,此时 INT/REFCLKO 可用于中断功能。 nINTSEL 与 LED2 引脚共用,一般使用下拉。

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




2.4硬件电路介绍

在讲解移植步骤之前,有必须先介绍我们的实验硬件设计,主要是 LAN8742A 通过 RMII 和 SMI接口与 STM32F746 控制器连接,见下图。

STM32F746通过RMII 接口连接PHY芯片LAN8742, 然后经过百兆网络变压器到RJ45接口。因为 LAN8742A只有 RMII 接口,因此这里与开发板的连接采用了 RMII 接口。电路设计时,将 nINTSEL 引脚通过下拉电阻拉低,也就是REF_CLK Out 模式,设置 nINT/FEFCLKO 为输出 50MHz 时钟,当然前提是在 XTAL1 和 XTAL2 接入了 25MHz 的时钟源。

PHY芯片LAN8742的nRST复位引脚连接到了STM32F746的复位引脚, 两者可以同时使用复位按钮。




2.5软件准备

本文使用HAL库,接下来笔者这里再带领大家使用STM32CubeMX创建STM32F746的工程。
笔者这里只讲解接下来从选择自己型号MCU,到生成代码并成功运行的创建过程。

1.打开STM32CubeMX,进入MCU选择器

进入选择器时会联网更新数据库,可能需要等待一下。

2.选择对应型号MCU

【注】第一次使用某单片机,在点击生成代码以后,如果没有相应的固件,STM32CubeMX软件会提示需要下载固件,点击确定即可在线下载。保持联网,在线安装很快,当然也可先安装HAL库。

3.时钟源选择
如果选择使用外部高速时钟(HSE),则需要在System Core中配置RCC(如下图)。如果使用默认内部时钟(HSI),这一步可以略过。

【注】因为连接晶体振荡器,所以HSE选择BYPASS旁路,使用MCO的8MHz。

4.选择GPIO(LED)引脚
我这里使用一个GPIO引脚(PB0)控制LED亮灭。

以点亮LED为例。在我的电路中,LD0连接的引脚是PB0,我把引脚PB0设置为输出。

5.配置时钟Clock
STM32CubeMX配置时钟的界面非常方便,有很多提示(比如最大时钟),很多地方直接点击选择就行了。这里选择的HSE,不管使用外部晶振还是来自ST-Link都是8M。

由上图所示:默认使用的是从ST-Link的时钟源。当然也可从外部外部时钟获取时钟源。

由上图所示:MCO默认从ST-Link里输出的8MHz的时钟。
时钟配置如下图。

如图将主频配置到216MHz,GPIOB挂在APB2上,需要配置分频系数。

6.工程管理
工程管理器的内容比较多,大部分都默认即可,这里讲述几个要点(如下图)

7.生成代码
以上操作就基本配置完成了一个简单的Demo工程,只需要点击“生成代码”即可。

8.添加代码
当然,以上生成的代码还不够完善,需要添加自己的应用代码。添加在主函数添加一下应用代码:

HAL_Delay(500);
HAL_GPIO_TogglePin(GPIOB, GPIO_PIN_0);

加如上所示的代码,你开发板上LED就会间隔500ms变化一次(呈现闪烁状态)。

【注】

1.延时500ms时间需要你时钟配置正确。
2.LED对应引脚需要与你开发实际一致(本文以PB0为例)。
3.生成的MDK-ARM工程,编译后在线下载到板子上,然后复位即可看到实验现象。




代码获取方法

1.长按下面二维码,关注公众号[嵌入式实验楼]
2.在公众号回复关键词[LWIP]获取资料




欢迎访问我的网站

BruceOu的哔哩哔哩
BruceOu的主页
BruceOu的博客
BruceOu的CSDN博客
BruceOu的简书

以上是关于《嵌入式 - Lwip开发指南》第2章 LWIP开发环境简介的主要内容,如果未能解决你的问题,请参考以下文章

《嵌入式 - Lwip开发指南》第1章 LWIP概述

《嵌入式 - Lwip开发指南》第1章 LWIP概述

《嵌入式 - Lwip开发指南》第5章 LWIP测速

《嵌入式 - Lwip开发指南》第3章 移植LWIP(无系统)

《嵌入式 - Lwip开发指南》第3章 移植LWIP(无系统)

《嵌入式 - Lwip开发指南》第4章 移植LWIP(基于RT-Thead系统-以太网+Wifi)