Wie man emac_esp32_init(): reset timeout behebt

Problem

Beim Ausführen deiner ESP32-basierten Ethernet-Anwendung siehst du das folgende Fehlerprotokoll oder einen Absturz:

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

Lösung

Das Problem ist, dass du die Ethernet-MAC mit einem externen RMII-Takteingang (EMAC_CLK_EXT_IN) verwendest, aber kein Takt auf GPIO0 eingegeben wird, was der einzige GPIO ist, der für den RMII-Takteingang auf dem ESP32 verwendet werden kann.

Überprüfe den Takt mit einem Oszilloskop oder Logikanalysator. Wenn du kein Taktsignal auf GPIO0 siehst, musst du eines bereitstellen.

Was genau verursacht den Fehler?

Während emac_esp32_init() wird ESP-IDF die Ethernet-MAC-Peripherie im ESP32 soft-resetten und anschließend auf den Abschluss des Resets warten. Es wird maximal 100 Millisekunden warten. Wenn der Reset nicht innerhalb dieser Zeit abgeschlossen ist, wird der Fehler reset timeout ausgelöst.

Dies ist der relevante Code-Snippet aus dem ESP-IDF-Quellcode:

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");

Ähnliche Beiträge nach Kategorie: ESP32, ESP-IDF, C/C++, Networking