Skip to content

Commit e2487b1

Browse files
authored
[ETH] Implement SPI support, multiple interfaces and more (espressif#8712)
1 parent 93a4501 commit e2487b1

File tree

10 files changed

+1154
-511
lines changed

10 files changed

+1154
-511
lines changed

Diff for: libraries/Ethernet/examples/ETH_LAN8720/ETH_LAN8720.ino

+17-12
Original file line numberDiff line numberDiff line change
@@ -3,11 +3,20 @@
33
44
*/
55

6+
// Important to be defined BEFORE including ETH.h for ETH.begin() to work.
7+
// Example RMII LAN8720 (Olimex, etc.)
8+
#define ETH_PHY_TYPE ETH_PHY_LAN8720
9+
#define ETH_PHY_ADDR 0
10+
#define ETH_PHY_MDC 23
11+
#define ETH_PHY_MDIO 18
12+
#define ETH_PHY_POWER -1
13+
#define ETH_CLK_MODE ETH_CLOCK_GPIO0_IN
14+
615
#include <ETH.h>
716

817
static bool eth_connected = false;
918

10-
void WiFiEvent(WiFiEvent_t event)
19+
void onEvent(arduino_event_id_t event, arduino_event_info_t info)
1120
{
1221
switch (event) {
1322
case ARDUINO_EVENT_ETH_START:
@@ -19,18 +28,14 @@ void WiFiEvent(WiFiEvent_t event)
1928
Serial.println("ETH Connected");
2029
break;
2130
case ARDUINO_EVENT_ETH_GOT_IP:
22-
Serial.print("ETH MAC: ");
23-
Serial.print(ETH.macAddress());
24-
Serial.print(", IPv4: ");
25-
Serial.print(ETH.localIP());
26-
if (ETH.fullDuplex()) {
27-
Serial.print(", FULL_DUPLEX");
28-
}
29-
Serial.print(", ");
30-
Serial.print(ETH.linkSpeed());
31-
Serial.println("Mbps");
31+
Serial.println("ETH Got IP");
32+
ETH.printInfo(Serial);
3233
eth_connected = true;
3334
break;
35+
case ARDUINO_EVENT_ETH_LOST_IP:
36+
Serial.println("ETH Lost IP");
37+
eth_connected = false;
38+
break;
3439
case ARDUINO_EVENT_ETH_DISCONNECTED:
3540
Serial.println("ETH Disconnected");
3641
eth_connected = false;
@@ -67,7 +72,7 @@ void testClient(const char * host, uint16_t port)
6772
void setup()
6873
{
6974
Serial.begin(115200);
70-
WiFi.onEvent(WiFiEvent);
75+
WiFi.onEvent(onEvent);
7176
ETH.begin();
7277
}
7378

Diff for: libraries/Ethernet/examples/ETH_TLK110/ETH_TLK110.ino

+12-15
Original file line numberDiff line numberDiff line change
@@ -5,15 +5,16 @@
55

66
#include <ETH.h>
77

8+
#define ETH_TYPE ETH_PHY_TLK110
89
#define ETH_ADDR 31
9-
#define ETH_POWER_PIN 17
1010
#define ETH_MDC_PIN 23
1111
#define ETH_MDIO_PIN 18
12-
#define ETH_TYPE ETH_PHY_TLK110
12+
#define ETH_POWER_PIN 17
13+
#define ETH_CLK_MODE ETH_CLOCK_GPIO0_IN
1314

1415
static bool eth_connected = false;
1516

16-
void WiFiEvent(WiFiEvent_t event)
17+
void onEvent(arduino_event_id_t event, arduino_event_info_t info)
1718
{
1819
switch (event) {
1920
case ARDUINO_EVENT_ETH_START:
@@ -25,18 +26,14 @@ void WiFiEvent(WiFiEvent_t event)
2526
Serial.println("ETH Connected");
2627
break;
2728
case ARDUINO_EVENT_ETH_GOT_IP:
28-
Serial.print("ETH MAC: ");
29-
Serial.print(ETH.macAddress());
30-
Serial.print(", IPv4: ");
31-
Serial.print(ETH.localIP());
32-
if (ETH.fullDuplex()) {
33-
Serial.print(", FULL_DUPLEX");
34-
}
35-
Serial.print(", ");
36-
Serial.print(ETH.linkSpeed());
37-
Serial.println("Mbps");
29+
Serial.println("ETH Got IP");
30+
ETH.printInfo(Serial);
3831
eth_connected = true;
3932
break;
33+
case ARDUINO_EVENT_ETH_LOST_IP:
34+
Serial.println("ETH Lost IP");
35+
eth_connected = false;
36+
break;
4037
case ARDUINO_EVENT_ETH_DISCONNECTED:
4138
Serial.println("ETH Disconnected");
4239
eth_connected = false;
@@ -73,8 +70,8 @@ void testClient(const char * host, uint16_t port)
7370
void setup()
7471
{
7572
Serial.begin(115200);
76-
WiFi.onEvent(WiFiEvent);
77-
ETH.begin(ETH_ADDR, ETH_POWER_PIN, ETH_MDC_PIN, ETH_MDIO_PIN, ETH_TYPE);
73+
WiFi.onEvent(onEvent);
74+
ETH.begin(ETH_TYPE, ETH_ADDR, ETH_MDC_PIN, ETH_MDIO_PIN, ETH_POWER_PIN, ETH_CLK_MODE);
7875
}
7976

8077

Diff for: libraries/Ethernet/examples/ETH_W5500_Arduino_SPI/.skip.esp32h2

Whitespace-only changes.
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,110 @@
1+
/*
2+
This sketch shows the Ethernet event usage
3+
4+
*/
5+
6+
#include <ETH.h>
7+
#include <SPI.h>
8+
9+
// Set this to 1 to enable dual Ethernet support
10+
#define USE_TWO_ETH_PORTS 0
11+
12+
#define ETH_TYPE ETH_PHY_W5500
13+
#define ETH_ADDR 1
14+
#define ETH_CS 15
15+
#define ETH_IRQ 4
16+
#define ETH_RST 5
17+
18+
// SPI pins
19+
#define ETH_SPI_SCK 14
20+
#define ETH_SPI_MISO 12
21+
#define ETH_SPI_MOSI 13
22+
23+
#if USE_TWO_ETH_PORTS
24+
// Second port on shared SPI bus
25+
#define ETH1_TYPE ETH_PHY_W5500
26+
#define ETH1_ADDR 1
27+
#define ETH1_CS 32
28+
#define ETH1_IRQ 33
29+
#define ETH1_RST 18
30+
ETHClass ETH1(1);
31+
#endif
32+
33+
static bool eth_connected = false;
34+
35+
void onEvent(arduino_event_id_t event, arduino_event_info_t info)
36+
{
37+
switch (event) {
38+
case ARDUINO_EVENT_ETH_START:
39+
Serial.println("ETH Started");
40+
//set eth hostname here
41+
ETH.setHostname("esp32-eth0");
42+
break;
43+
case ARDUINO_EVENT_ETH_CONNECTED:
44+
Serial.println("ETH Connected");
45+
break;
46+
case ARDUINO_EVENT_ETH_GOT_IP:
47+
Serial.printf("ETH Got IP: '%s'\n", esp_netif_get_desc(info.got_ip.esp_netif));
48+
ETH.printInfo(Serial);
49+
#if USE_TWO_ETH_PORTS
50+
ETH1.printInfo(Serial);
51+
#endif
52+
eth_connected = true;
53+
break;
54+
case ARDUINO_EVENT_ETH_LOST_IP:
55+
Serial.println("ETH Lost IP");
56+
eth_connected = false;
57+
break;
58+
case ARDUINO_EVENT_ETH_DISCONNECTED:
59+
Serial.println("ETH Disconnected");
60+
eth_connected = false;
61+
break;
62+
case ARDUINO_EVENT_ETH_STOP:
63+
Serial.println("ETH Stopped");
64+
eth_connected = false;
65+
break;
66+
default:
67+
break;
68+
}
69+
}
70+
71+
void testClient(const char * host, uint16_t port)
72+
{
73+
Serial.print("\nconnecting to ");
74+
Serial.println(host);
75+
76+
WiFiClient client;
77+
if (!client.connect(host, port)) {
78+
Serial.println("connection failed");
79+
return;
80+
}
81+
client.printf("GET / HTTP/1.1\r\nHost: %s\r\n\r\n", host);
82+
while (client.connected() && !client.available());
83+
while (client.available()) {
84+
Serial.write(client.read());
85+
}
86+
87+
Serial.println("closing connection\n");
88+
client.stop();
89+
}
90+
91+
void setup()
92+
{
93+
Serial.begin(115200);
94+
WiFi.onEvent(onEvent);
95+
96+
SPI.begin(ETH_SPI_SCK, ETH_SPI_MISO, ETH_SPI_MOSI);
97+
ETH.begin(ETH_TYPE, ETH_ADDR, ETH_CS, ETH_IRQ, ETH_RST, SPI);
98+
#if USE_TWO_ETH_PORTS
99+
ETH1.begin(ETH1_TYPE, ETH1_ADDR, ETH1_CS, ETH1_IRQ, ETH1_RST, SPI);
100+
#endif
101+
}
102+
103+
104+
void loop()
105+
{
106+
if (eth_connected) {
107+
testClient("google.com", 80);
108+
}
109+
delay(10000);
110+
}

Diff for: libraries/Ethernet/examples/ETH_W5500_IDF_SPI/.skip.esp32h2

Whitespace-only changes.
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,107 @@
1+
/*
2+
This sketch shows the Ethernet event usage
3+
4+
*/
5+
6+
#include <ETH.h>
7+
8+
// Set this to 1 to enable dual Ethernet support
9+
#define USE_TWO_ETH_PORTS 0
10+
11+
#define ETH_TYPE ETH_PHY_W5500
12+
#define ETH_ADDR 1
13+
#define ETH_CS 15
14+
#define ETH_IRQ 4
15+
#define ETH_RST 5
16+
#define ETH_SPI_HOST SPI2_HOST
17+
#define ETH_SPI_SCK 14
18+
#define ETH_SPI_MISO 12
19+
#define ETH_SPI_MOSI 13
20+
21+
#if USE_TWO_ETH_PORTS
22+
// Second port on shared SPI bus
23+
#define ETH1_TYPE ETH_PHY_W5500
24+
#define ETH1_ADDR 1
25+
#define ETH1_CS 32
26+
#define ETH1_IRQ 33
27+
#define ETH1_RST 18
28+
ETHClass ETH1(1);
29+
#endif
30+
31+
static bool eth_connected = false;
32+
33+
void onEvent(arduino_event_id_t event, arduino_event_info_t info)
34+
{
35+
switch (event) {
36+
case ARDUINO_EVENT_ETH_START:
37+
Serial.println("ETH Started");
38+
//set eth hostname here
39+
ETH.setHostname("esp32-eth0");
40+
break;
41+
case ARDUINO_EVENT_ETH_CONNECTED:
42+
Serial.println("ETH Connected");
43+
break;
44+
case ARDUINO_EVENT_ETH_GOT_IP:
45+
Serial.printf("ETH Got IP: '%s'\n", esp_netif_get_desc(info.got_ip.esp_netif));
46+
ETH.printInfo(Serial);
47+
#if USE_TWO_ETH_PORTS
48+
ETH1.printInfo(Serial);
49+
#endif
50+
eth_connected = true;
51+
break;
52+
case ARDUINO_EVENT_ETH_LOST_IP:
53+
Serial.println("ETH Lost IP");
54+
eth_connected = false;
55+
break;
56+
case ARDUINO_EVENT_ETH_DISCONNECTED:
57+
Serial.println("ETH Disconnected");
58+
eth_connected = false;
59+
break;
60+
case ARDUINO_EVENT_ETH_STOP:
61+
Serial.println("ETH Stopped");
62+
eth_connected = false;
63+
break;
64+
default:
65+
break;
66+
}
67+
}
68+
69+
void testClient(const char * host, uint16_t port)
70+
{
71+
Serial.print("\nconnecting to ");
72+
Serial.println(host);
73+
74+
WiFiClient client;
75+
if (!client.connect(host, port)) {
76+
Serial.println("connection failed");
77+
return;
78+
}
79+
client.printf("GET / HTTP/1.1\r\nHost: %s\r\n\r\n", host);
80+
while (client.connected() && !client.available());
81+
while (client.available()) {
82+
Serial.write(client.read());
83+
}
84+
85+
Serial.println("closing connection\n");
86+
client.stop();
87+
}
88+
89+
void setup()
90+
{
91+
Serial.begin(115200);
92+
WiFi.onEvent(onEvent);
93+
ETH.begin(ETH_TYPE, ETH_ADDR, ETH_CS, ETH_IRQ, ETH_RST, ETH_SPI_HOST, ETH_SPI_SCK, ETH_SPI_MISO, ETH_SPI_MOSI);
94+
#if USE_TWO_ETH_PORTS
95+
// Since SPI bus is shared, we should skip the SPI pins when calling ETH1.begin()
96+
ETH1.begin(ETH1_TYPE, ETH1_ADDR, ETH1_CS, ETH1_IRQ, ETH1_RST, ETH_SPI_HOST);
97+
#endif
98+
}
99+
100+
101+
void loop()
102+
{
103+
if (eth_connected) {
104+
testClient("google.com", 80);
105+
}
106+
delay(10000);
107+
}

0 commit comments

Comments
 (0)