了解lwip

目录

TCP/IP协议栈结构

TCP/IP协议栈的数据封装与解封装

lwIP结构

名词解释:

HTTP:

MQTT:

netconn

RAW

Socket

 TCP 

UDP

 ip4.c               

IP       

ARP   

ICMP

 ethernet

netif 

sys_arch

 MAC内核

 RMII       

MII

 PHY

MAC简介

ST的ETH框架

PHY交互接口

SMI站管理接口

SMI帧格式

PHY芯片简介(物理层内容)

LAN8720A与YT8512C简介

主要特性

PHY地址

LAN8720A的PHY地址设置

YT852c地址设置

RMII模式设置

PHY寄存器

类似的寄存器

特殊功能寄存器

以太网DMA描述符

DMA描述符介绍

追踪描述符

追踪过程


lwIP是一个小型的开源的TCP/IP协议栈(精简版的TCP/IP协议),博客借用了其他博客的内容在此声明。

TCP/IP协议栈结构

应用层:HTTP,MQTT,NTP、FTP.......

传输层:TCP协议(用于不可靠设备可靠传输),UTP协议(用于可靠设备的不可靠传输)

网络层:IP、ARP、ICMP······

链路层:数据链路层(由单片机的MAC内核完成)

                物理层(PHY芯片完成)

总结:应用层传输层网络层由lwip完成链路层由MAC内核和PHY芯片完成

TCP/IP协议栈的数据封装与解封装

发送封装

        用户数据->应用层首部+用户数据->TCP/UDP首部+应用层首部+用户数据->IP首部+TCP/UDP首部+应用层首部+用户数据->MAC首部+IP首部+TCP/UDP首部+应用层首部+用户数据+MAC尾部

接收解包(与发送反向)

总结:封装:数据添加各层协议的首部;解封装:在各层间除去自层的首部

lwIP结构

业务逻辑:        用户逻辑实现,例如怎么发

lwIP API:             HTTP、MQTT······

                          netconn 、RAW 、Socket(套接字)

lwIP CORE:           TCP        UDP

                            ip4.c

                          IP        ARP    ·······   ICMP

                         ethernet netif  sys_arch

HardwareDriver   MAC内核

                           RMII        MII

                              PHY

名词解释:

HTTP:

HTTP(超文本传输协议)是一种用于在网络上传输超文本的应用层协议。它定义了客户端(如浏览器)和服务器之间的通信规则,支持请求和响应模型,以便传输网页、图片、视频等多种资源。HTTP是Web的基础,允许用户通过URL访问内容。

MQTT:

MQTT(消息队列遥测传输)是一种轻量级的消息传输协议,特别适用于物联网(IoT)环境。它基于发布/订阅模式,使设备能够高效地交换数据。

主要特点:

  1. 轻量级:MQTT协议设计简单,数据包小,适合带宽有限或资源受限的环境。

  2. 发布/订阅模式:客户端可以发布消息到主题,其他订阅了该主题的客户端会接收到消息。这种模式解耦了消息的发送者和接收者。

  3. QoS级别:MQTT支持三种服务质量(Quality of Service)级别,确保消息传递的可靠性:

    • QoS 0:最多一次(不保证送达)

    • QoS 1:至少一次(保证送达,但可能重复)

    • QoS 2:仅一次(确保消息准确送达且不重复)

  4. 持久会话:支持客户端持久会话,即使客户端断开连接,消息仍会被保留,直到客户端重新连接。

  5. 轻松的连接管理:使用心跳机制(keep-alive)管理连接状态,适合移动设备和不稳定网络环境。

netconn

netconn是LWIP(轻量级IP协议栈)中的一个API,提供了一个简单的接口来处理TCP和UDP网络连接。它基于事件驱动模型,适合资源受限的嵌入式系统。

主要特点:

  1. 简化的接口:netconn提供了一组相对简单的函数来创建、绑定、监听和接受连接,便于开发。

  2. 支持TCP和UDP:通过相同的API,可以轻松处理这两种协议,降低了学习和开发的复杂性。

  3. 多线程支持:netconn可以在多线程环境中使用,适合需要并发处理的应用。

  4. 异步操作:支持异步操作,使得可以在不阻塞主循环的情况下进行网络通信。

