Jak opravit emac_esp32_init(): reset timeout

Problém

Při běhu vaší ESP32-based Ethernet aplikace vidíte následující error log nebo crash:

esp.emac
E (443) esp.emac: emac_esp32_init(428): reset timeout
E (443) esp_eth: esp_eth_driver_install(228): init mac failed

Řešení

Problém je, že používáte Ethernet MAC s externím RMII clock vstupem (EMAC_CLK_EXT_IN), ale na GPIO0 není vkládán žádný clock, což je jediný GPIO, který lze použít pro RMII clock vstup na ESP32.

Zkontrolujte clock pomocí osciloskopu nebo logického analyzátoru. Pokud nevidíte clock signál na GPIO0, musíte ho poskytnout.

Co přesně způsobuje chybu?

Během emac_esp32_init() ESP-IDF soft-resetuje Ethernet MAC periferii v ESP32 a následně čeká na dokončení resetu. Bude čekat maximálně 100 milisekund. Pokud reset není dokončen within tento čas, je vyvolána chyba reset timeout.

Toto je relevantní úryvek kódu ze zdrojového kódu ESP-IDF:

emac_reset_snippet.c
emac_hal_reset(&emac->hal);
uint32_t to = 0;
for (to = 0; to < emac->sw_reset_timeout_ms / 10; to++) {
    if (emac_hal_is_reset_done(&emac->hal)) {
        break;
    }
    vTaskDelay(pdMS_TO_TICKS(10));
}
ESP_GOTO_ON_FALSE(to < emac->sw_reset_timeout_ms / 10, ESP_ERR_TIMEOUT, err, TAG, "reset timeout");

Podívejte se na podobné články podle kategorie: ESP32 ESP-IDF C/C++ Networking