Перейти к содержанию

Почему LAN8720 не работает с ESP32?

Обновлено Редакция GAW

ESP32 и LAN8720A соединяются по интерфейсу RMII, и всё в нём привязано к одному такту — 50 МГц REF_CLK. ESP-IDF поддерживает у ESP32 только RMII и описывает три способа получить этот такт; почти все проблемы с модулями LAN8720 — из-за него и из-за адреса PHY.

СимптомПричинаЧто сделать
ESP32 после включения не запускает программу, а ждёт прошивкугенератор 50 МГц подаёт такт на GPIO0 во время стартавключать генератор от вывода ESP32 после загрузки; сброс PHY помогает, только если такт делает сам PHY
Драйвер не находит PHYphy_addr в программе не совпадает с перемычкой PHYAD00 или 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, который сам выдаёт такт.

Источники

  1. 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 для автоопределения
  2. 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
  3. 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)

Нашли ошибку?