Forum: Mikrocontroller und Digitale Elektronik ESP32 - Ethernet via UART oder SPI ?


von Daniel D. (darath)


Lesenswert?

Guten Tag,

Ich würde gerne an einen ESP32 Ethernet anbauen. Da gibt's natürlich 
bereits kaufbare Module aber auf die möchte ich verzichten zu mal es 
auch ein Lernprozess für mich ist.
Der ESP32 ja selbst bereits eine MAC hat würde es hier gehen nur einen 
PHY Adapter (LAN8720 o.ä) anzubauen ähnlich wie hier :
https://sautter.com/blog/ethernet-on-esp32-using-lan8720/
Das würde dann über den UART Anschluss laufen, kleiner Nachteil wäre 
hier dass ich ~8+ Pins belegen würde je nachdem wie ich es anschließe.

Als Alternative ginge es natürlich auch ein komplett eigenes Modul mit 
MAC+ PHY an den SPI anzuschließen wie ein ein ENC28J60 oder W5500. 
Vorteil hier wäre natürlich, dass ich nur die SPI Pins benötige (Die ich 
dann auch noch für andere SPI Module auslagern kann) + einem CS Pin und 
zusätzlich CLK.

Da ich selbst noch nicht so viel Erfahrung mit Seriellen Anschlüssen 
gemacht habe würde ich euch gerne Fragen ob ihr mir hier etwas Input 
geben könntet ?
Die Datenübertragungsgröße ist gering (MQTT/JSON) mit jetzt auf 2MB 
gesetzt, was mich Interessieren würde wäre die Geschwindigkeit der 
jeweiligen Anschlüsse ob es da etwas auffälligen gibt ? Oder ob ich 
sonst etwas beachten soll.

Vielen Dank !
Mit freundlichen Grüßen
Darath

: Bearbeitet durch User
von Frank K. (fchk)


Lesenswert?

Daniel D. schrieb:

> Der ESP32 ja selbst bereits eine MAC hat würde es hier gehen nur einen
> PHY Adapter (LAN8720 o.ä) anzubauen ähnlich wie hier :
> https://sautter.com/blog/ethernet-on-esp32-using-lan8720/
> Das würde dann über den UART Anschluss laufen, kleiner Nachteil wäre
> hier dass ich ~8+ Pins belegen würde je nachdem wie ich es anschließe.

NEIN. Das läuft nicht über UART. JEDER Ethernet MAC hat einen 
*MII-Anschluss (100M: MII, RMII; 1G: GMII, RGMII, SGMII, 10G: XMII), und 
der verwendete PHY hat auch einen *MII-Anschluss. Das ist was spezielles 
und kein UART, und Du musst es exakt so machen, wie es da in deinem Link 
steht, damit es geht, weil Du eben genau die RMII-Pins brauchst.

> Als Alternative ginge es natürlich auch ein komplett eigenes Modul mit
> MAC+ PHY an den SPI anzuschließen wie ein ein ENC28J60 oder W5500.

Kann man machen, empfiehlt sich aber nur dann, wenn Du kein Ethernet MAC 
hast. Solange Du einen Ethernet-MAC hast, ist es immer besser, den auch 
zu benutzen, sowohl aus Sicht der Rechenleistung, der Programmierung 
(der Ethernet-Treiber ist ja fertig, da musst Du nichts mehr dran 
machen) und der Übertragungsgeschwindigkeit.

fchk

von Daniel D. (darath)


Lesenswert?

Vielen Dank für die Antworten!

Frank K. schrieb:
> NEIN. Das läuft nicht über UART. JEDER Ethernet MAC hat einen
> *MII-Anschluss (100M: MII, RMII; 1G: GMII, RGMII, SGMII, 10G: XMII), und
> der verwendete PHY hat auch einen *MII-Anschluss. Das ist was spezielles
> und kein UART, und Du musst es exakt so machen, wie es da in deinem Link
> steht, damit es geht, weil Du eben genau die RMII-Pins brauchst.
>
Verstehe, dann hab ich hier wohl was vertauscht. Bedeutet also nur, dass 
die Pins für UART (TXD/RXD) den gleichen Namen haben wie für MII?

