Indústrias William
  • 📖Indústrias William DOCS
    • iW - ESPMI
      • Introdução
        • Principais Características
        • 🚀Aplicações
      • Hardware
        • Docs
      • Exemplos
        • LVGL Widgets Example
        • 📊SquareLine Studio
          • Apresentação SquareLine Studio
          • Materiais e Ferramentas
          • Interface exemplo
          • Export Interface
        • 📶LoRa
        • 📡Gateware LoRa
          • Configuração do Rádio LoRa
          • Ethernet
          • MQTT
          • Envio dos Pacotes
          • Código completo
      • ⁉️Perguntas frequentes
    • iW - ST Starter Kit
      • Introdução
        • Get started
      • 🔽Downloads
      • Exemplos
        • GPIO
        • ADC
        • SPI
        • USART
        • PWM
        • RTC
      • Aplicações
        • End-Device-LoRa
        • FATFS
        • Frequencimetro
    • iW - ESPMI-IND
      • Principais Características
      • 🚀Aplicações
      • Exemplos
    • iW - Scott
      • Introdução
      • Principais Características
    • 📞Contatos
    • iW - PMIC
    • iW - LoRaEXplorer
Powered by GitBook
On this page
  1. Indústrias William DOCS
  2. iW - ESPMI
  3. Exemplos
  4. Gateware LoRa

Ethernet

Após a configuração do módulo LoRa, podemos configurar o controlador ethernet ENC28J60. Não vamos entrar em detalhes de como a configuração é feita em baixo nível. Mas a função de inicialização é apresentada abaixo, lembre de configurar no MENU SDK CONFIG no VSCode a frequência do clock SPI e o modo de operação FULL DUPLEX ou HALF DUPLEX.

esp_err_t ESPMI_Eth_Init(spi_host_device_t host){
    ESP_ERROR_CHECK(gpio_install_isr_service(0));
    // Initialize TCP/IP network interface (should be called only once in application)
    ESP_ERROR_CHECK(esp_netif_init());
    // Create default event loop that running in background
    ESP_ERROR_CHECK(esp_event_loop_create_default());
    esp_netif_config_t netif_cfg = ESP_NETIF_DEFAULT_ETH();
    esp_netif_t *eth_netif = esp_netif_new(&netif_cfg);

    spi_bus_config_t buscfg = {
        .miso_io_num = GPIO_NUM_1,
        .mosi_io_num = GPIO_NUM_2,
        .sclk_io_num = GPIO_NUM_43,
        .quadwp_io_num = -1,
        .quadhd_io_num = -1,
    };
    ESP_ERROR_CHECK(spi_bus_initialize(host, &buscfg, SPI_DMA_CH_AUTO));
    /* ENC28J60 ethernet driver is based on spi driver */
    spi_device_interface_config_t spi_devcfg = {
        .mode = 0,
        .clock_speed_hz = CONFIG_ENC28J60_SPI_CLOCK_MHZ * 1000 * 1000,
        .spics_io_num = GPIO_NUM_44,
        .queue_size = 20,
        .cs_ena_posttrans = enc28j60_cal_spi_cs_hold_time(CONFIG_ENC28J60_SPI_CLOCK_MHZ),
    };

    eth_enc28j60_config_t enc28j60_config = ETH_ENC28J60_DEFAULT_CONFIG(host, &spi_devcfg);
    enc28j60_config.int_gpio_num = GPIO_NUM_42;

    eth_mac_config_t mac_config = ETH_MAC_DEFAULT_CONFIG();
    esp_eth_mac_t *mac = esp_eth_mac_new_enc28j60(&enc28j60_config, &mac_config);

    eth_phy_config_t phy_config = ETH_PHY_DEFAULT_CONFIG();
    phy_config.autonego_timeout_ms = 0; // ENC28J60 doesn't support auto-negotiation
    phy_config.reset_gpio_num = -1; // ENC28J60 doesn't have a pin to reset internal PHY
    esp_eth_phy_t *phy = esp_eth_phy_new_enc28j60(&phy_config);

    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));

    /* ENC28J60 doesn't burn any factory MAC address, we need to set it manually.
       02:00:00 is a Locally Administered OUI range so should not be used except when testing on a LAN under your control.
    */
    mac->set_addr(mac, (uint8_t[]) {
        0x02, 0x00, 0x00, 0x12, 0x34, 0x56
    });

    // ENC28J60 Errata #1 check
    if (emac_enc28j60_get_chip_info(mac) < ENC28J60_REV_B5 && CONFIG_ENC28J60_SPI_CLOCK_MHZ < 8) {
        ESP_LOGE(TAG, "SPI frequency must be at least 8 MHz for chip revision less than 5");
        ESP_ERROR_CHECK(ESP_FAIL);
    }

    /* attach Ethernet driver to TCP/IP stack */
    ESP_ERROR_CHECK(esp_netif_attach(eth_netif, esp_eth_new_netif_glue(eth_handle)));
    // Register user defined event handers
    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));

    /* It is recommended to use ENC28J60 in Full Duplex mode since multiple errata exist to the Half Duplex mode */
#if CONFIG_ENC28J60_DUPLEX_FULL
    eth_duplex_t duplex = ETH_DUPLEX_FULL;
    ESP_ERROR_CHECK(esp_eth_ioctl(eth_handle, ETH_CMD_S_DUPLEX_MODE, &duplex));
#endif

    /* start Ethernet driver state machine */
    ESP_ERROR_CHECK(esp_eth_start(eth_handle));

    return ESP_OK;
}

Console Log após conexão

PreviousConfiguração do Rádio LoRaNextMQTT

Last updated 1 year ago

📖
📡