espressif / arduino-esp32

Arduino core for the ESP32
GNU Lesser General Public License v2.1
13.31k stars 7.36k forks source link

ESP32 Gateway & EVB - ETH Disconnect #1912

Closed HarterHorst closed 5 years ago

HarterHorst commented 5 years ago

Hi, i have a problem with Olimex ESP32 EBV and Gateway. Code works, Ethernet connections works but i get a disconnect immediately.

Hardware:

Board: Olimex ESP32 Gateway & EVB Core Installation/update date: latest IDE name: Arduino IDE Flash Frequency: 80Mhz and 40Mhz PSRAM enabled: no Upload Speed: 115200 Computer OS: Windows 10

Description:

ETH Started ETH MAC: 30:AE:A4:1B:C1:FF, IPv4: 192.168.0.90, FULL_DUPLEX, 100Mbps ETH MAC: 30:AE:A4:1B:C1:FF, IPv4: 192.168.0.90, FULL_DUPLEX, 100Mbps ETH Disconnected ETH MAC: 30:AE:A4:1B:C1:FF, IPv4: 192.168.0.90, FULL_DUPLEX, 100Mbps ETH MAC: 30:AE:A4:1B:C1:FF, IPv4: 192.168.0.90, FULL_DUPLEX, 100Mbps ETH Disconnected ETH MAC: 30:AE:A4:1B:C1:FF, IPv4: 192.168.0.90, FULL_DUPLEX, 100Mbps ETH MAC: 30:AE:A4:1B:C1:FF, IPv4: 192.168.0.90, FULL_DUPLEX, 100Mbps ETH Disconnected ETH MAC: 30:AE:A4:1B:C1:FF, IPv4: 192.168.0.90, FULL_DUPLEX, 100Mbps ETH MAC: 30:AE:A4:1B:C1:FF, IPv4: 192.168.0.90, FULL_DUPLEX, 100Mbps ETH Disconnected ETH MAC: 30:AE:A4:1B:C1:FF, IPv4: 192.168.0.90, FULL_DUPLEX, 100Mbps ETH MAC: 30:AE:A4:1B:C1:FF, IPv4: 192.168.0.90, FULL_DUPLEX, 100Mbps ETH Disconnected

Sketch:


/*
    This sketch shows the Ethernet event usage

*/

#include <ETH.h>

static bool eth_connected = false;

void WiFiEvent(WiFiEvent_t event)
{
  switch (event) {
    case SYSTEM_EVENT_ETH_START:
      Serial.println("ETH Started");
      //set eth hostname here
      ETH.setHostname("esp32-ethernet");
      break;
    case SYSTEM_EVENT_ETH_CONNECTED:
      Serial.println("ETH Connected");
      break;
    case SYSTEM_EVENT_ETH_GOT_IP:
      Serial.print("ETH MAC: ");
      Serial.print(ETH.macAddress());
      Serial.print(", IPv4: ");
      Serial.print(ETH.localIP());
      if (ETH.fullDuplex()) {
        Serial.print(", FULL_DUPLEX");
      }
      Serial.print(", ");
      Serial.print(ETH.linkSpeed());
      Serial.println("Mbps");
      eth_connected = true;
      break;
    case SYSTEM_EVENT_ETH_DISCONNECTED:
      Serial.println("ETH Disconnected");
      eth_connected = false;
      break;
    case SYSTEM_EVENT_ETH_STOP:
      Serial.println("ETH Stopped");
      eth_connected = false;
      break;
    default:
      break;
  }
}

void testClient(const char * host, uint16_t port)
{
  Serial.print("\nconnecting to ");
  Serial.println(host);

  WiFiClient client;
  if (!client.connect(host, port)) {
    Serial.println("connection failed");
    return;
  }
  client.printf("GET / HTTP/1.1\r\nHost: %s\r\n\r\n", host);
  while (client.connected() && !client.available());
  while (client.available()) {
    Serial.write(client.read());
  }

  Serial.println("closing connection\n");
  client.stop();
}