使用步骤:

  1. 创建一个netconn实例。

  2. 绑定到特定端口。

  3. 监听连接(对于TCP)。

  4. 接受连接并进行数据收发。

RAW

在网络编程中,"RAW"通常指的是原始套接字(Raw Socket),这是一种允许用户直接访问网络协议栈的接口。原始套接字常用于网络协议的开发、网络监控和安全分析等领域。

主要特点:

  1. 底层访问:RAW套接字允许开发者直接构造和发送网络层(如IP)及其以上层的协议数据包。

  2. 灵活性:开发者可以自定义协议和数据包格式,适用于特殊需求的网络应用。

  3. 多协议支持:可以用于多种协议的实现,包括TCP、UDP和ICMP等。

  4. 网络监控:RAW套接字常用于抓包工具,可以用于监听和分析网络流量。

使用场景:

  • 网络测试和调试:开发和测试新的网络协议。

  • 安全分析:用于网络入侵检测系统(NIDS)和其他安全工具。

  • 流量监控:分析和监控网络流量的工具。

Socket

Socket是一种用于实现网络通信的接口,它允许程序通过网络传输数据。通过Socket,开发者可以创建客户端和服务器应用程序,支持多种传输协议,如TCP和UDP。

主要特点:

  1. 双向通信:Socket支持双向数据传输,允许客户端和服务器相互发送和接收消息。

  2. 多种协议支持:常用的协议包括TCP(流式传输,可靠性高)和UDP(数据报传输,速度快但不保证可靠性)。

  3. 异步操作:Socket可以在阻塞或非阻塞模式下工作,适用于不同的应用场景。

  4. 跨平台:大多数操作系统都支持Socket编程,使得开发的应用能够在不同平台间运行。

使用步骤:

  1. 创建Socket实例。

  2. 绑定到特定IP地址和端口(服务器端)。

  3. 监听连接(TCP)或直接发送数据(UDP)。

  4. 接受连接(TCP)或接收数据。

  5. 进行数据传输。

  6. 关闭Socket。

 TCP 

TCP(传输控制协议)是一种面向连接的协议,确保数据在网络中的可靠传输。它广泛用于各种应用程序,如网页浏览、电子邮件和文件传输。

主要特点:

  1. 可靠性:TCP通过确认应答和重传机制,确保数据包准确到达接收端。

  2. 顺序传输:数据包按发送顺序到达,避免了乱序问题。

  3. 流量控制:TCP使用滑动窗口机制控制数据流,防止接收端溢出。

  4. 拥塞控制:通过算法动态调整数据发送速率,以应对网络拥堵。

工作流程:

  1. 建立连接:通过三次握手(SYN, SYN-ACK, ACK)建立连接。

  2. 数据传输:双方可以双向发送数据。

  3. 断开连接:通过四次挥手(FIN, FIN-ACK, ACK)安全关闭连接。

UDP

UDP(用户数据报协议)是一种无连接的传输协议,提供快速的数据传输,但不保证数据的可靠性和顺序。它适用于实时应用,如视频会议、在线游戏和语音通话。

主要特点:

  1. 无连接:UDP不需要在传输前建立连接,减少了延迟。

  2. 数据报模式:每个数据包(数据报)独立发送,可能会丢失或乱序。

  3. 低开销:相较于TCP,UDP的头部开销较小,效率高。

  4. 简单性:UDP实现简单,适合需要快速传输的应用。

使用场景:

  • 实时应用:视频流、语音通话等对延迟敏感的场景。

  • 广播和多播:用于向多个接收者发送数据。

  • 简单查询响应:如DNS请求。

 ip4.c               

ip4.c 通常是用于处理 IPv4 网络协议的 C 语言源文件。下面是一个简单的示例代码,展示了如何创建一个基础的 IPv4 Socket 客户端和服务器。            

