Problema
Ao executar sua aplicação Ethernet baseada em ESP32, você vê o seguinte log de erro ou crash:
E (443) esp.emac: emac_esp32_init(428): reset timeout
E (443) esp_eth: esp_eth_driver_install(228): init mac failedSolução
O problema é que você está usando o MAC Ethernet com uma entrada de clock RMII externa (EMAC_CLK_EXT_IN), mas nenhum clock está sendo inserido em GPIO0, que é a única GPIO que pode ser usada para a entrada de clock RMII no ESP32.
Verifique o clock usando um osciloscópio ou analisador lógico. Se você não vir um sinal de clock em GPIO0, você precisa fornecer um.
O que exatamente está causando o erro?
Durante emac_esp32_init(), o ESP-IDF fará um soft-reset do periférico Ethernet MAC no ESP32 e subsequentemente aguardará a conclusão do reset. Ele aguardará por no máximo 100 milissegundos. Se o reset não for concluído dentro deste tempo, o erro reset timeout é gerado.
Este é o trecho de código relevante do código-fonte do 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");