Почему LAN8720 не работает с ESP32?
Обновлено Редакция GAW
ESP32 и LAN8720A соединяются по интерфейсу RMII, и всё в нём привязано к одному такту — 50 МГц REF_CLK. ESP-IDF поддерживает у ESP32 только RMII и описывает три способа получить этот такт; почти все проблемы с модулями LAN8720 — из-за него и из-за адреса PHY.
| Симптом | Причина | Что сделать |
|---|---|---|
| ESP32 после включения не запускает программу, а ждёт прошивку | генератор 50 МГц подаёт такт на GPIO0 во время старта | включать генератор от вывода ESP32 после загрузки; сброс PHY помогает, только если такт делает сам PHY |
| Драйвер не находит PHY | phy_addr в программе не совпадает с перемычкой PHYAD0 | 0 или 1 по схеме модуля либо −1 для автопоиска |
| Связь есть, кадры теряются | неверный режим REF_CLK, длинный провод такта | EMAC_CLK_EXT_IN для внешнего такта, короткая дорожка |
| Сеть работает без Wi-Fi и сбоит с Wi-Fi | такт REF_CLK выдаёт сам ESP32 | генератор 50 МГц или такт от PHY |
| Ничего не помогает | линии RMII подключены не к тем выводам | TXD0 — GPIO19, TXD1 — GPIO22, TX_EN — GPIO21, RXD0 — GPIO25, RXD1 — GPIO26, CRS_DV — GPIO27 |
Такт на GPIO0
Внешний такт 50 МГц ESP32 может принять только на GPIO0 (режим EMAC_CLK_EXT_IN). Но GPIO0 — вывод выбора режима загрузки: если при включении на нём низкий уровень, ESP32 уходит в режим загрузки по UART и ждёт ручного сброса. Генератор, работающий с момента включения, делает уровень на GPIO0 случайным. Espressif предлагает отключать такт на время старта: разрешать генератор выводом ESP32 уже после загрузки или держать PHY в сбросе — второй способ, по документации ESP-IDF, работает не со всеми микросхемами и годится, только когда такт выдаёт сам PHY. Генератор 50 МГц на модуле сброс PHY не останавливает — нужен вывод разрешения генератора или ключ в его питании.
Есть и обратный вариант — ESP32 сам выдаёт 50 МГц от своей ФАПЧ на GPIO0, GPIO16 или GPIO17 (режим EMAC_CLK_OUT). Он экономит генератор, но конфликтует с I2S, GPIO16 и GPIO17 заняты при PSRAM, а при работе Wi-Fi и Bluetooth такт нестабилен.
Режим самого LAN8720
У LAN8720A вывод nINTSEL выбирает, кто источник такта: по умолчанию он подтянут вверх, и микросхема ждёт 50 МГц на входе XTAL1/CLKIN; при низком уровне она сама делает 50 МГц из кварца 25 МГц, но Microchip предупреждает, что такой такт не соответствует временным требованиям RMII (DS00002165C, разд. 3.7.4). Адрес PHY задаёт вывод RXER/PHYAD0 — 0 или 1, по умолчанию 0 (разд. 3.7.1).
Выводы и периферия ESP32 описаны на странице ESP32, RMII, трансформатор и разъём — в статье «Ethernet для микроконтроллера» и на странице «Распиновка RJ-45». Если с тактом бороться не хочется, есть SPI-вариант — см. ответ «Что выбрать для ESP32: W5500 или LAN8720?».
Похожие вопросы
Можно ли перенести линии RMII на другие выводы ESP32?
Нет: по документации ESP-IDF линии данных RMII закреплены за выводами через IO_MUX — TXD0 на GPIO19, TXD1 на GPIO22, TX_EN на GPIO21, RXD0 на GPIO25, RXD1 на GPIO26, CRS_DV на GPIO27. Свободно переназначаются только линии управления MDC, MDIO и сброс PHY.
Как узнать адрес PHY на готовом модуле LAN8720?
Посмотрите, куда подтянут вывод RXER/PHYAD0: к земле — адрес 0, к питанию — 1. Если схемы нет, задайте в ESP-IDF phy_addr = −1: драйвер сам найдёт PHY на шине SMI и сообщит адрес.
Можно ли тактировать LAN8720 от ESP32 и при этом пользоваться Wi-Fi?
Espressif не рекомендует: при работающих Wi-Fi или Bluetooth такт REF_CLK от ESP32 нестабилен. Вместе с беспроводной связью используйте генератор 50 МГц или PHY, который сам выдаёт такт.
Источники
- Espressif. ESP-IDF Programming Guide v6.1, Ethernet (ESP32) — только RMII; три способа получить REF_CLK; EMAC_CLK_EXT_IN — вход только на GPIO0, это вывод выбора режима загрузки: низкий уровень при включении переводит ESP32 в режим загрузки; обход — отключать REF_CLK при старте (выключить генератор или держать PHY в сбросе, что работает не со всеми PHY); EMAC_CLK_OUT — от APLL, возможен конфликт с I2S, выход на GPIO0 или GPIO16/17 (без PSRAM); не брать ESP32 источником REF_CLK при работе Wi-Fi или Bluetooth; линии данных закреплены за выводами через IO_MUX; phy_addr от 0 до 15 или −1 для автоопределения
- Microchip. LAN8720A/LAN8720Ai Data Sheet, DS00002165C (2024) — разд. 3.7.1 — адрес SMI задаётся выводом RXER/PHYAD0: 0 или 1, по умолчанию 0 (внутренняя подтяжка вниз); разд. 3.7.4 — вывод nINTSEL: по умолчанию подтянут вверх — режим REF_CLK In (50 МГц на XTAL1/CLKIN), при низком уровне — REF_CLK Out от кварца 25 МГц, временные параметры которого не соответствуют RMII
- Espressif. ESP32 Series Datasheet v5.3 — назначение выводов: EMAC_TXD0 — GPIO19, TXD1 — GPIO22, TX_EN — GPIO21, RXD0 — GPIO25, RXD1 — GPIO26, CRS_DV — GPIO27 (табл. 6-3), вход такта — GPIO0, выход такта — GPIO16 (EMAC_CLK_OUT) и GPIO17 (EMAC_CLK_OUT_180); GPIO0 — вывод выбора режима загрузки (разд. 3)
Нашли ошибку?
Смотрите также
- Ethernet для микроконтроллераW5500, ENC28J60, MAC + PHY по RMII, LAN8720, DP83848, трансформатор и разводка
- ESP32: выводы и GPIO34 GPIO: функции, свободные выводы, только входы, флеш-память, strapping, JTAG, токи
- Что выбрать для ESP32: W5500 или LAN8720?LAN8720 — только классический ESP32 и P4; W5500 — любой ESP32
- RJ-45T568A и T568B, Ethernet, PoE, обжим