Comment corriger emac_esp32_init(): reset timeout
Problème
Lors de l’exécution de votre application Ethernet basée sur l’ESP32, vous voyez le journal d’erreur suivant ou un crash :
E (443) esp.emac: emac_esp32_init(428): reset timeout
E (443) esp_eth: esp_eth_driver_install(228): init mac failedSolution
Le problème est que vous utilisez le MAC Ethernet avec une entrée d’horloge RMII externe (EMAC_CLK_EXT_IN), mais aucune horloge n’est fournie sur GPIO0, qui est le seul GPIO qui peut être utilisé pour l’entrée d’horloge RMII sur l’ESP32.
Vérifiez l’horloge avec un oscilloscope ou un analyseur logique. Si vous ne voyez pas de signal d’horloge sur GPIO0, vous devez en fournir un.
Qu’est-ce qui cause exactement l’erreur ?
Pendant emac_esp32_init(), ESP-IDF va faire un soft-reset du périphérique MAC Ethernet dans l’ESP32 et ensuite attendre que le reset se termine. Il attendra pendant un maximum de 100 millisecondes. Si le reset ne se termine pas dans ce délai, l’erreur reset timeout est levée.
Ceci est l’extrait de code pertinent du code source ESP-IDF :
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");