IP       

ARP   

ARP(Address Resolution Protocol)是一个网络协议,用于在局域网内通过 IP 地址查找相应的 MAC 地址。ARP 主要用于 IPv4 网络,下面是一些 ARP 的基本概念和工作原理。

ARP 的工作原理

  1. ARP 请求:当一个设备(如计算机)需要发送数据到同一局域网内的另一个设备时,它首先会检查自己的 ARP 缓存中是否已经存在目标设备的 MAC 地址。如果没有,它会发送一个 ARP 请求广播到网络上,请求目标 IP 地址对应的 MAC 地址。

  2. ARP 响应:网络中的所有设备都会接收到这个 ARP 请求,只有目标 IP 地址的设备会响应。该设备会发送一个 ARP 响应,包含自己的 MAC 地址。

  3. 更新 ARP 缓存:发送请求的设备会接收该响应,并将目标 IP 地址与其 MAC 地址存储在自己的 ARP 缓存中,以便下次直接使用。

ARP 消息格式

ARP 消息包括以下几个字段:

  • 硬件类型:表示网络类型(如以太网)。

  • 协议类型:通常为 IPv4。

  • 硬件地址长度:MAC 地址的字节数(通常为 6)。

  • 协议地址长度:IP 地址的字节数(通常为 4)。

  • 操作:指示是 ARP 请求(1)还是 ARP 响应(2)。

  • 发送者硬件地址:发送请求或响应的设备的 MAC 地址。

  • 发送者协议地址:发送请求或响应的设备的 IP 地址。

  • 目标硬件地址:目标设备的 MAC 地址(在请求中通常为 0)。

  • 目标协议地址:目标设备的 IP 地址。

ARP 的作用

  • 动态映射:ARP 允许设备动态地解析 IP 地址到 MAC 地址,适应网络中设备的变化。

  • 局域网通信:在局域网中,ARP 是确保数据包能够正确送达目标设备的重要协议。

ARP 缓存

操作系统会维护一个 ARP 缓存,以减少频繁的 ARP 请求。缓存中的条目会在一段时间后过期,防止信息过时。

ICMP

ICMP(Internet Control Message Protocol)是一种网络层协议,用于在网络设备之间发送控制消息和错误报告。它是 TCP/IP 协议族的重要组成部分,主要用于诊断和管理网络问题。以下是 ICMP 的一些关键点:

主要功能

  1. 错误报告:当数据包在网络中无法送达目标时,ICMP 会生成错误消息。例如,网络不可达、主机不可达或超时等。

  2. 诊断工具:ICMP 被广泛用于网络诊断工具,如 pingtracerouteping 通过发送 ICMP 回显请求(Echo Request)来测试与目标的连通性,目标设备回应 ICMP 回显应答(Echo Reply)。

  3. 流量控制:ICMP 还可以用于网络拥塞控制,发送源主机有关拥塞的通知。

ICMP 消息类型

ICMP 消息主要有两种类型:

  • 错误消息:如目标不可达、时间超时、参数问题等。

  • 查询消息:如回显请求和应答,时间戳请求和应答等。

ICMP 的重要性

ICMP 是维护和管理网络的关键工具,能够提供重要的反馈信息,有助于网络管理员诊断和解决连接问题。由于其功能的重要性,ICMP 在许多网络安全策略中受到关注,防火墙通常会对 ICMP 流量进行过滤。

 ethernet

以太网(Ethernet)是一种广泛使用的局域网技术,最初由施乐公司(Xerox)在 1970 年代开发,并成为了局域网通信的标准。以下是以太网的一些关键特性和概念:

基本概念

  1. 工作原理:以太网使用帧(Frame)进行数据传输。数据在网络中以帧的形式发送,每个帧包含目标和源地址、数据负载及错误检测信息。

  2. 地址:每个以太网设备都有一个唯一的 MAC 地址(媒体访问控制地址),用于在同一局域网内识别设备。

  3. 拓扑结构:以太网支持多种网络拓扑,包括星型、总线型和环型。现代以太网通常使用星型拓扑,中心节点为交换机。

