esp32-ch390-lwip-station.ino
Example of initializing the CH390 Ethernet driver on ESP32 using the native lwIP stack in ESP-IDF.
Requires ESP-IDF v5.x+. The UEXT-CH390 module is connected via SPI (GPIO 18, 19, 23) with Chip Select on GPIO 5. Ensure you include the adapted CH390 driver in your components folder. Build and flash using idf.py build flash.
esp32-ch390-lwip-station.ino
#include "freertos/FreeRTOS.h"
#include "freertos/task.h"
#include "esp_netif.h"
#include "esp_eth.h"
#include "esp_event.h"
#include "esp_log.h"
#include "driver/gpio.h"
#include "driver/spi_master.h"
// Configuration matérielle Olimex UEXT-CH390 sur ESP32
#define PIN_CS GPIO_NUM_5
#define PIN_INT GPIO_NUM_4
#define PIN_RST GPIO_NUM_18
#define SPI_HOST SPI2_HOST
#define SPI_CLK GPIO_NUM_18
#define SPI_MOSI GPIO_NUM_23
#define SPI_MISO GPIO_NUM_19
static const char *TAG = "CH390_ETH";
static void eth_event_handler(void *arg, esp_event_base_t event_base, int32_t event_id, void *event_data) {
if (event_id == ETHERNET_EVENT_CONNECTED) {
ESP_LOGI(TAG, "Ethernet Link Up");
} else if (event_id == ETHERNET_EVENT_DISCONNECTED) {
ESP_LOGI(TAG, "Ethernet Link Down");
}
}
static void ip_event_handler(void *arg, esp_event_base_t event_base, int32_t event_id, void *event_data) {
if (event_id == IP_EVENT_ETH_GOT_IP) {
esp_netif_ip_info_t info;
esp_netif_get_ip_info(esp_netif_get_handle_from_ifkey("ETH"), &info);
ESP_LOGI(TAG, "Got IP: " IPSTR, IP2STR(&info.ip));
}
}
void app_main(void) {
esp_netif_init();
esp_event_loop_create_default();
esp_netif_create_default_ethernet_netif();
esp_eth_config_t config = ETH_DEFAULT_CONFIG();
// Note: Le pilote CH390 spécifique doit être ajouté au projet ESP-IDF
// config.driver = &esp_eth_ch390_driver;
// config.mac_addr = {0x02, 0x11, 0x22, 0x33, 0x44, 0x55}; // MAC usine ou custom
esp_eth_handle_t eth_handle;
ESP_ERROR_CHECK(esp_eth_driver_install(&config, ð_handle));
esp_netif_attach(esp_netif_get_handle_from_ifkey("ETH"), eth_handle);
esp_event_handler_register(ETH_EVENT, ESP_EVENT_ANY_ID, ð_event_handler, NULL);
esp_event_handler_register(IP_EVENT, IP_EVENT_ETH_GOT_IP, &ip_event_handler, NULL);
esp_eth_start(eth_handle);
}