低成本以太网,wifi,蓝牙三合一模块方案。不到30元。前后花了两个月的时间,解决了各种问题导致的不断重启,以太网获取不到IP,上电之后esp32 不启动。不要改动物料的型号,和参数。否则可能导致,各种问题。最新开始在立创上面买了lan8720的方案板,和一块莫宝买的esp32开发板后来自己画板多次验证,最终稳定

原理图

引脚接线配置

以下2个引脚可以根据自己的硬件,任意选择,默认配置如下:

ESP32配置

在idf终端中,把目录地址切换到工程下,再使用指令:idf.py menuconfig就可以打开菜单界面,选择 Component config->Ethernet->

选择support ESP32 internal EMAC controller

RMII 时钟选择输入模式

根据原理图配置引脚

Component config->Example Configuration

模块选择LAN8720。 2个SMI引脚我并为改动,使用默认,复位引脚没用到,硬件自动复位。而最后一个是PHY芯片地址设置因为接了下拉电阻所以选0

程序烧录后,打开串口监控日志

Idf.py flash monitor

出现Ethernet Got Ip Address,打印出ip地址,证明连接以太网成功

Esp32 不停重启报错 打印以下信息

lan8720_pwrctl: power up timeout

power control failed

init phy failed

原因:lan8720复位引脚,phy引脚的地址没配置对 ,esp32的RMII clock GPIO设置错误,晶振虚焊。

晶振虚焊用示波器检查,晶振的输出脚是否有50M输出。

RMII参考时钟50M问题

仔细阅读esp32参考手册和lan8720数据手册,RMII参考时钟必须是50M,有3种方式提供RMII参考时钟。

1 esp32内部输出50M的时钟给lan8720.(有时会不稳定获取不到IP,官网推荐使用外部晶振)

2 lan8720 接25M无源晶振,或者25M有源晶振内部倍频产生50M时钟输出给esp32。

3用有源50M晶振同时给lan8720和esp32 提供时钟。

由于采用50M时钟提供给ESP32,只能用GPIO0作为输入端。这样就会有个问题,影响esp32的上电启动。因为esp32上电要读GPIO0的电平状态。看了官方的资料,想了很久。

最后:在50M晶振的GND脚加了mos管防止esp32上电启动失败,软件延时500ms启动后再用esp32 GPIO2打开mos管提供50M晶振。经过验证运行比较稳定。

void gpio_init(){gpio_config_t io_conf = {};//disable interruptio_conf.intr_type = GPIO_INTR_DISABLE;//set as output modeio_conf.mode = GPIO_MODE_OUTPUT;//bit mask of the pins that you want to set,e.g.GPIO18/19io_conf.pin_bit_mask = GPIO_OUT_REL_CLK |GPIO_OUT_NET_STATUS;//disable pull-down mode io_conf.pull_down_en = 0;//disable pull-up modeio_conf.pull_up_en = 0;//configure GPIO with the given settingsgpio_config(&io_conf);gpio_set_level(2, 0);vTaskDelay(500 / portTICK_RATE_MS);gpio_set_level(2, 1)}

看官网的重点:

参考:以太网 – ESP32 – — ESP-IDF 编程指南 latest 文档 (espressif.com)