void setup()
{
  Serial.begin(115200);
  WiFi.onEvent(WiFiEvent);
  ETH.begin();
  ETH.config(IPAddress(192, 168, 0, 90),IPAddress(192, 168, 0, 1),IPAddress(255, 255, 255, 0));
}

void loop()
{
  if (eth_connected) {
    testClient("google.com", 80);
  }
  delay(10000);
}

I have also tried this one as well.

#include <ETH.h>

/*
  ETH_CLOCK_GPIO0_IN   - default: external clock from crystal oscillator
  ETH_CLOCK_GPIO0_OUT  - 50MHz clock from internal APLL output on GPIO0 - possibly an inverter is needed for LAN8720
  ETH_CLOCK_GPIO16_OUT - 50MHz clock from internal APLL output on GPIO16 - possibly an inverter is needed for LAN8720
  ETH_CLOCK_GPIO17_OUT - 50MHz clock from internal APLL inverted output on GPIO17 - tested with LAN8720
*/
#define ETH_CLK_MODE    ETH_CLOCK_GPIO0_IN
// Pin# of the enable signal for the external crystal oscillator (-1 to disable for internal APLL source)
#define ETH_POWER_PIN   -1
// Type of the Ethernet PHY (LAN8720 or TLK110)
#define ETH_TYPE        ETH_PHY_LAN8720
// I²C-address of Ethernet PHY (0 or 1 for LAN8720, 31 for TLK110)
#define ETH_ADDR        0
// Pin# of the I²C clock signal for the Ethernet PHY
#define ETH_MDC_PIN     23
// Pin# of the I²C IO signal for the Ethernet PHY
#define ETH_MDIO_PIN    18

static bool eth_connected = false;

void setup() {
  Serial.begin(115200);
  delay(2000);
  Serial.println("Waiting for network connection .");
  WiFi.onEvent(WiFiEvent);
  ETH.begin(ETH_ADDR, ETH_POWER_PIN, ETH_MDC_PIN, ETH_MDIO_PIN, ETH_TYPE, ETH_CLK_MODE);
  while (!eth_connected) {
    Serial.print(".");
    delay(1000);
    // add that 10 attemptes should be made.
  }

  Serial.println();
  Serial.print("Linkup:\t\t");
  if ((ETH.linkUp()) == true) {
    Serial.println("Yes");
  }
  else {
    Serial.println("No");
  }
  Serial.print("Linkspeed:\t");
  Serial.println(ETH.linkSpeed());
  Serial.print("Speed:\t\t");
  if ((ETH.fullDuplex()) == true) {
    Serial.println("FullDuplex");
  }
  else {
    Serial.println("No FullDuplex");
  }
  Serial.print("MAC Address:\t");
  Serial.println(ETH.macAddress());
  Serial.print("Hostname:\t");
  Serial.println(ETH.getHostname());
  Serial.print("LocalIP:\t\t");
  Serial.println(ETH.localIP());
  Serial.print("Gateway:\t\t");
  Serial.println(ETH.gatewayIP());
  Serial.print("DNS:\t\t");
  Serial.println(ETH.dnsIP());
}

void WiFiEvent(WiFiEvent_t event) {
  switch (event) {
    case SYSTEM_EVENT_ETH_START:
      Serial.println("ETH Started");
      //set eth hostname here
      ETH.setHostname("esp32-ethernet");
      break;
    case SYSTEM_EVENT_ETH_CONNECTED:
      Serial.println("ETH Connected");
      break;
    case SYSTEM_EVENT_ETH_GOT_IP:
      Serial.print("ETH MAC: ");
      Serial.println(ETH.macAddress());
      Serial.print("IPv4: ");
      Serial.println(ETH.localIP());
      if (ETH.fullDuplex()) {
        Serial.println("FULL_DUPLEX");
      }
      Serial.print(ETH.linkSpeed());
      Serial.println("Mbps");
      eth_connected = true;
      break;
    case SYSTEM_EVENT_ETH_DISCONNECTED:
      Serial.println("ETH Disconnected");
      eth_connected = false;
      break;
    case SYSTEM_EVENT_ETH_STOP:
      Serial.println("ETH Stopped");
      eth_connected = false;
      break;
    default:
      break;
  }
}