传输介质

以太网可以通过多种介质传输,包括:

  • 双绞线(Twisted Pair):常见的以太网电缆类型,适用于家庭和小型办公室。

  • 光纤(Fiber Optic):用于高带宽和长距离传输,通常在企业和数据中心使用。

  • 无线(Wireless):虽然传统以太网是有线的,但 Wi-Fi 技术也被广泛应用于网络连接。

以太网标准

以太网经历了多个发展阶段,常见的标准包括:

  • 10BASE-T:传输速率为 10 Mbps 的以太网。

  • 100BASE-TX(快速以太网):传输速率为 100 Mbps。

  • 1000BASE-T(千兆以太网):传输速率为 1 Gbps。

  • 10GBASE-T(10千兆以太网):传输速率为 10 Gbps。

  • 更高速度标准:包括 25G、40G、100G 和更高速率的以太网标准。

以太网协议

以太网协议定义了数据帧的格式和传输方式,常用的以太网协议包括 IEEE 802.3 和 IEEE 802.1Q(用于虚拟局域网,VLAN)。

以太网的优势

  • 简单易用:以太网技术相对简单,易于安装和维护。

  • 成本效益:以太网设备(如交换机和电缆)通常价格合理,适合各种规模的网络。

  • 可扩展性:可以轻松增加新的设备,而不会影响网络性能。

netif 

“Netif”通常指的是网络接口(Network Interface),它是计算机或网络设备中用于连接网络的组件。以下是一些关于网络接口的基本概念:

基本概念

  1. 定义:网络接口是设备与网络之间的交互点,负责发送和接收数据包。每个网络接口都有一个唯一的标识符,如 MAC 地址。

  2. 类型:

    • 有线接口:如以太网接口,通过网线连接到网络。

    • 无线接口:如 Wi-Fi 接口,使用无线信号连接到网络。

    • 虚拟接口:用于虚拟化环境中的虚拟机,可以通过软件创建,通常用于网络隔离或虚拟局域网(VLAN)。

  3. 协议:网络接口通常支持多种网络协议,如 TCP/IP、UDP 等,用于数据的封装和传输。

功能

  • 数据封装:网络接口负责将数据封装成网络帧,以便在网络中传输。

  • 地址处理:处理源和目标地址,以确保数据包能够正确发送到目标设备。

  • 错误检测:通过校验和等机制检测数据在传输过程中是否发生错误。

网络接口的管理

  • 配置:网络接口的配置包括设置 IP 地址、子网掩码、网关等参数。

  • 状态监控:监控网络接口的状态和流量,以确保网络连接的健康和性能。

sys_arch

“sys_arch”通常与操作系统的架构相关,尤其是在嵌入式系统或实时操作系统(RTOS)中。它涉及系统架构层,主要负责底层硬件和上层应用之间的接口。以下是一些关键点:

基本概念

  1. 定义:sys_arch 是一种抽象层,提供操作系统与硬件之间的接口,帮助管理任务调度、内存管理和同步机制。

  2. 任务管理:处理任务的创建、删除和调度,使得不同任务可以在系统中并发执行。

  3. 同步机制:提供信号量、互斥锁等同步工具,帮助不同任务之间协调共享资源。

  4. 底层接口:与特定硬件平台交互,管理中断、时钟和其他硬件资源。

 MAC内核

MAC内核(Microkernel Architecture)是一种操作系统内核设计理念,其目标是将核心功能最小化,提供基本的系统服务,而将其他服务(如设备驱动、文件系统和网络协议等)移至用户空间。以下是一些关键概念和特点:

关键概念

  1. 微内核架构:MAC内核将内核功能最小化,通常只包含进程管理、内存管理和基本的设备管理。

  2. 用户空间服务:除了基本的内核功能外,其他系统服务在用户空间中运行。这种设计使得系统更灵活,便于扩展和维护。

  3. 消息传递机制:微内核通常依赖于高效的消息传递机制来实现内核和用户空间服务之间的通信。

