一、背景知识
1、TCP/IP协议简介
TCP/IP 定 义了电子设备如何连入因特网,以及数据如何在它们之间传输的标准。协议采用了 4 层的层级结构,每一层都呼叫它的下一层所提供的协议来完成自己的需求。TCP 负责发现传输的问题,一有问题就发出信号,要求重新传输,直到所有数据安全正确地传输到目的地。而IP 是给因特网的每一台联网设备规定一个地址。
TCP/IP 协议不是
TCP
和
IP
这两个协议的合称,而是指因特网整个
TCP/IP
协议族。从协议分层模型方面来讲,TCP/IP
由四个层次组成:网络接口层、网络层、传输层、应用层。
OSI
是传统的开放式系统互连参考模型,
该模型将
TCP/IP
分为七层
:
物理层、数据链路层(网络接口层)、
网络层(网络层)、传输层(传输层)、会话层、表示层和应用层(应用层)。
TCP/IP
模型与
OSI 模型对比下图
所示。
在 LWIP
实验中
PHY
层芯片 DP82438
相当于物理层,
STM32F407
自带的
MAC
层 相当于数据链路层,
而
LWIP
提供的就是网络层、传输层的功能,应用层是需要用户自己根据自己想要的功能去实现的。
2、常用PHY芯片资料
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 自动翻转功能,无需更换网线即可将连接更改为直连或交叉连接。
LWIP 实验中 PHY 层芯片 LAN8720 相当于物理层,STM32F407 自带的 MAC 层 相当于数据链路层,而 LWIP 提供的就是网络层、传输层的功能,应用层是需要用户自己根据自己想要的功能去实现的。
LAN8720 内部寄存器
PHY 是由 IEEE 802.3 定义的,一般通过 SMI 对 PHY 进行管理和控制,也就是读写 PHY 内 部寄存器。PHY 寄存器的地址空间为 5 位,可以定义 0~31 共 32 个寄存器。IEEE 802.3 定义了 0~15 这 16 个寄存器的功能,16~31 寄存器由芯片制造商自由定义。
在 LAN8720 有很多寄存器,在这里我们只介绍几个用到的寄存器(括号内为寄存器地址, 此处使用十进制表示):BCR(0),BSR(1),PHY 特殊功能寄存器(31)这三个寄存器。
我们通过调用 ST 官方的以太网库的 ETH_ReadPHYRegister 和 ETH_WritePHYRegister 函数来完成对 PHY 芯片寄存器的读写操作。
在以后要讲的 LAN8720
初始化的中并没有看到我们直接操作
PHY
的寄存器,原因就在这里当我们调用 ETH_Init()
函数以后就会根据我们输入的参数配置
LAN8720
的相应寄存器。
2、DP83848
3、站管理接口(SMI)
站管理接口(SMI)
允许应用程序通过
2
条线:时钟
(MDC)
和数据线
(MDIO)
访问任意
PHY寄存器。该接口支持访问多达 32
个
PHY
。
二、移植步骤
1,移植STM32f4的驱动文件
-
添加stm32的以太网库
总共需要添加三个文件:
stm32f4x7_eth.h、stm32f4x7_eth.c 和 stm32f4x7_eth_conf_template.h。
stm32f4x7_eth.h 为头文件。
,stm32f4x7_eth.c 为ST
的以太网库,里面有很多关于
STM32F4X7
的以太网的函数,
stm32f4x7_eth_conf_template.h 里面定义了一些关于操作 PHY
芯片的信息,为了方便移植我们将
stm32f4x7_eth_conf_template.h 重命名为 stm32f4x7_eth_conf.h
。最后我们将
stm32f4x7_eth.c
添加到我们的工程中,并且添加头文件路径。
-
修改 stm32f4x7_eth_conf.h 文件
如果是DP83848则不用修改,因为stm32官方是按照DP83848编写的。如果是LAN8720则需要修改。
-
修改 stm32f4x7_eth.c 文件
在
stm32f4x7_eth.c
文件中针对不同的平台定义了四个数组:
Rx_Buff[]
、
Tx_Buff[]
DMARxDscrTab[]和
DMATxDscrTab[]
,这四个数组占用了大量的
RAM
。我们在这里将这四个
变量屏蔽掉
。在其他文件中会采用内存管理的方式为这
4
个数组分配内存,这样我们就可以使用外部 SRAM
,减少对
STM32F407
内部
RAM
的使用。ps其实这里我移植的时候也屏蔽掉了,只是由于我只有一个内存所以还是使用的内部内存,并没什么卵用。完全可以用它定义的,对应好就行。
2,添加以太网驱动程序
添加之前可以了解上DMA描述符的作用。
-
添加 LAN8720 和 MAC /DMA 驱动
有添加lan8720.c
和
lan8720.h 这两个文件到各自的硬件驱动中去。同时记得添加stm32f4xx_syscfg.c文件,这个是库文件。
3,LWIP 数据包和网络接口管理
-
添加LWIP源文件
4,添加中间件文件
- 添加 arch 文件
- 添加 LWIP 通用文件
- 添加 ethernetif.h 文件
5,LWIP 源码修改
- 修改 ethernetif.c 文件
- 修改 mem.c 和 memp.c 文件
- 修改 icmp.c 文件。
- LWIP 的裁剪与配置