void testClient(const char * host, uint16_t port)
{
  Serial.print("\nconnecting to ");
  Serial.println(host);
  WiFiClient espclient;

  // WiFiClient client;
  if (!espclient.connect(host, port)) {
    Serial.println("connection failed");
    return;
  }
  espclient.printf("GET / HTTP/1.1\r\nHost: %s\r\n\r\n", host);
  while (espclient.connected() && !espclient.available());
  while (espclient.available()) {
    Serial.write(espclient.read());
  }

  Serial.println("closing connection\n");
  espclient.stop();
}

void loop () {
  delay(10000);
  if (eth_connected) {
    testClient("google.com", 80);
  }
}
DanKoloff commented 5 years ago

Try to add DNS. Also check the suggestions here: https://github.com/espressif/arduino-esp32/issues/1762#issuecomment-413913021

HarterHorst commented 5 years ago

I am sure that a missing dns is not the reason for the disconnections, but I tried of course. Same error. I get a disconnect immediately after the SYSTEM_EVENT_ETH_GOT_IP.

et.Rչ⸮ 8 2⸮L⸮⸮Ғ2:5SH⸮ ⸮.⸮⸮⸮⸮ (POU⸮⸮9}IESETJI⸮⸮⸮i0x1⸮⸮SPIeMQ}⸮LAS⸮%==Q⸮ co˥⸮ͥ⸮: 0,⸮A%]Ai0xe⸮C⸮,k⸮E⸮⸮⸮0x00,⸮E⸮⸮⸮0x00,⸮E⸮⸮⸮0x00,⸮.⸮⸮⸮⸮:0x⸮⸮hd_⸮⸮⸮0⸮⸮b⸮⸮}drv:⸮⸮0 ⸮[ ⸮⸮DIO, ,덭⸮div:1C!⸮+⸮i0x3⸮⸮⸮⸮⸮len'SH⸮⸮+⸮⸮0x&⸮⸮⸮01c,l⸮K⸮⸮⸮⸮j loX⸮⸮⸮⸮00780⸮,leK⸮⸮⸮⸮j ho tai ⸮⸮⸮⸮om 4C!⸮+⸮i0x4⸮⸮040blen'⸮j entr^⸮⸮⸮00806⸮j Event ID: 20 ETH Started Event ID: 24 ETH MAC: 30:AE:A4:1B:C1:FF, IPv4: 192.168.0.90, FULL_DUPLEX, 100Mbps DNS: 192.168.0.2 Event ID: 24 ETH MAC: 30:AE:A4:1B:C1:FF, IPv4: 192.168.0.90, FULL_DUPLEX, 100Mbps DNS: 192.168.0.2 Event ID: 23 ETH Disconnected Event ID: 24 ETH MAC: 30:AE:A4:1B:C1:FF, IPv4: 192.168.0.90, FULL_DUPLEX, 100Mbps DNS: 192.168.0.2 Event ID: 24 ETH MAC: 30:AE:A4:1B:C1:FF, IPv4: 192.168.0.90, FULL_DUPLEX, 100Mbps DNS: 192.168.0.2 Event ID: 23 ETH Disconnected Event ID: 24 ETH MAC: 30:AE:A4:1B:C1:FF, IPv4: 192.168.0.90, FULL_DUPLEX, 100Mbps DNS: 192.168.0.2 Event ID: 24 ETH MAC: 30:AE:A4:1B:C1:FF, IPv4: 192.168.0.90, FULL_DUPLEX, 100Mbps DNS: 192.168.0.2 Event ID: 23 ETH Disconnected Event ID: 24 ETH MAC: 30:AE:A4:1B:C1:FF, IPv4: 192.168.0.90, FULL_DUPLEX, 100Mbps DNS: 192.168.0.2 Event ID: 24 ETH MAC: 30:AE:A4:1B:C1:FF, IPv4: 192.168.0.90, FULL_DUPLEX, 100Mbps DNS: 192.168.0.2 Event ID: 23 ETH Disconnected ``

/*
    This sketch shows the Ethernet event usage

*/

#include <ETH.h>

static bool eth_connected = false;

void WiFiEvent(WiFiEvent_t event)
{
  Serial.print ("Event ID: \t");
  Serial.print (event);
  Serial.print ("\t");
  switch (event) {
    case SYSTEM_EVENT_ETH_START:
      Serial.println("ETH Started");
      //set eth hostname here
      ETH.setHostname("esp32-ethernet");
      break;
    case SYSTEM_EVENT_ETH_CONNECTED:
      Serial.println("ETH Connected");
      break;
    case SYSTEM_EVENT_ETH_GOT_IP:
      Serial.print("ETH MAC: ");
      Serial.print(ETH.macAddress());
      Serial.print(", IPv4: ");
      Serial.print(ETH.localIP());
      if (ETH.fullDuplex()) {
        Serial.print(", FULL_DUPLEX");
      }
      Serial.print(", ");
      Serial.print(ETH.linkSpeed());
      Serial.println("Mbps");
      Serial.print("DNS:\t\t");
      Serial.println(ETH.dnsIP());
      eth_connected = true;
      break;
    case SYSTEM_EVENT_ETH_DISCONNECTED:
      Serial.println("ETH Disconnected");
      eth_connected = false;
      break;
    case SYSTEM_EVENT_ETH_STOP:
      Serial.println("ETH Stopped");
      eth_connected = false;
      break;
    default:
      break;
  }
}

void testClient(const char * host, uint16_t port)
{
  Serial.print("\nconnecting to ");
  Serial.println(host);

  WiFiClient client;
  if (!client.connect(host, port)) {
    Serial.println("connection failed");
    return;
  }
  client.printf("GET / HTTP/1.1\r\nHost: %s\r\n\r\n", host);
  while (client.connected() && !client.available());
  while (client.available()) {
    Serial.write(client.read());
  }

  Serial.println("closing connection\n");
  client.stop();
}

void setup()
{
  Serial.begin(115200);
  WiFi.onEvent(WiFiEvent);
  ETH.begin();
  ETH.config(IPAddress(192, 168, 0, 90), IPAddress(192, 168, 0, 1), IPAddress(255, 255, 255, 0), IPAddress(192, 168, 0, 2), IPAddress(192, 168, 0, 1));
}

void loop()
{
  if (eth_connected) {
    testClient("google.com", 80);
  }
  delay(10000);
}
DanKoloff commented 5 years ago

What happens if you use the default example and DHCP instead of configuring it manually with ETH.config?

HarterHorst commented 5 years ago

With default example you probably mean this: https://github.com/espressif/arduino-esp32/blob/master/libraries/WiFi/examples/ETH_LAN8720/ETH_LAN8720.ino

I put it on but no changes. see below. I already changed the cable and next I will try another switch. Maybe there is an issue with link auto detection, because it's a 1GBit/s switch. Gonna dig through the basement to get a 100MBit/s switch.

I am not familiar with the librarie ETH.h uses or which library is responsible to detect connect/disconnect. Can the Wifi lib deliver more details?

clkE⸮⸮⸮0x0b⸮}⸮⸮⸮⸮0x00,d_dr⸮⸮⸮⸮0,c.z⸮⸮⸮⸮0⸮0,hd_d.⸮⸮⸮⸮0,}⸮⸮⸮⸮0⸮⸮
mode'T⸮ clk⸮⸮div:LC!녑⸮0x3fff00Lblen:4⸮!⸮+⸮⸮0x&⸮⸮⸮⸮⸮len:132SH⸮녑⸮0x400780⸮blen:77⸮
ho 0⸮⸮⸮⸮⸮12⸮⸮⸮⸮⸮4
!⸮+⸮⸮0x⸮80400⸮⸮⸮⸮6448C⸮⸮⸮⸮⸮0x400806Yj
ETH Started
ETH Connected
ETH Disconnected
ETH Connected
ETH Disconnected
ETH Connected
ETH Disconnected
ETH Connected
ETH Disconnected
ETH Connected
ETH Disconnected
ETH Connected
ETH Disconnected
ETH Connected
ETH Disconnected
ETH Connected
ETH Disconnected
ETH Connected
ETH Disconnected
ETH Connected
ETH Disconnected
DanKoloff commented 5 years ago