特点

  1. 模块化:服务可以独立开发和维护,降低了系统的复杂性。

  2. 安全性和稳定性:由于大部分服务在用户空间中运行,系统崩溃的风险降低,增加了整体的稳定性。

  3. 可移植性:微内核设计通常与特定硬件解耦,易于移植到不同的平台。

例子

一些著名的微内核操作系统包括:

  • MINIX:教育和研究用的微内核操作系统。

  • QNX:用于嵌入式系统和实时应用的微内核操作系统。

  • L4:一个微内核架构的系列,广泛用于研究和实际应用。

 RMII       

RMII(Reduced Media-Independent Interface)是一种用于以太网控制器和物理层设备之间的接口标准。它旨在简化连接,并减少所需的引脚数量。以下是一些关于RMII的关键点:

主要特点

  1. 引脚减少:与MII(Media-Independent Interface)相比,RMII减少了引脚数量,通常使用只有两对信号线(传输和接收),以及时钟和控制信号。

  2. 传输速率:RMII支持10 Mbps和100 Mbps的以太网速度,适用于大多数中小型网络应用。

  3. 时钟信号:RMII使用一个25 MHz的时钟信号来同步数据传输,而MII则使用两个不同频率的时钟。

  4. 灵活性:RMII设计可以与多种以太网物理层设备兼容,提供了较好的灵活性。

  5. 发送位宽2位

MII

MII(Media-Independent Interface)是一种用于以太网控制器和物理层设备(如以太网芯片)之间的接口标准。以下是一些关于MII的关键点:

主要特点

  1. 数据传输:MII支持10 Mbps和100 Mbps的以太网速度,允许全双工和半双工操作。

  2. 引脚配置:MII通常使用16根引脚,包括数据传输、接收信号、时钟信号和控制信号。

  3. 灵活性:它可以与多种不同类型的物理层设备(PHY)兼容,适用于各种网络应用。

  4. 同步:数据传输通过时钟信号进行同步,使得接收和发送的数据能够准确匹配。

  5. MII发送位宽为4位

 PHY

PHY(Physical Layer Device)是指网络通信中物理层的硬件组件,负责将数据从物理信号转换为数字信号,反之亦然。它是实现网络连接的关键部分,通常与MAC(媒体接入控制)层配合工作。

主要功能

  1. 信号转换:PHY将数字信号转换为模拟信号,适合在物理媒介(如电缆、光纤)中传输。

  2. 编码和解码:进行必要的编码和解码,以保证信号在传输过程中的可靠性。

  3. 速率支持:支持不同的传输速率,如10 Mbps、100 Mbps(以太网)、1 Gbps等。

  4. 错误检测:某些PHY设计中包含错误检测和纠正功能,增强数据传输的可靠性。

  5. 接口:PHY通常通过MII、RMII或其他接口与MAC层进行连接。

MAC简介

STM32自带有10Mbit/100Mbit/s的以太网MAC内核

特性

传输速率:支持外部PHY接口实现10/100Mbit速率传输

协议:符合IEEE802.3/3的MII和RMII接口与快速以太网PHY通讯

工作模式:支持半双工和全双工操作。

站管理接口:支持通过MDIO接口配置和管理PHY设备

ST的ETH框架

 以太网DMA数据包以DMA方式发送和接收,发送和接收最大1500字节,所以STM32以太网收发缓冲FIFO为2KB是足够的

PHY交互接口

        数据通道:介质接口RMII/MII

        管理通道:SMI站管理接口,MOC,MDIO

SMI站管理接口

允许应用程序通过时钟线和数据线访问任意PHY寄存器,最多可访问32个PHY

 MDC:时钟周期引脚(最大频率为:2.5MHZ)

MDIO:数据输入/输出比特流

SMI帧格式

在《STM32F4XX中文参考手册》中给出的SMI帧格式如下:

