Ethernet link not connecting - (ESP32-POE-ISO-Wrover-EA rev. N1 )

Started by Edac145, Today at 08:47:35 AM

Previous topic - Next topic

Edac145

My Olimex ESP32-POE-ISO-WROVER-EA, hardware revision N1, does not establish an Ethernet link with either my laptop or router. The same cable works between the laptop and router. The board's power LED is on, but its LINK and ACT1 LEDs remain off. ESP32 logs show the LAN8710 PHY responds over MDIO (ID 0007:C0F1), but link stays down (link=0, auto-negotiation incomplete). I also tried with ethernet basic example. it is also not working. I am giving power through mico usb port. Could you advise whether this indicates a board hardware fault and how to proceed?                    i have pasted my log file below                                                              --- 0x40080400: _invalid_pc_placeholder at E:/Program_Files/EspTools/Espressif/frameworks/.espressif/v6.0.2/esp-idf/components/xtensa/xtensa_vectors.S:2259
entry 0x40080644
--- 0x40080644: call_start_cpu0 at E:/Program_Files/EspTools/Espressif/frameworks/.espressif/v6.0.2/esp-idf/components/bootloader/subproject/main/bootloader_start.c:27
I (27) boot: ESP-IDF v6.0.2 2nd stage bootloader
I (27) boot: compile time Oct 29 2026 15:47:41
I (28) boot: Multicore bootloader
I (29) boot: chip revision: v3.0
I (32) boot.esp32: SPI Speed      : 40MHz
I (35) boot.esp32: SPI Mode      : DIO
I (39) boot.esp32: SPI Flash Size : 4MB
I (42) boot: Enabling RNG early entropy source...
I (47) boot: Partition Table:
I (49) boot: ## Label            Usage          Type ST Offset  Length
I (56) boot:  0 nvs              WiFi data        01 02 00009000 00006000
I (62) boot:  1 phy_init        RF data          01 01 0000f000 00001000
I (69) boot:  2 factory          factory app      00 00 00010000 00100000
I (75) boot: End of partition table
I (79) esp_image: segment 0: paddr=00010020 vaddr=3f400020 size=14c14h ( 85012) map
I (116) esp_image: segment 1: paddr=00024c3c vaddr=3ffb0000 size=02cb4h ( 11444) load
I (121) esp_image: segment 2: paddr=000278f8 vaddr=40080000 size=08720h ( 34592) load
I (136) esp_image: segment 3: paddr=00030020 vaddr=400d0020 size=3c9b4h (248244) map
I (224) esp_image: segment 4: paddr=0006c9dc vaddr=40088720 size=03d08h ( 15624) load
I (231) esp_image: segment 5: paddr=000706ec vaddr=50000000 size=00028h (    40) load
I (238) boot: Loaded app from partition at offset 0x10000
I (238) boot: Disabling RNG early entropy source...
I (250) cpu_start: Multicore app
I (258) cpu_start: GPIO 3 and 1 are used as console UART I/O pins
I (258) cpu_start: Pro cpu start user code
I (259) cpu_start: cpu freq: 160000000 Hz
I (260) app_init: Application information:
I (264) app_init: Project name:    01_uart_test
I (269) app_init: App version:      uart-v0.1.0-dirty
I (273) app_init: Compile time:    Oct 29 2026 15:46:55
I (278) app_init: ELF file SHA256:  760071bc4...
I (283) app_init: ESP-IDF:          v6.0.2
I (286) efuse_init: Min chip rev:    v0.0
I (290) efuse_init: Max chip rev:    v3.99
I (294) efuse_init: Chip rev:        v3.0
I (298) heap_init: Initializing. RAM available for dynamic allocation:
I (305) heap_init: At 3FFAE6E0 len 00001920 (6 KiB): DRAM
I (310) heap_init: At 3FFB4188 len 0002BE78 (175 KiB): DRAM
I (315) heap_init: At 3FFE0440 len 00003AE0 (14 KiB): D/IRAM
I (320) heap_init: At 3FFE4350 len 0001BCB0 (111 KiB): D/IRAM
I (326) heap_init: At 4008C428 len 00013BD8 (78 KiB): IRAM
I (332) spi_flash: detected chip: generic
I (335) spi_flash: flash io: dio
I (339) main_task: Started on CPU0
I (339) main_task: Calling app_main()
I (399) esp_eth.netif.netif_glue: 7c:9e:bd:dc:5f:f3
I (399) esp_eth.netif.netif_glue: ethernet attached to netif
Clock GPIO=0
Clock mode=1
Interface=0
I (4499) eth_test: Ethernet started
I (4499) eth_test: PHY ID1=0x0007 ID2=0xc0f1 BMSR=0x7809 (link=0) R31=0x0040
I (4499) eth_test: PHY R0=0x3000 R5=0x0001 R17=0x0002 (energy=1) R18=0x60e0
I (4499) eth_test: Web server started on port 80
I (4509) main_task: Returned from app_main()
I (7499) eth_test: PHY ID1=0x0007 ID2=0xc0f1 BMSR=0x7809 (link=0) R31=0x0040
I (7499) eth_test: PHY R0=0x3000 R5=0x0001 R17=0x0002 (energy=1) R18=0x60e0
I (10499) eth_test: PHY ID1=0x0007 ID2=0xc0f1 BMSR=0x7809 (link=0) R31=0x0040
I (10499) eth_test: PHY R0=0x3000 R5=0x0001 R17=0x0002 (energy=1) R18=0x60e0
I (13499) eth_test: PHY ID1=0x0007 ID2=0xc0f1 BMSR=0x7809 (link=0) R31=0x0040
I (13499) eth_test: PHY R0=0x3000 R5=0x0001 R17=0x0002 (energy=1) R18=0x60e0
I (16499) eth_test: PHY ID1=0x0007 ID2=0xc0f1 BMSR=0x7809 (link=0) R31=0x0040
I (16499) eth_test: PHY R0=0x3000 R5=0x0001 R17=0x0002 (energy=1) R18=0x60e0
I (19499) eth_test: PHY ID1=0x0007 ID2=0xc0f1 BMSR=0x7809 (link=0) R31=0x0040
I (19499) eth_test: PHY R0=0x3000 R5=0x0001 R17=0x0002 (energy=1) R18=0x60e0
I (22499) eth_test: PHY ID1=0x0007 ID2=0xc0f1 BMSR=0x7809 (link=0) R31=0x0040
I (22499) eth_test: PHY R0=0x3000 R5=0x0001 R17=0x0002 (energy=1) R18=0x60e0
I (25499) eth_test: PHY ID1=0x0007 ID2=0xc0f1 BMSR=0x7809 (link=0) R31=0x0040
I (25499) eth_test: PHY R0=0x3000 R5=0x0001 R17=0x0002 (energy=1) R18=0x60e0
I (28499) eth_test: PHY ID1=0x0007 ID2=0xc0f1 BMSR=0x7809 (link=0) R31=0x0040
I (28499) eth_test: PHY R0=0x3000 R5=0x0001 R17=0x0002 (energy=1) R18=0x60e0
I (31499) eth_test: PHY ID1=0x0007 ID2=0xc0f1 BMSR=0x7809 (link=0) R31=0x0040
I (31499) eth_test: PHY R0=0x3000 R5=0x0001 R17=0x0002 (energy=1) R18=0x60e0
I (34499) eth_test: PHY ID1=0x0007 ID2=0xc0f1 BMSR=0x7809 (link=0) R31=0x0040
I (34499) eth_test: PHY R0=0x3000 R5=0x0001 R17=0x0002 (energy=1) R18=0x60e0
I (37499) eth_test: PHY ID1=0x0007 ID2=0xc0f1 BMSR=0x7809 (link=0) R31=0x0040
I (37499) eth_test: PHY R0=0x3000 R5=0x0001 R17=0x0002 (energy=1) R18=0x60e0
I (40499) eth_test: PHY ID1=0x0007 ID2=0xc0f1 BMSR=0x7809 (link=0) R31=0x0040
I (40499) eth_test: PHY R0=0x3000 R5=0x0001 R17=0x0002 (energy=1) R18=0x60e0
I (43499) eth_test: PHY ID1=0x0007 ID2=0xc0f1 BMSR=0x7809 (link=0) R31=0x0040
I (43499) eth_test: PHY R0=0x3000 R5=0x0001 R17=0x0002 (energy=1) R18=0x60e0