Ich bin der oberen Anleitung gefolgt und habe versucht alle Pins nach 
dem Modul anzustecken, erhalte aber keine Verbindung zum PHY. Hättest du 
da eine Idee warum ? Als ESP benutzte ich ein D1 Mini:
https://cdn.shopify.com/s/files/1/1509/1638/files/D1_Mini_ESP32_Datenblatt_AZ-Delivery_Vertriebs_GmbH.pdf?v=1604068666

Die Pins habe ich aber so belegt wie es in der Anleitung gemacht wurde 
und auch Pull Up/Downs dazu, aber es kommt nur:
12:43:08.137 -> E (1008) emac: Timed out waiting for PHY register 0x2 to 
have value 0x0007(mask 0xffff). Current value 0xffff
12:43:09.128 -> E (2008) emac: Timed out waiting for PHY register 0x3 to 
have value 0xc0f0(mask 0xfff0). Current value 0xffff
12:43:09.128 -> E (2008) emac: Initialise PHY device Timeout


> Kann man machen, empfiehlt sich aber nur dann, wenn Du kein Ethernet MAC
> hast. Solange Du einen Ethernet-MAC hast, ist es immer besser, den auch
> zu benutzen, sowohl aus Sicht der Rechenleistung, der Programmierung
> (der Ethernet-Treiber ist ja fertig, da musst Du nichts mehr dran
> machen) und der Übertragungsgeschwindigkeit.

Naja, bei dem SPI Modul gibt es auch alles fertig für Arduino / ESP32 
weswegen ich hier kein Mehrauffwand sehe. Zu der Geschwindigkeit, wieso 
ist es über den internen MAC schneller als über den externen ? Und was 
ist, wenn der ESP32 bereits recht gut ausgelastet ist, wäre da über SPI 
nicht schneller da er nur die Daten Senden/Empfangen muss und nicht auch 
noch zusätzlich MAC/PHY belastet.

von Frank K. (fchk)


Lesenswert?

Daniel D. schrieb:

> Frank K. schrieb:
>> NEIN. Das läuft nicht über UART. JEDER Ethernet MAC hat einen
>> *MII-Anschluss (100M: MII, RMII; 1G: GMII, RGMII, SGMII, 10G: XMII), und
>> der verwendete PHY hat auch einen *MII-Anschluss. Das ist was spezielles
>> und kein UART, und Du musst es exakt so machen, wie es da in deinem Link
>> steht, damit es geht, weil Du eben genau die RMII-Pins brauchst.
>>
> Verstehe, dann hab ich hier wohl was vertauscht. Bedeutet also nur, dass
> die Pins für UART (TXD/RXD) den gleichen Namen haben wie für MII?

Ja, es gibt bei einigen Signalen Namensähnlichkeiten.

> Die Pins habe ich aber so belegt wie es in der Anleitung gemacht wurde
> und auch Pull Up/Downs dazu, aber es kommt nur:

Ich habe keine Erfahrungen speziell mit ESP32, aber MII und RMII sind 
überall gleich, und ich habe schon dutzende davon verbaut. Ein mögliches 
Problem ist die Tatsache, dass die Pins mehrfach benutzt werden, und 
hier musst Du jedem betroffenen Pin sagen, dass er Ethernet/RMII sein 
soll und kein GPIO oder sonstwas.

>> Kann man machen, empfiehlt sich aber nur dann, wenn Du kein Ethernet MAC
>> hast. Solange Du einen Ethernet-MAC hast, ist es immer besser, den auch
>> zu benutzen, sowohl aus Sicht der Rechenleistung, der Programmierung
>> (der Ethernet-Treiber ist ja fertig, da musst Du nichts mehr dran
>> machen) und der Übertragungsgeschwindigkeit.