Hmm I used the exact same code as you linked. Also compared the ETH.h file and they are the same. However, ETH.h has other includes inside (like WiFi.h and inside WiFi.h there are 12 more includes) and maybe some of these are outdated at your side. Have you updated the Arduino IDE and the ESP32 package recently? If not, try to update them.

Of course, it can be something related to the the network equipment or settings as you mentioned.

This is the result I get (picture and text):

https://imgur.com/a/pMxsx7M

ets Jun  8 2016 00:22:57

rst:0x1 (POWERON_RESET),boot:0x1b (SPI_FAST_FLASH_BOOT)
ets Jun  8 2016 00:22:57

rst:0x10 (RTCWDT_RTC_RESET),boot:0x1b (SPI_FAST_FLASH_BOOT)
configsip: 0, SPIWP:0xee
clk_drv:0x00,q_drv:0x00,d_drv:0x00,cs0_drv:0x00,hd_drv:0x00,wp_drv:0x00
mode:DIO, clock div:1
load:0x3fff0018,len:4
load:0x3fff001c,len:808
load:0x40078000,len:6084
load:0x40080000,len:6696
entry 0x400802e4
ETH Started
ETH Connected
ETH MAC: 24:0A:C4:04:73:07, IPv4: 192.168.0.183, FULL_DUPLEX, 100Mbps