LubOlimex

Did you check the user's manual?

Which pin do you use for the Ethernet clock? Is it GPIO0?

MDC – 23
MDIO – 18
PHY reset – 12
PHY RMII clock – 0 (0 is for boards with WROVER module)
Technical support and documentation manager at Olimex

Edac145

Quote from: LubOlimex on Today at 11:40:33 AMDid you check the user's manual?

Which pin do you use for the Ethernet clock? Is it GPIO0?

MDC – 23
MDIO – 18
PHY reset – 12
PHY RMII clock – 0 (0 is for boards with WROVER module)



yes i am using pin 0 for clock
#define ETH_PHY_ADDR        0
#define ETH_MDC_GPIO        23
#define ETH_MDIO_GPIO       18
#define ETH_PHY_PWR_GPIO    12
#define ETH_RMII_CLK_GPIO   0     /* WROVER: 0, WROOM: 17 */                                     

i am pasting my ethernet init code below,
* ---------------- Ethernet init ---------------- */
static void ethernet_init(void)
{
    /* TCP/IP stack + default event loop */
    ESP_ERROR_CHECK(esp_netif_init());
    ESP_ERROR_CHECK(esp_event_loop_create_default());

    esp_netif_config_t netif_cfg = ESP_NETIF_DEFAULT_ETH();
    s_eth_netif = esp_netif_new(&netif_cfg);

    const esp_timer_create_args_t timer_args = {
        .callback = fallback_timer_cb,
        .name = "dhcp_fallback",
    };
    ESP_ERROR_CHECK(esp_timer_create(&timer_args, &s_fallback_timer));

    /* MAC (internal EMAC, RMII) */
    eth_mac_config_t mac_config = ETH_MAC_DEFAULT_CONFIG();
    eth_esp32_emac_config_t emac_config = ETH_ESP32_EMAC_DEFAULT_CONFIG();
    emac_config.interface = EMAC_DATA_INTERFACE_RMII;
    emac_config.smi_gpio.mdc_num  = ETH_MDC_GPIO;
    emac_config.smi_gpio.mdio_num = ETH_MDIO_GPIO;
    /* ESP32 generates the 50 MHz RMII reference clock for the LAN8720A */
    emac_config.clock_config.rmii.clock_mode = EMAC_CLK_OUT;
    emac_config.clock_config.rmii.clock_gpio = ETH_RMII_CLK_GPIO;
    esp_eth_mac_t *mac = esp_eth_mac_new_esp32(&emac_config, &mac_config);

    /* PHY (LAN8720A). GPIO12 powers/resets the PHY: it stays low (PHY off) until the
     * MAC has started the RMII clock, as required by the LAN8720A. */
    eth_phy_config_t phy_config = ETH_PHY_DEFAULT_CONFIG();
    phy_config.phy_addr       = ETH_PHY_ADDR;
    phy_config.reset_gpio_num = ETH_PHY_PWR_GPIO;
    esp_eth_phy_t *phy = esp_eth_phy_new_lan87xx(&phy_config);

    /* Driver install + attach to TCP/IP */
    esp_eth_config_t eth_config = ETH_DEFAULT_CONFIG(mac, phy);
    esp_eth_handle_t eth_handle = NULL;
    ESP_ERROR_CHECK(esp_eth_driver_install(&eth_config, &eth_handle));
    s_eth_handle = eth_handle;
    ESP_ERROR_CHECK(esp_netif_attach(s_eth_netif, esp_eth_new_netif_glue(eth_handle)));

    ESP_ERROR_CHECK(esp_event_handler_register(ETH_EVENT, ESP_EVENT_ANY_ID, &eth_event_handler, NULL));
    ESP_ERROR_CHECK(esp_event_handler_register(IP_EVENT, IP_EVENT_ETH_GOT_IP, &got_ip_event_handler, NULL));

    vTaskDelay(pdMS_TO_TICKS(100));

    printf("Clock GPIO=%d\n", emac_config.clock_config.rmii.clock_gpio);
    printf("Clock mode=%d\n", emac_config.clock_config.rmii.clock_mode);
    printf("Interface=%d\n", emac_config.interface);

    ESP_ERROR_CHECK(esp_eth_start(eth_handle));
    xTaskCreate(phy_diag_task, "phy_diag", 3072, NULL, 3, NULL);
}

void app_main(void)
{
    esp_err_t ret = nvs_flash_init();
    if (ret == ESP_ERR_NVS_NO_FREE_PAGES || ret == ESP_ERR_NVS_NEW_VERSION_FOUND) {
        ESP_ERROR_CHECK(nvs_flash_erase());
        ret = nvs_flash_init();
    }
    ESP_ERROR_CHECK(ret);

    ethernet_init();
    start_webserver();   /* lwIP accepts connections as soon as the interface has an IP */
}

LubOlimex

Are you 100% sure you have ESP32-POE-ISO-Wrover-EA? Can you see what is written on the module itself? It should be "ESP32-WROVER-EA".

I reproduced your initialization approach on an ESP32-POE-ISO-WROVER using ESP-IDF 5.5.5. It links immediately and remains stable, so the code and newer ESP-IDF do not appear to be the general cause.

Please test with my code: https://ftp.olimex.com/TEMP/wrover-esp-idf/ (there is README.md inside the archive with more details). If the problem remains try a short known-good LAN cable, another switch port, and preferably another network and computer, then compare the PHY registers and 50 MHz RMII clock. Let me know how it goes.
Technical support and documentation manager at Olimex