Подключение ethernet LAN8720 и ESP32 Devkit C , ESP32 Devkit V1

slider
Offline
Зарегистрирован: 17.06.2014

Модуль значительно дешевле чем W5500 , но могут быть проблемы по подключению. 
Потратил много времени на разбирательство почему схема из инета не заработала, поэтому сохраню опыт здесь.   В инете попадались безответные вопросы почему эта схема тоже у некоторых не работала, пришлось разбираться самому.

В инете в основном схемы подключения к модулю именно ESP32 Devkit C , а он является расширенной версией ESP32 Devkit V1 . В нем дополнительно выведены 7 пинов , которые для обычного юзера не желательны, а то закоматозят ESP32.
- один это GPIO0 , если на нем окажется лог.0 (или даже лог1 от внешней 1.8в логики , или сама эта логика будет висеть на нем) , то при старте ESP32 , он расценит как вход в программирование, и стартовать программу он не будет.  На модуле GPIO0 соединен к кнопке FLASH ( BOOT ) , и притянут резистором 4.7к...10к   к +3.3в .  Иногда на модуле кнопка идет через резистор 470ом , что  может быть слишком много чтобы модуль реагировал на нее будучи подключенный еще к чему либо. Как и кнопка Reset.
- 6 выводов по которым ESP32 загружается из своей микросхемы памяти. И тут косяк был что китайцы подписали один пин - "GND" вместо CMD .   + обычный косяк маленький 0.1мкф кондер или его отсутствие параллельно кнопке Reset  , а должен быть 1мкф , из-за этого приходилось  для загрузки скетча жманькать кнопку FLASH ( BOOT ) . 
     Использование Devkit C выбрано из-за возможности тактирования (синхронизации) 50МГЦ от LAN8720  в сторону ESP32 , благодаря аппаратным возможностям GPIO0 . Но это можно обойти настройками в скетче , м.б. не в угоду стабильности ethernet в связке с модулем Devkit V1.

Собирал "на коленке" по распространенному рисунку проводков в инете (сверяя потом со схемой)


Один резистор  4.7к между GND и NC (никуда не подключенный пин , резерв) , с проводком на пин Enable активного кварца.  Он выключает кварц на время старта программы , потом программа по GPIO17 подает через этот NC пин , лог1 , и она запускает кварц  выводя его его из Z-состояния .  Иначе при подаче питания, выход кварца по пину nINT/RETCLK долбанет в  GPIO0 , и ESP32 откажется стартовать.
 Второй резистор и так есть на модуле ESP32 (он притягивает GPIO0  BOOT к +3.3в), его не ставил.

Скетч стандартный    \WiFi\examples\ETH_LAN8720_internal_clock   из набора  ESP32 Arduino , появляется после выбора платы ESP32 
//  в моем случае самая первая в списке - ESP32 Dev Module  , т.к. она позволят потом во вкладке "инструменты"  выбрать перепаянный флэш с 32Мбит (4МБайт) на 128Мбит (16МБайт)  . микрухи в чипдипе GD25Q127csigr ,  GD25Q127cyigr , W25Q128jveiq , ...   
Скетч получает динамический IP от вашего роутера по LAN , связывается с гуглом , получает от него дату время. Весь процесс выводит в монитор порта.

В скетче надо выставить правильно пины:

#include <ETH.h>

/*  куда выдавать синус 50МГц для модуля интернет
   * ETH_CLOCK_GPIO0_IN   - default: external clock from crystal oscillator                                              
   * ETH_CLOCK_GPIO0_OUT  - 50MHz clock from internal APLL output on GPIO0 - possibly an inverter is needed for LAN8720  
   * ETH_CLOCK_GPIO16_OUT - 50MHz clock from internal APLL output on GPIO16 - possibly an inverter is needed for LAN8720 
   * ETH_CLOCK_GPIO17_OUT - 50MHz clock from internal APLL inverted output on GPIO17 - tested with LAN8720               
*/