connecting to google.com
HTTP/1.0 301 Moved Permanently
Location: http://www.google.com/
Content-Type: text/html; charset=UTF-8
Date: Tue, 02 Oct 2018 10:01:16 GMT
Expires: Thu, 01 Nov 2018 10:01:16 GMT
Cache-Control: public, max-age=2592000
Server: gws
Content-Length: 219
X-XSS-Protection: 1; mode=block
X-Frame-Options: SAMEORIGIN
Age: 175
X-Cache: HIT from unconfigured
Via: 1.0 unconfigured:3128 (squid/2.6.STABLE1)
Proxy-Connection: close

<HTML><HEAD><meta http-equiv="content-type" content="text/html;charset=utf-8">
<TITLE>301 Moved</TITLE></HEAD><BODY>
<H1>301 Moved</H1>
The document has moved
<A HREF="http://www.google.com/">here</A>.
</BODY></HTML>
closing connection
HarterHorst commented 5 years ago

I can make it work and i can reproduce the error.

  1. Upload script via USB (USB power Hub) - "Hard resetting via RTS pin..."
  2. Open Serial Monitor. -> Not working - "ETH connected ... ETH disconnected".
  3. Reset with button on PCB -> Not working - "ETH connected ... ETH disconnected".
  4. unplug the usb cable. wait a few seconds and plug cable back in.
  5. It Works!

The power off makes it work.

We can close this one here, because it's hardware related.

I think the LAN8710 is not fully resetted. The LAN8710 has a NRST on Pin 19. From the schema I can see that it is not connected to the reset switch on the board, right?

So when the script is in the loop of "ETH connected ... ETH disconnected" and i short the two pads on the board (PHY_RST1) it starts working. Board get ip adresse from dhcp and all is fine.

I think there is an issue with the reset of the LAN8710 and when i totally unpower the board both ICs (ESP and 8710) are resetted.

josepchetrit commented 3 years ago

@HarterHorst

Hi Harter,

I am trying your solution but I have a problem. When I unplug the USB cable and plug the cable back in, the serial on the monitor freezes and to see the monitor again I need to reload the script.

Thanks for your help