ESP32 使用LAN8720以太网模块
目录
凌顺实验室(lingshunlab.com)在本文主要分享ESP32如何使用LAN8720以太坊网络模块。
实验效果
ESP32使用LAN8720实现网线连接路由器并且显示IP地址
元件说明
- 高性能 10/100 以太网物理层收发器 (PHY)
- 支持单 3.3V 电源
- 支持减少引脚数的 RMII 接口
- 支持 HP Auto-MDIX
- 板载芯片封装:24 引脚 QFN (4x4 mm) 无铅 RoHS 合规封装
- 灵活的电源管理架构
- 集成 1.2V 稳压器
- I/O电压范围:+1.6V至+3.6V
引脚说明
- TX1 - 发送数据引脚1,用于发送数据的高字节。
- TX0 - 发送数据引脚0,用于发送数据的低字节。
- TX_EN - 发送使能引脚,用于控制发送数据的使能。
- RX0 - 接收数据引脚0,用于接收数据的低字节。
- RX1 - 接收数据引脚1,用于接收数据的高字节。
- RETCLK - 参考时钟输出引脚,可用于提供外部参考时钟。
- CRS - 载波侦听引脚,用于指示是否检测到网络上的载波。
- MDIO - MII接口数据输入/输出引脚,用于读写PHY寄存器。
- MDC - MII接口时钟引脚,用于同步数据传输。
- GND - 供电引脚,接地
- VCC - 供电引脚,连接到3.3V的电源。
BOM表
- ESP32 x1
- LAN8720 x1
- 杜邦线(跳线) x若干
接线图
ESP32 | LAN8720模块 | 功能 | 备注 |
---|---|---|---|
GPIO21 | TX_EN | EMAC_TX_EN | 固定PIN口 |
GPIO19 | TX0 | EMAC_TXD0 | 固定PIN口 |
GPIO22 | TX1 | EMAC_TXD1 | 固定PIN口 |
GPIO25 | RX0 | EMAC_RXD0 | 固定PIN口 |
GPIO26 | RX1 | EMAC_RXD1 | 固定PIN口 |
GPIO27 | CRS | EMAC_RX_DRV | 固定PIN口 |
GPIO23 | MDC | 输出至LAN8720 | 可使用ESP32其他输出脚 |
GPIO18 | MDIO | 双向通讯 | 可使用ESP32其他输出脚 |
程序代码
#include <ETH.h> //引用以使用ETH
#include <WiFiUdp.h>
#define ETH_ADDR 1
#define ETH_POWER_PIN -1
#define ETH_MDC_PIN 23
#define ETH_MDIO_PIN 18
#define ETH_TYPE ETH_PHY_LAN8720
#define ETH_CLK_MODE ETH_CLOCK_GPIO17_OUT
WiFiUDP Udp; //创建UDP对象
unsigned int localUdpPort = 2333; //本地端口号
void setup()
{
Serial.begin(115200);
Serial.println();
ETH.begin(ETH_ADDR, ETH_POWER_PIN, ETH_MDC_PIN, ETH_MDIO_PIN, ETH_TYPE, ETH_CLK_MODE); //启用ETH
while(!((uint32_t)ETH.localIP())) //等待获取到IP
{
}
Serial.println("Connected");
Serial.print("IP Address:");
Serial.println(ETH.localIP());
Udp.begin(localUdpPort); //启用UDP监听以接收数据
}
void loop()
{
int packetSize = Udp.parsePacket(); //获取当前队首数据包长度
if (packetSize) //如果有数据可用
{
char buf[packetSize];
Udp.read(buf, packetSize); //读取当前包数据
Serial.println();
Serial.print("Received: ");
Serial.println(buf);
Serial.print("From IP: ");
Serial.println(Udp.remoteIP());
Serial.print("From Port: ");
Serial.println(Udp.remotePort());
Udp.beginPacket(Udp.remoteIP(), Udp.remotePort()); //准备发送数据
Udp.print("Received: "); //复制数据到发送缓存
Udp.write((const uint8_t*)buf, packetSize); //复制数据到发送缓存
Udp.endPacket(); //发送数据
}
}
代码上传完成后,LAN8720模块用网线接上正使用的路由器,ESP32通过USB接上电脑,打开串口监视器,就可以看到在串口中输出当前获取到的IP地址。
之后,可以使用网络调试助手,对该IP发送数据也可以在串口中查看到接收到的数据。