Wie man emac_esp32_init(): reset timeout behebt
Problem
Beim Ausführen Ihrer ESP32-basierten Ethernet-Anwendung sehen Sie das folgende Fehlerprotokoll oder einen Absturz:
E (443) esp.emac: emac_esp32_init(428): reset timeout
E (443) esp_eth: esp_eth_driver_install(228): init mac failedLösung
Das Problem ist, dass Sie die Ethernet-MAC mit einem externen RMII-Takteingang (EMAC_CLK_EXT_IN) verwenden, 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üfen Sie den Takt mit einem Oszilloskop oder Logikanalysator. Wenn Sie kein Taktsignal auf GPIO0 sehen, müssen Sie 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_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");