SMI帧包括8个字段:
(1)前导码(Preamble):每次读写或写入PHY设备均需要先发送前导码,报头字段对应于MDIO线上32个连续的逻辑“1”位以及MDC上的32个周期。该字段用于和PHY设备建立同步。
(2)帧起始(ST):帧起始共2bit,值为01b。用于验证线路从默认逻辑“1”状态变为逻辑“0”状态,然后再从逻辑“0”状态变为逻辑“1”状态。
(3)操作(OP):定义正在进行的事件(读取或写入)的类型。01b表示写入,10b表示读取。
(4)PHY地址(PADDR):PHY地址一共有5位,因此可以寻址最多32个PHY设备。最先发送和接收地址的MSB位。
(5)寄存器地址(RADDR):寄存器地址一共有5位,因此可以最多对所选PHY设备的32个不同寄存器进行寻址。最先发送和接收地址的MSB位。
(6)周转(TA):周转字段一共有2位,它被定义在RADDR和DATA字段之间,避免在读取事件出现竞争现象。读取PHY设备时,主机将TA的2个位驱动为MDIO线上的高阻态。PHY设备必须将TA的第一位驱动为高阻态,将TA的第二位驱动为逻辑“0”。
写入PHY设备时,主机必须将TA字段设置为10b,PHY设备必须将TA的2个字段驱动为高阻态。
(7)数据(DATA):数据字段为16位。发送和接收的均是寄存器的MSB位。
(8)空闲:MDIO被驱动为高阻态。三态驱动器必须被禁止,PHY的上拉电阻使线路保持逻辑“1”状态。
最后,可以用以下2个图片表示SMI的写入和读取PHY设备寄存器报文格式:
写入报文:

读取报文:

介质接口MII和RMII(重要)

用于MAC与外接的PHY设备互联,支持10M/100Mbit数据传输,以太网帧转发到PHY设备中

数据传输过程:数据进入缓冲区以太网DMA传输到TXFIOF,再传输到MAC内核(以太网帧)通过MII或RMII将数据传输到PHY,PHY将数据以以光电信号发送到以太网中。接收过程与传输过程相反。

MII与RMII比较

相同特性:

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

        2、符合IEEE802.3协议标准

不同特性:

        1:引脚数量:MII 17个(8个数据线,两个时钟线),RMII 9个

        2:参考时钟:MII介质接口的TX_CLK和RX_CLK由PHY芯片提供,让MAC内核以这个时钟采集收发数据。RMII介质接口的REF_CLK,MACK内核以这个时钟采集收发数据

        3、发送位宽:MII 4位,RMII 2位,虽然传输位宽不同但是RMII传输速度是MII的两倍,因此他们传输数据速率是相同的。

注意:RX_ER和RX_DV是用来检测以太网帧是否有效性,而CRS和COL以及CRS_DV在全双工模式下无效

MII参考时钟来源有两个 :MCO输出25MHz以及外部晶振输出25MHz

注意:MII接口中的TX_CLK和RX_CLK时钟是根据数据传输速率挂钩的,10Mbit/s:2.5MHz;100Mbit/s:25MHz.

RMII

RMII的参考时钟来源有两个:MOC经过倍频PLL输出50MHz以及外部晶振输出50MHz(必须同时提供PHY和MAC)

从时钟频率可以看出RMII时钟是MII的两倍

PHY芯片简介(物理层内容)

LAN8720A与YT8512C简介

10M/100Mbit以太网PHY芯片,支持MII或RMII与MAC层通信,支持Auto MDIX自动翻转功能,无需更换网线即可将连接改为直接或交叉连接。

主要特性

        1、自动翻转

        2、多种接口,支持RMII,MII介质访问接口

        3、100/10Mbit

        4、支持低功耗运行

        YT8512原理图可共用RTL8201和SR8201F芯片

PHY地址

        SMI站管理接口通过PHY地址访问指定的PHY芯片

LAN8720A的PHY地址设置

YT852c地址设置

(由两个引脚决定,25号和24号)一共四个地址可以选择

        24为高,25为低地址为0x00001

RMII模式设置

        LAN8720A与YT8512C在RMII模式有两种连接方式

