在ESP32上实现以太网通信需要外接以太网模块(因ESP32本身无内置以太网PHY芯片),常见方案有两种:
- SPI接口以太网模块(如ENC28J60):成本低、接线简单,适合低速场景(10Mbps);
- RMII接口以太网模块(如LAN8720):速率高(10/100Mbps),适合高速数据传输,但接线复杂,且仅部分ESP32型号支持(如ESP32-WROOM-32、ESP32-WROVER-E,ESP32-C3不支持RMII)。
本文以ENC28J60(SPI接口) 为例,详细讲解在ESP32上配置和使用以太网的完整流程(基于ESP-IDF框架),包含硬件连接、软件配置、代码实现及测试验证。
一、硬件准备与连接
1. 所需硬件
- ESP32开发板(如ESP32-WROOM-32);
- ENC28J60以太网模块(SPI接口,3.3V供电);
- 网线(连接到路由器或交换机);
- 杜邦线若干。
2. 引脚连接(ESP32 ↔ ENC28J60)
ENC28J60通过SPI与ESP32通信,核心引脚定义如下(可灵活修改,需与代码对应):
| ESP32 引脚 | ENC28J60 引脚 | 说明 |
|---|---|---|
| 3.3V | VCC | 电源(必须3.3V,不可接5V) |
| GND | GND | 共地 |
| GPIO18 | SCK | SPI时钟线 |
| GPIO23 | MOSI | SPI主机发/从机收 |
| GPIO19 | MISO | SPI从机发/主机收 |
| GPIO5 | CS | 片选信号(低电平有效) |
| GPIO2 | RESET | 模块复位(可选,不接则默认上电复位) |
注意:
- ENC28J60的SPI速率建议≤10MHz(过高可能通信不稳定);
- 若ESP32的GPIO5被占用,可改用其他GPIO(如GPIO15),需在代码中同步修改。
二、软件配置(基于ESP-IDF v5.0+)
1. 工程创建与组件配置
- 新建ESP-IDF工程(可基于
ethernet/basic示例修改); - 启用以太网组件:在
menuconfig中配置(idf.py menuconfig):- 进入
Component config → Ethernet → Ethernet type,选择SPI Ethernet; - 选择芯片型号:
SPI Ethernet chip selection → ENC28J60; - 配置SPI引脚:
SPI MOSI GPIO number:23(与硬件连接一致);SPI MISO GPIO number:19;SPI SCK GPIO number:18;SPI CS GPIO number:5;- (可选)
SPI Reset GPIO number:2(若连接了RESET引脚);
- 配置网络参数:
- 选择
Use DHCP(自动获取IP)或手动设置静态IP(Static IP address)。
- 选择
- 进入
三、完整代码实现(以太网初始化+TCP客户端示例)
以下代码实现以太网初始化、获取IP地址,并作为TCP客户端连接目标服务器(如本地电脑的TCP服务器),发送测试数据。
1. 头文件与宏定义
#include <stdio.h>
#include <string.h>
#include "esp_event.h"
#include "esp_log.h"
#include "esp_netif.h"
#include "esp_eth.h"
#include "esp_wifi.h"
#include "nvs_flash.h"
#include "lwip/err.h"
#include "lwip/sockets.h"
#include "lwip/sys.h"
#include <lwip/netdb.h>
// 以太网SPI配置(需与menuconfig一致)
#define ETH_SPI_HOST SPI3_HOST
#define ETH_SPI_CS_PIN 5
#define ETH_SPI_SCK_PIN 18
#define ETH_SPI_MOSI_PIN 23
#define ETH_SPI_MISO_PIN 19
#define ETH_RESET_PIN 2
// TCP服务器配置(替换为实际服务器IP和端口)
#define TCP_SERVER_IP "192.168.1.100" // 目标服务器IP
#define TCP_SERVER_PORT 8080 // 目标服务器端口
#define TCP_SEND_BUF_SIZE 1024 // 发送缓冲区大小
static const char *TAG = "eth_example"

最低0.47元/天 解锁文章
1万+

被折叠的 条评论
为什么被折叠?



