ESP32 使用LAN8720以太网模块

凌顺实验室(lingshunlab.com)在本文主要分享ESP32如何使用LAN8720以太坊网络模块。

实验效果

ESP32使用LAN8720实现网线连接路由器并且显示IP地址

WX20231014-1323162xxx

元件说明

  • 高性能 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发送数据也可以在串口中查看到接收到的数据。