I'm running into an issue where configuring a static IP for a W5500 SPI ethernet chip does not work, but using DHCP works fine.
To test, I am using a recently generated esp-rs/esp-idf-template project with the code below, adapted from the wifi_static_ip.rs example in this repo.
main.rs
``` rust
use std::net::Ipv4Addr;
use std::str::FromStr;
use esp_idf_hal::gpio::AnyOutputPin;
use esp_idf_hal::peripherals::Peripherals;
use esp_idf_hal::spi;
use esp_idf_hal::spi::config::DriverConfig;
use esp_idf_svc::eth::{BlockingEth, EspEth, EthDriver, SpiEth, SpiEthChipset};
use esp_idf_svc::eventloop::EspSystemEventLoop;
use esp_idf_svc::ipv4::{
ClientConfiguration as IpClientConfiguration, ClientSettings as IpClientSettings,
Configuration as IpConfiguration, Mask, Subnet, DHCPClientSettings
};
use esp_idf_svc::netif::{EspNetif, NetifConfiguration};
// Expects IPv4 address
const DEVICE_IP: Option<&str> = option_env!("DEVICE_IP");
// Expects IPv4 address
const GATEWAY_IP: Option<&str> = option_env!("GATEWAY_IP");
// Expects a number between 0 and 32, defaults to 24
const GATEWAY_NETMASK: Option<&str> = option_env!("GATEWAY_NETMASK");
fn main() -> anyhow::Result<()> {
esp_idf_svc::sys::link_patches();
esp_idf_svc::log::EspLogger::initialize_default();
let peripherals = Peripherals::take()?;
let pins = peripherals.pins;
let sys_loop = EspSystemEventLoop::take()?;
let spi_driver = spi::SpiDriver::new(
peripherals.spi3,
pins.gpio27,
pins.gpio21,
Some(pins.gpio22),
&DriverConfig {
dma: spi::Dma::Auto(4096),
..Default::default()
},
)?;
let mut eth_driver = EthDriver::new_spi(
spi_driver,
pins.gpio23,
Some(pins.gpio26),
None::,
SpiEthChipset::W5500,
esp_idf_hal::units::Hertz(20 * 1000 * 1000),
Some(&[0xDE, 0xAD, 0xBE, 0xEF, 0xFE, 0xED]),
None,
sys_loop.clone(),
)?;
let netmask = GATEWAY_NETMASK.unwrap_or("24");
let netmask = u8::from_str(netmask)?;
let gateway_addr = Ipv4Addr::from_str(GATEWAY_IP.unwrap())?;
let static_ip = Ipv4Addr::from_str(DEVICE_IP.unwrap())?;
log::info!("Using static IP {}", DEVICE_IP.unwrap());
let ip_client_configuration = IpClientConfiguration::Fixed(IpClientSettings {
ip: static_ip,
subnet: Subnet {
gateway: gateway_addr,
mask: Mask(netmask),
},
// Can also be set to Ipv4Addrs if you need DNS
dns: None,
secondary_dns: None,
});
// log::info!("Using DHCP");
// let ip_client_configuration = IpClientConfiguration::DHCP(DHCPClientSettings {
// hostname: Some(
// heapless::String::try_from("croquette")
// .map_err(|_| anyhow!("Could not create static string"))?,
// ),
// });
eth_driver.start()?;
log::info!("EspEth");
let eth = EspEth::wrap_all(
eth_driver,
EspNetif::new_with_conf(&NetifConfiguration {
ip_configuration: IpConfiguration::Client(ip_client_configuration),
..NetifConfiguration::eth_default_client()
})?,
)?;
log::info!("BlockingEth");
let mut eth = BlockingEth::wrap(eth, sys_loop)?;
eth.start()?;
log::info!("Waiting for up...");
eth.wait_netif_up()?;
let ip_info = eth.eth().netif().get_ip_info()?;
log::info!(
"Eth info: {} {} {:?}",
eth.is_started()?,
eth.is_up()?,
ip_info
);
core::mem::forget(eth);
Ok(())
}
```
The application stalls after printing "Waiting for up..." for about ten seconds and then terminates. Here is the output log:
Output log
```
I (31) boot: ESP-IDF v5.1-beta1-378-gea5e0ff298-dirt 2nd stage bootloader
I (31) boot: compile time Jun 7 2023 07:48:23
I (33) boot: Multicore bootloader
I (37) boot: chip revision: v1.1
I (41) boot.esp32: SPI Speed : 40MHz
I (46) boot.esp32: SPI Mode : DIO
I (50) boot.esp32: SPI Flash Size : 4MB
I (55) boot: Enabling RNG early entropy source...
I (60) boot: Partition Table:
I (64) boot: ## Label Usage Type ST Offset Length
I (71) boot: 0 nvs WiFi data 01 02 00009000 00006000
I (78) boot: 1 phy_init RF data 01 01 0000f000 00001000
I (86) boot: 2 factory factory app 00 00 00010000 003f0000
I (93) boot: End of partition table
I (98) esp_image: segment 0: paddr=00010020 vaddr=3f400020 size=2be3ch (179772) map
I (171) esp_image: segment 1: paddr=0003be64 vaddr=3ffb0000 size=0236ch ( 9068) load
I (175) esp_image: segment 2: paddr=0003e1d8 vaddr=40080000 size=01e40h ( 7744) load
I (180) esp_image: segment 3: paddr=00040020 vaddr=400d0020 size=69810h (432144) map
I (341) esp_image: segment 4: paddr=000a9838 vaddr=40081e40 size=0bcb0h ( 48304) load
I (368) boot: Loaded app from partition at offset 0x10000
I (368) boot: Disabling RNG early entropy source...
I (380) cpu_start: Multicore app
I (389) cpu_start: Pro cpu start user code
I (389) cpu_start: cpu freq: 160000000 Hz
I (389) cpu_start: Application information:
I (392) cpu_start: Project name: libespidf
I (397) cpu_start: App version: 1
I (401) cpu_start: Compile time: Sep 23 2024 23:00:51
I (407) cpu_start: ELF file SHA256: 000000000...
I (413) cpu_start: ESP-IDF: v5.2.2
I (418) cpu_start: Min chip rev: v0.0
I (422) cpu_start: Max chip rev: v3.99
I (427) cpu_start: Chip rev: v1.1
I (432) heap_init: Initializing. RAM available for dynamic allocation:
I (439) heap_init: At 3FFAE6E0 len 00001920 (6 KiB): DRAM
I (445) heap_init: At 3FFB36E8 len 0002C918 (178 KiB): DRAM
I (451) heap_init: At 3FFE0440 len 00003AE0 (14 KiB): D/IRAM
I (458) heap_init: At 3FFE4350 len 0001BCB0 (111 KiB): D/IRAM
I (464) heap_init: At 4008DAF0 len 00012510 (73 KiB): IRAM
I (472) spi_flash: detected chip: generic
I (475) spi_flash: flash io: dio
W (479) pcnt(legacy): legacy driver is deprecated, please migrate to `driver/pulse_cnt.h`
W (488) i2c: This driver is an old driver, please migrate your application code to adapt `driver/i2c_master.h`
W (498) timer_group: legacy driver is deprecated, please migrate to `driver/gptimer.h`
I (508) main_task: Started on CPU0
I (518) main_task: Calling app_main()
I (528) esp_idf_svc::eth: Driver initialized
I (528) esp_idf_svc::eth: Attached MAC address: [222, 173, 190, 239, 254, 237]
I (528) esp_idf_svc::eth: Initialization complete
I (528) esp_static_eth: Using static IP 192.168.2.8
I (548) esp_idf_svc::eth: Start requested
I (548) esp_static_eth: EspEth
I (548) esp_idf_svc::eth: Stopping
I (548) esp_idf_svc::eth: Stop requested
I (558) esp_eth.netif.netif_glue: de:ad:be:ef:fe:ed
I (558) esp_eth.netif.netif_glue: ethernet attached to netif
I (568) esp_static_eth: BlockingEth
I (578) esp_idf_svc::eth: Start requested
I (578) esp_static_eth: Waiting for up...
I (15588) esp_idf_svc::eth: Stopping
I (15588) esp_idf_svc::eth: Stop requested
I (15588) esp_idf_svc::eth: EspEth dropped
I (15588) esp_idf_svc::netif: Dropped
I (15588) esp_idf_svc::eth: Stopping
E (15598) esp_eth: esp_eth_stop(310): driver not started yet
I (15598) esp_idf_svc::eth: Stop requested
I (15608) gpio: GPIO[23]| InputEn: 0| OutputEn: 0| OpenDrain: 0| Pullup: 1| Pulldown: 0| Intr:0
I (15618) esp_idf_svc::eth: Driver deinitialized
I (15618) esp_idf_svc::eth: EthDriver dropped
E (15628) spi_master: spi_master_deinit_driver(309): not all CSses freed
I (15638) gpio: GPIO[21]| InputEn: 0| OutputEn: 0| OpenDrain: 0| Pullup: 1| Pulldown: 0| Intr:0
I (15648) gpio: GPIO[22]| InputEn: 0| OutputEn: 0| OpenDrain: 0| Pullup: 1| Pulldown: 0| Intr:0
I (15658) gpio: GPIO[27]| InputEn: 0| OutputEn: 0| OpenDrain: 0| Pullup: 1| Pulldown: 0| Intr:0
```
I have also tested the static_ip example from esp-idf on the same hardware and the module manages to establish a connection without any issues.
Hello,
I'm running into an issue where configuring a static IP for a W5500 SPI ethernet chip does not work, but using DHCP works fine.
To test, I am using a recently generated
esp-rs/esp-idf-template
project with the code below, adapted from the wifi_static_ip.rs example in this repo.main.rs
``` rust use std::net::Ipv4Addr; use std::str::FromStr; use esp_idf_hal::gpio::AnyOutputPin; use esp_idf_hal::peripherals::Peripherals; use esp_idf_hal::spi; use esp_idf_hal::spi::config::DriverConfig; use esp_idf_svc::eth::{BlockingEth, EspEth, EthDriver, SpiEth, SpiEthChipset}; use esp_idf_svc::eventloop::EspSystemEventLoop; use esp_idf_svc::ipv4::{ ClientConfiguration as IpClientConfiguration, ClientSettings as IpClientSettings, Configuration as IpConfiguration, Mask, Subnet, DHCPClientSettings }; use esp_idf_svc::netif::{EspNetif, NetifConfiguration}; // Expects IPv4 address const DEVICE_IP: Option<&str> = option_env!("DEVICE_IP"); // Expects IPv4 address const GATEWAY_IP: Option<&str> = option_env!("GATEWAY_IP"); // Expects a number between 0 and 32, defaults to 24 const GATEWAY_NETMASK: Option<&str> = option_env!("GATEWAY_NETMASK"); fn main() -> anyhow::Result<()> { esp_idf_svc::sys::link_patches(); esp_idf_svc::log::EspLogger::initialize_default(); let peripherals = Peripherals::take()?; let pins = peripherals.pins; let sys_loop = EspSystemEventLoop::take()?; let spi_driver = spi::SpiDriver::new( peripherals.spi3, pins.gpio27, pins.gpio21, Some(pins.gpio22), &DriverConfig { dma: spi::Dma::Auto(4096), ..Default::default() }, )?; let mut eth_driver = EthDriver::new_spi( spi_driver, pins.gpio23, Some(pins.gpio26), None::The application stalls after printing "Waiting for up..." for about ten seconds and then terminates. Here is the output log:
Output log
``` I (31) boot: ESP-IDF v5.1-beta1-378-gea5e0ff298-dirt 2nd stage bootloader I (31) boot: compile time Jun 7 2023 07:48:23 I (33) boot: Multicore bootloader I (37) boot: chip revision: v1.1 I (41) boot.esp32: SPI Speed : 40MHz I (46) boot.esp32: SPI Mode : DIO I (50) boot.esp32: SPI Flash Size : 4MB I (55) boot: Enabling RNG early entropy source... I (60) boot: Partition Table: I (64) boot: ## Label Usage Type ST Offset Length I (71) boot: 0 nvs WiFi data 01 02 00009000 00006000 I (78) boot: 1 phy_init RF data 01 01 0000f000 00001000 I (86) boot: 2 factory factory app 00 00 00010000 003f0000 I (93) boot: End of partition table I (98) esp_image: segment 0: paddr=00010020 vaddr=3f400020 size=2be3ch (179772) map I (171) esp_image: segment 1: paddr=0003be64 vaddr=3ffb0000 size=0236ch ( 9068) load I (175) esp_image: segment 2: paddr=0003e1d8 vaddr=40080000 size=01e40h ( 7744) load I (180) esp_image: segment 3: paddr=00040020 vaddr=400d0020 size=69810h (432144) map I (341) esp_image: segment 4: paddr=000a9838 vaddr=40081e40 size=0bcb0h ( 48304) load I (368) boot: Loaded app from partition at offset 0x10000 I (368) boot: Disabling RNG early entropy source... I (380) cpu_start: Multicore app I (389) cpu_start: Pro cpu start user code I (389) cpu_start: cpu freq: 160000000 Hz I (389) cpu_start: Application information: I (392) cpu_start: Project name: libespidf I (397) cpu_start: App version: 1 I (401) cpu_start: Compile time: Sep 23 2024 23:00:51 I (407) cpu_start: ELF file SHA256: 000000000... I (413) cpu_start: ESP-IDF: v5.2.2 I (418) cpu_start: Min chip rev: v0.0 I (422) cpu_start: Max chip rev: v3.99 I (427) cpu_start: Chip rev: v1.1 I (432) heap_init: Initializing. RAM available for dynamic allocation: I (439) heap_init: At 3FFAE6E0 len 00001920 (6 KiB): DRAM I (445) heap_init: At 3FFB36E8 len 0002C918 (178 KiB): DRAM I (451) heap_init: At 3FFE0440 len 00003AE0 (14 KiB): D/IRAM I (458) heap_init: At 3FFE4350 len 0001BCB0 (111 KiB): D/IRAM I (464) heap_init: At 4008DAF0 len 00012510 (73 KiB): IRAM I (472) spi_flash: detected chip: generic I (475) spi_flash: flash io: dio W (479) pcnt(legacy): legacy driver is deprecated, please migrate to `driver/pulse_cnt.h` W (488) i2c: This driver is an old driver, please migrate your application code to adapt `driver/i2c_master.h` W (498) timer_group: legacy driver is deprecated, please migrate to `driver/gptimer.h` I (508) main_task: Started on CPU0 I (518) main_task: Calling app_main() I (528) esp_idf_svc::eth: Driver initialized I (528) esp_idf_svc::eth: Attached MAC address: [222, 173, 190, 239, 254, 237] I (528) esp_idf_svc::eth: Initialization complete I (528) esp_static_eth: Using static IP 192.168.2.8 I (548) esp_idf_svc::eth: Start requested I (548) esp_static_eth: EspEth I (548) esp_idf_svc::eth: Stopping I (548) esp_idf_svc::eth: Stop requested I (558) esp_eth.netif.netif_glue: de:ad:be:ef:fe:ed I (558) esp_eth.netif.netif_glue: ethernet attached to netif I (568) esp_static_eth: BlockingEth I (578) esp_idf_svc::eth: Start requested I (578) esp_static_eth: Waiting for up... I (15588) esp_idf_svc::eth: Stopping I (15588) esp_idf_svc::eth: Stop requested I (15588) esp_idf_svc::eth: EspEth dropped I (15588) esp_idf_svc::netif: Dropped I (15588) esp_idf_svc::eth: Stopping E (15598) esp_eth: esp_eth_stop(310): driver not started yet I (15598) esp_idf_svc::eth: Stop requested I (15608) gpio: GPIO[23]| InputEn: 0| OutputEn: 0| OpenDrain: 0| Pullup: 1| Pulldown: 0| Intr:0 I (15618) esp_idf_svc::eth: Driver deinitialized I (15618) esp_idf_svc::eth: EthDriver dropped E (15628) spi_master: spi_master_deinit_driver(309): not all CSses freed I (15638) gpio: GPIO[21]| InputEn: 0| OutputEn: 0| OpenDrain: 0| Pullup: 1| Pulldown: 0| Intr:0 I (15648) gpio: GPIO[22]| InputEn: 0| OutputEn: 0| OpenDrain: 0| Pullup: 1| Pulldown: 0| Intr:0 I (15658) gpio: GPIO[27]| InputEn: 0| OutputEn: 0| OpenDrain: 0| Pullup: 1| Pulldown: 0| Intr:0 ```I have also tested the static_ip example from esp-idf on the same hardware and the module manages to establish a connection without any issues.