ESP32 EMAC receive not working
Posted: Fri Apr 19, 2024 8:42 pm
I'm trying to use the ESP32 Ethernet MAC receive function, but it always sets the buffer length to zero, and doesn't copy any data. I assume I'm using it incorrectly. Is there some documentation on how to use is it?
- #include <inttypes.h>
- #include "esp_event.h"
- #include "esp_log.h"
- #include "esp_eth.h"
- static const char *TAG = "ethtest";
- /** Event handler for Ethernet events */
- static void eth_event_handler(void *arg, esp_event_base_t event_base,
- int32_t event_id, void *event_data)
- {
- uint8_t mac_addr[6] = {0};
- /* we can get the ethernet driver handle from event data */
- esp_eth_handle_t eth_handle = *(esp_eth_handle_t *)event_data;
- switch (event_id) {
- case ETHERNET_EVENT_CONNECTED:
- esp_eth_ioctl(eth_handle, ETH_CMD_G_MAC_ADDR, mac_addr);
- ESP_LOGI(TAG, "Ethernet Link Up");
- ESP_LOGI(TAG, "Ethernet HW Addr %02x:%02x:%02x:%02x:%02x:%02x",
- mac_addr[0], mac_addr[1], mac_addr[2], mac_addr[3], mac_addr[4], mac_addr[5]);
- break;
- case ETHERNET_EVENT_DISCONNECTED:
- ESP_LOGI(TAG, "Ethernet Link Down");
- break;
- case ETHERNET_EVENT_START:
- ESP_LOGI(TAG, "Ethernet Started");
- break;
- case ETHERNET_EVENT_STOP:
- ESP_LOGI(TAG, "Ethernet Stopped");
- break;
- default:
- break;
- }
- }
- void app_main(void)
- {
- printf("Hello world!\n");
- eth_mac_config_t mac_config = ETH_MAC_DEFAULT_CONFIG();
- eth_esp32_emac_config_t esp32_emac_config = ETH_ESP32_EMAC_DEFAULT_CONFIG();
- esp32_emac_config.smi_mdc_gpio_num = 23;
- esp32_emac_config.smi_mdio_gpio_num = 18;
- esp32_emac_config.interface = EMAC_DATA_INTERFACE_RMII;
- esp32_emac_config.clock_config.rmii.clock_mode = EMAC_CLK_EXT_IN;
- esp32_emac_config.clock_config.rmii.clock_gpio = 0;
- esp_eth_mac_t *mac = esp_eth_mac_new_esp32(&esp32_emac_config, &mac_config);
- eth_phy_config_t phy_config = ETH_PHY_DEFAULT_CONFIG();
- phy_config.phy_addr = 1;
- phy_config.reset_gpio_num = 16;
- esp_eth_phy_t *phy = esp_eth_phy_new_lan87xx(&phy_config);
- esp_eth_config_t config = ETH_DEFAULT_CONFIG(mac, phy);
- esp_eth_handle_t eth_handle = NULL;
- esp_eth_driver_install(&config, ð_handle);
- esp_event_loop_create_default();
- esp_event_handler_register(ETH_EVENT, ESP_EVENT_ANY_ID, ð_event_handler, NULL);
- esp_eth_start(eth_handle);
- while (1) {
- uint32_t len = 1522;
- uint8_t *buf = malloc(len);
- if (!buf) {
- ESP_LOGE(TAG, "buf allocation failed!");
- esp_restart();
- }
- int ret = (*mac).receive(mac, buf, &len);
- ESP_LOGW(TAG, "receive status: %d", ret);
- ESP_LOGW(TAG, "buf len after allocation: %ld", len);
- free(buf);
- }
- }
W (3739) ethtest: receive status: 0
W (3739) ethtest: buf len after allocation: 0