LAN8720A

        REF_CLK In模式        外部提供50MHz时钟连接到PHY芯片5号引脚以及RMII_REF_CLK

        REF_CLK out模式        外部提供25MHz时钟给PHY芯片,REF_CLK引脚输出50Mhz(一般选择这种)

        这两种模式由PHY的2号引脚决定,0为out模式(REF_CLK引脚输出50Mhz),1为In模式(REF_CLK做中断处理)

YT8512C

        RMII1模式        PHY外接25MHz情况下,外部提供50MHz时钟连接到RMII_REF_CLK引脚上

        RMII2模式        PHY外接25MHz情况下,PHY芯片的15号引脚(TXC)输出50MHz时钟

        这两个模式由PHY的8和12号引脚决定,8高12低(默认),RMII2模式

PHY寄存器

    LAN8720A与YT8512C都具有32个寄存器,每一个寄存器都有16位

类似的寄存器

根据IEEE802.3标准定义了0~15寄存器(重点BCR和BSR寄存器

自由定义的寄存器:16~31寄存器是由芯片制造商自由定义(制造商定义的)

特殊功能寄存器

        通过确认网速以及双工模式来设置BCR寄存器的bit8(双工模式选择)和bit13(速度选择)

        注意:每一个PHY特殊功能寄存器(16~31)都不一样,需要查看相关手册来确定。如果找不到就用BCR寄存器来代替。

以LNA8720A为例

        第4位是选择全双工还是半双工

        第2,3位选择速度,10/100Mbit

        PHY_SR(寄存器地址)        0x1f                                                            第31个寄存器

        PHY_SPEED_STATUS(设置速度)                 0x0004          01000        100Mbit/s

        PHY_DUPLEX_STATUS(设置双工模式)        0x00010        10000        全双工

以太网DMA描述符

DMA描述符介绍

发送:不需要CPU的参与下,把描述符指向的缓冲区数据传输到TXFIFO当中。

接收:   不需要CPU参与,将RxFIFO中的数据传输到描述符指向的缓冲区当中。

描述符分类

        常规描述符:管理缓冲区(正点原子教程使用)

        增强描述符:在常规描述符的基础上开启时间戳和IPV4校验和减荷

        用于管理TXFIFO,RXFIFO,存储器到存储器。

追踪描述符

旧版本HAL:ETH_HandleTypeDef中定义了RxDesc和TxDesc指针,他们用来追踪Rx/Tx的DMA描述符。

新版本HAL:ETH_InitTypeDef中定义了RxDesc和TxDesc指针,他们用来追踪Rx/Tx的DMA描述符。

创建描述符

定义相关指针

发送:Txbuf就是一个缓冲区,用来保存网络层下发的数据存储在Pbuf(缓冲区),Pbuf包含了用户下达的数据 ,Pbuf包含了添加相应的首部+数据,将Pbuf拷贝到Txbuf,再使用以太网DMA发往到TxFIFO中,再转发到MAC内核再使用介质接口发到PHY(光电信号)

接受:PHY->MAC->RxFIFO->Rxbuf中->网络层,Rxbuf有很多个块,每个块大小为1524字节(ETH_RxBUF_SIZE大小为1524一共5个(ETH_RXBUFNB))

用g_eth_dma_rx_dscr_tab,g_eth_dma_tx_dscr_tab这两个来管理Rxbuf,Txbuf这些缓冲区的。

追踪过程

HAL库旧版本

/**
  * @brief  Initializes the DMA Tx descriptors in chain mode.
  * @param  heth pointer to a ETH_HandleTypeDef structure that contains
  *         the configuration information for ETHERNET module  
  * @param  DMATxDescTab Pointer to the first Tx desc list 
  * @param  TxBuff Pointer to the first TxBuffer list
  * @param  TxBuffCount Number of the used Tx desc in the list
  * @retval HAL status
  */
HAL_StatusTypeDef HAL_ETH_DMATxDescListInit(ETH_HandleTypeDef *heth, ETH_DMADescTypeDef *DMATxDescTab, uint8_t *TxBuff, uint32_t TxBuffCount)
{
  uint32_t i = 0U;
  ETH_DMADescTypeDef *dmatxdesc;
  
  /* Process Locked */
  __HAL_LOCK(heth);
  
  /* Set the ETH peripheral state to BUSY 设置网络状态为忙碌*/
  heth->State = HAL_ETH_STATE_BUSY;
  
  /* Set the DMATxDescToSet pointer with the first one of the DMATxDescTab list
     指向第一个描述符*/
  heth->TxDesc = DMATxDescTab;
  
  /* Fill each DMATxDesc descriptor with the right values 
    通过for循环来添加每一个描述符*/   
  for(i=0U; i < TxBuffCount; i++)
  {
    /* Get the pointer on the ith member of the Tx Desc list 
        获取Tx Desc列表的第i个成员指针*/
    dmatxdesc = DMATxDescTab + i;
    
    /* Set Second Address Chained bit 
        TDES0[20]置1:设置第二个地址链接位*/
    dmatxdesc->Status = ETH_DMATXDESC_TCH;  
    
    /* Set Buffer1 address pointer
        给描述符的buffer赋值地址 */
    dmatxdesc->Buffer1Addr = (uint32_t)(&TxBuff[i*ETH_TX_BUF_SIZE]);
    if ((heth->Init).ChecksumMode == ETH_CHECKSUM_BY_HARDWARE)
    {
      /* Set the DMA Tx descriptors checksum insertion 
         */
      dmatxdesc->Status |= ETH_DMATXDESC_CHECKSUMTCPUDPICMPFULL;
    }
    
    /* Initialize the next descriptor with the Next Descriptor Polling Enable
       如果没有到最后一个节点*/
    if(i < (TxBuffCount-1U))
    {
      /* Set next descriptor address register with next descriptor base address 
        描述符next指向下一个描述符节点*/
      dmatxdesc->Buffer2NextDescAddr = (uint32_t)(DMATxDescTab+i+1U);
    }
    else
    {
      /* For last descriptor, set next descriptor address register equal to the first descriptor base address 否则下一个节点就指向第一个节点*/ 
      dmatxdesc->Buffer2NextDescAddr = (uint32_t) DMATxDescTab;  
    }
  }
  
  /* Set Transmit Descriptor List Address Register 把描述符的地址赋值给DMA的寄存器*/
  (heth->Instance)->DMATDLAR = (uint32_t) DMATxDescTab;
  
  /* Set ETH HAL State to Ready 将网络状态设置为准备*/
  heth->State= HAL_ETH_STATE_READY;
  
  /* Process Unlocked */
  __HAL_UNLOCK(heth);
  
  /* Return function status */
  return HAL_OK;
}

HAL_StatusTypeDef HAL_ETH_DMATxDescListInit(ETH_HandleTypeDef *heth, ETH_DMADescTypeDef *DMATxDescTab, uint8_t *TxBuff, uint32_t TxBuffCount)

输入参数说明:

heth        以太网句柄

DMATxDescTab        以太网发送描述符数据结构体指针,(g_eth_dma_tx_dscr_tab)

TxBuff        Txbuf缓冲区地址(以太网底层驱动buffer地址g_eth_tx_buf)

TxBuffCount     Txbuf区域个数(ETH_RXBUFNB)   

功能:将以太网描述符链表与TxBuff/RxBuff联系起来,在创建的时候描述符节点个数与TxBuff/RxBuff区域块的个数是相同的,让描述符结构体成员BufferAddr保存TxBuff/RxBuff的某个区域块地址(一一对应)。再将独立描述符节点链接起来形成一个环形链表

问:

为什么要这样管理?

        因为数据要经过各层是要添加相应的头部和尾部,这个管理正好经历这个过程是方便给数据进行包装,传递。

为什么是描述符是五个节点,缓冲区是五个块?

        因为数据在传输时要包装五次,在发送时也是要拆解五次。ETH_RXBUFNB这个宏是5

HAL库新版本

和旧版本原理是相同的。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值