STM32F4-ETH通信(lwip)——学习笔记

文章介绍了以太网通信的基础知识,包括OSI七层模型和TCP/IP四层模型的对比,详细阐述了以太网标准、PHY层的功能、传输介质、编码方式如曼彻斯特编码,以及CSMA/CD冲突检测机制。同时,讨论了STM32F4xx系列控制器集成的以太网外设,如何通过MAC和PHY芯片实现数据包传输,并提到了SMI接口在与PHY通信中的作用。此外,还提及了LwIP轻型TCP/IP协议栈在嵌入式系统中的应用。
摘要由CSDN通过智能技术生成

一、关键知识点:

1、国际标准组织将整个以太网通信结构制定了 OSI 模型,总共分层七个层,分别 为应用层、表示层、会话层、传输层、网络层、数据链路层以及物理层,每个层功能不同,通信 中各司其职,整个模型包括硬件和软件定义。OSI 模型是理想分层,一般的网络系统只是涉及其 中几层。

2、TCP/IP 只有四个分层,分别为应用层、传输层、网络层以及网络访问层。

3、 以太网 (Ethernet) 是互联网技术的一种,以太网是指遵守 IEEE 802.3 标准组成的局域网,由 IEEE 802.3 标准规定的主要是位于参考模型 的物理层 (PHY) 和数据链路层中的介质访问控制子层 (MAC)。IEEE 还有 其它局域网标准,如 IEEE 802.11 是无线局域网,俗称 Wi-Fi。IEEE 802.15 是个人域网,即蓝牙 技术,其中的 802.15.4 标准则是 ZigBee 技术。

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

5、传输介质:

6、编码:为了让接收方在没有外部时钟参考的情况也能确定每一位的起始、结束和中间位置,在传输信号 时不直接采用二进制编码。在 10BASE-T 的传输方式中采用曼彻斯特编码,在 100BASE-T 中则采 用 4B/5B 编码。曼彻斯特编码把每一个二进制位的周期分为两个间隔,在表示“1”时,以前半个周期为高电平, 后半个周期为低电平。表示“0”时则相反

7、CSMA/CD 冲突检测:

8、MAC 子层:

MAC 数据包、MAC 数据包格式、

MAC 地址:MAC 地址由 48 位数字组成,它是网卡的物理地址,在以太网传输的最底层, 就是根据 MAC 地址来收发数据的。部分 MAC 地址用于广播和多播,在同一个网络里不能 有两个相同的 MAC 地址。PC 的网卡在出厂时已经设置好了 MAC 地址,但也可以通过一 些软件来进行修改,在嵌入式的以太网控制器中可由程序进行配置。数据包中的 DA 是目 标地址,SA 是源地址。

9、TCP/IP 协议栈:

为什么需要协议栈?

10、各网络层的功能:

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

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

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

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

11、以太网外设 (ETH)

STM32F4xx 系列控制器内部集成了一个以太网外设,它实际是一个通过 DMA 控制器进行介质 访问控制 (MAC),它的功能就是实现 MAC 层的任务。借助以太网外设,STM32F4xx 控制器可以 通过 ETH 外设按照 IEEE 802.3-2002 标准发送和接收 MAC 数据包。ETH 内部自带专用的 DMA 控制器用于 MAC,ETH 支持两个工业标准接口介质独立接口 (MII) 和简化介质独立接口 (RMII) 用于与外部 PHY 芯片连接。MII 和 RMII 接口用于 MAC 数据包传输,ETH 还集成了站管理接口 (SMI) 接口专门用于与外部 PHY 通信,用于访问 PHY 芯片寄存器。 物理层定义了以太网使用的传输介质、传输速度、数据编码方式和冲突检测机制,PHY 芯片是 物理层功能实现的实体,生活中常用水晶头网线 + 水晶头插座 +PHY 组合构成了物理层。

12、SMI 接口:

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

12.2:SMI 帧格式

12.3:SMI 读写操作

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

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。

LAN8720A、DP83848C

13、LwIP:轻型 TCP/IP 协议栈

LwIP 是 Light Weight Internet Protocol 的缩写,是由瑞士计算机科学院 Adam Dunkels 等开发的 适用于嵌入式领域的开源轻量级 TCP/IP 协议栈。

ETH 初始化结构体详解:

#本文内容摘抄于文档:[野火EmbedFire]《STM32%20HAL库开发实战指南——基于野火F4系列开发板》—20211027.pdf

您好!对于STM32F407和ETH LWIP,我可以为您提供一些关于TCP client客户端的开发方面的信息。 首先,您需要使用STM32CubeMX软件来配置STM32F407的ETHLWIP库。在STM32CubeMX中,您可以配置以太网接口和选择使用LWIP协议栈。确保在配置期间启用TCP/IP协议。 一旦配置完成并生成代码,您可以在生成的代码中找到LWIP库的API函数以及以太网驱动程序的相关函数。在这里,您将能够设置和管理TCP连接。 以下是一个简单的TCP客户端示例代码,用于向服务器发送数据: ```c #include "lwip/api.h" #define SERVER_IP "192.168.0.100" #define SERVER_PORT 8080 void tcp_client_task(void *arg) { struct netconn *conn; err_t err; // 创建TCP连接 conn = netconn_new(NETCONN_TCP); if (conn != NULL) { ip_addr_t server_addr; // 设置服务器IP地址和端口 IP4_ADDR(&server_addr, 192, 168, 0, 100); // 连接服务器 err = netconn_connect(conn, &server_addr, SERVER_PORT); if (err == ERR_OK) { const char *data = "Hello, server!"; struct netbuf *send_buf; // 创建发送数据包 send_buf = netbuf_new(); if (send_buf != NULL) { // 将数据添加到发送数据包中 netbuf_ref(send_buf, data, strlen(data)); // 发送数据包 err = netconn_send(conn, send_buf); // 释放发送数据包 netbuf_delete(send_buf); } } // 关闭连接 netconn_close(conn); netconn_delete(conn); } vTaskDelete(NULL); } ``` 请注意,此示例代码仅用于演示目的,您可能需要根据您的具体需求进行修改。另外,还要确保正确初始化LWIP协议栈和以太网接口。 希望这些信息对您有所帮助!如果您有任何进一步的问题,请随时提问。
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值