#define ETH_CLK_MODE    ETH_CLOCK_GPIO0_IN

// Pin# of the enable signal for the external crystal oscillator (-1 to disable for internal APLL source)
#define ETH_POWER_PIN  17  // -1 

// Type of the Ethernet PHY (LAN8720 or TLK110)
#define ETH_TYPE        ETH_PHY_LAN8720

// I²C-address of Ethernet PHY (0 or 1 for LAN8720, 31 for TLK110)
#define ETH_ADDR 1 //  0- не работает  E (1034) emac: Timed out waiting for PHY register 0x2 to have value 0x0007(mask 0xffff). Current value 0xffff

// Pin# of the I²C clock signal for the Ethernet PHY
#define ETH_MDC_PIN     23 // 15

// Pin# of the I²C IO signal for the Ethernet PHY
#define ETH_MDIO_PIN    18 // 2

И существует еще второй тип рабочего подключения , когда тактирование происходит от ESP32 к LAN8720 . на счет его действия на загрузку и стабильность процессора не знаю. 
здесь несколько вариаций:

1. тактирование от GPIO0 .
в скетче надо на GPIO0 наоборот выдать 50МГц , а не принимать . и управление кварцем не понадобится , 

#define ETH_CLK_MODE    ETH_CLOCK_GPIO0_OUT

// Pin# of the enable signal for the external crystal oscillator (-1 to disable for internal APLL source)
#define ETH_POWER_PIN  -1 // 17 -1 

провод от GPIO17 надо отключить,  высвобождается этот пин. 
Получается можно обойтись без резисторов , закоротив на LAN8720 пин Enable у кварца на рядом GND . пин NC не используется. 

2. тактирование от GPIO17 . 
этот вариант подойдет если у вас только ESP32 Devkit V1 , а кидать проводок на модуль на GPIO0 для реализации первого варианта как-то некрасиво. 
в скетче указываем тактирование от GPIO17

#define ETH_CLK_MODE    ETH_CLOCK_GPIO17_OUT

// Pin# of the enable signal for the external crystal oscillator (-1 to disable for internal APLL source)
#define ETH_POWER_PIN  -1 // 17 -1 

аппаратно, также как и выше, кварц должен быть выключен , пин nINT/RETCLK должен быть подключен к GPIO17 , а не к GPIO0 .  пин NC не используется. Судя по коменту в скетче , этот вариант тестирован норм.
 

// еще заметил , редко модуль LAN8720 может зависнуть , так что при удаленном объекте , то хорошо бы передергивать ему питание свободным пином ESP32 . Ток потребления  LAN8720 в работе до 90ма , что гораздо меньше W5500.  Стаб ESP32 на модуле, его запросто вывозит. Возможно ток еще немного зависит от длины провода до роутера/коммутатора . 

workpage
Offline
Зарегистрирован: 17.05.2020

Завёл dev v1 + 8720 с тактированием от 17 пина. Подтверждаю. Работает. Это наверное самый лучший вариант подключения. Нет плясок с бубном вокруг gpio0. Огромным плюсом данного подключения является тот факт, что весь софт написанный под wifi работает на ethernet практические без переделок. По этой причине пришлось "зарубить" готовую плату на w5500 и переделывать всё на 8720.

Igor Igor
Offline
Зарегистрирован: 27.06.2020

У меня плата LOLIN32 Lite. В ней отсутсвует GPIO21!

Можно ли переопределить сигнал EMAC_TX_EN на другой GPIO?

Я где-то читал что в ESP32 можно переопределить любые GPIO.

workpage
Offline
Зарегистрирован: 17.05.2020

slider, Подскажи. Как ты детектишь, что 8720 завис?

Я столкнулся с тем, что иногда при старте индикатор активности постоянно моргает и связи нет. Отключение/подключение кабеля видит. Reset решает.

Update

Нашёл причину плохого старта. Резистор R1 на 12.1к должен ТОЧНО соответствовать номиналу. В противном случае будут глюки. Вопрос с детектом перезагрузки остался.