> Naja, bei dem SPI Modul gibt es auch alles fertig für Arduino / ESP32
> weswegen ich hier kein Mehrauffwand sehe. Zu der Geschwindigkeit, wieso
> ist es über den internen MAC schneller als über den externen ? Und was
> ist, wenn der ESP32 bereits recht gut ausgelastet ist, wäre da über SPI
> nicht schneller da er nur die Daten Senden/Empfangen muss und nicht auch
> noch zusätzlich MAC/PHY belastet.

Bei vielen Prozessoren kann der MAC direkt per DMA auf den Speicher 
zugreifen und sich selber die Daten holen und verschicken bzw empfangene 
Daten im Speicher ablegen, ohne direkte Mitwirkung des Prozessors. Der 
muss nur einmal die Blockadresse mitteilen. Oft kann der MAC noch mehr 
(z.B. Prüfsummen ausrechnen oder), und auch das ist dann etwas, was der 
Prozessor selber nicht mehr machen muss. Daher belastet der interne MAC 
den Prozessor fast immer weniger als ein externer MAC/PHY.

fchk

von Frank K. (fchk)


Angehängte Dateien:

Lesenswert?

Zur Geschwindigkeit: Ich habe hier mal Zahlen vom Microchip TCP/IP-Stack 
herausgesucht und verglichen.
Performancewert: UDP LAN Throughput
Prozessor ist hier ein PIC32MX795F512L mit 80 MHz.
1. ENC28J60:   ext.  10MBit/s SPI MAC/PHY: 456kB/s
2. ENC624J600: ext. 100MBit/s SPI MAC/PHY: 784kB/s
3. interner 100 MBit/s MAC+LAN8720A PHY:  8449kB/s

Das ist jetzt nur ein Beispiel, aber die Ergebnisse dürften auf anderen 
Plattformen nicht soviel anders aussehen. Und da alle MACs und PHYs hier 
von Microchip kommen, kannst Du davon ausgehen, dass sie wissen, was sie 
da programmieren und dass das einigermaßen gut für die Plattform 
optimiert ist.

SPI ist eben als Anbindung deutlich ineffizienter als ein direkter 
Zugriff auf die Register und den Speicher über den internen 
Adress-/Datenbus, wie Du aus den Ergebnissen in der Tabelle ablesen 
kannst. Du kannst z.B. den PIC18F97J60 mit internem MAC/PHY mit der 
Kombination PIC18F8722+ENC28J60 via SPI vergleichen. Beide Prozessoren 
haben exakt die gleiche Architektur und fast die gleiche Rechenleistung 
(Spalte MIPS), und der interne MAC/PHY vom PIC18F97J60 ist recht ähnlich 
zum externen ENC28J60. Der Unterschied ist im Wesentlichen die Anbindung 
- einmal intern über den Adress/Datenbus und einmal extern via SPI, und 
genau dieser Unterschied ist für einen satten Faktor 2 in der 
Performance verantwortlich. Schick, was?

fchk

: Bearbeitet durch User
von Larry (Gast)


Lesenswert?

Nimm doch einen wiznet w5500 , hatte den vor Jahren an eine arduino 
verbaut und hat eigenklich recht problemlos funktioniert und mit ca 5.- 
aus CHINA auch eine preiwerte Lösung.

Specifications:

Chip type: W5500
Supports both 3.3V & 5V.
Hardwired TCP/IP Protocols : TCP, UDP, ICMP, IPv4, ARP, IGMP, PPPoE
10BaseT/100BaseTX Ethernet PHY embedded
Supports automatic response (full duplex / half duplex mode)
Supports 8 independent sockets simultaneously
Internal 32Kbytes Memory for Tx/Rx Buffers
Power off mode: support
Network wake: support
SPI interface (SPI MODE 0, 3),convenient connection with MCU
Size: 55mm x 28mm
Color: Blue

https://github.com/jozala/ESP32_W5500_TCP

CU , Larry

Bitte melde dich an um einen Beitrag zu schreiben. Anmeldung ist kostenlos und dauert nur eine Minute.
Bestehender Account
Schon ein Account bei Google/GoogleMail? Keine Anmeldung erforderlich!
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.