Forum: Mikrocontroller und Digitale Elektronik Wiznet W5500 Datenübertragung via Ethernet


von Uli D. (megi)


Lesenswert?

Hallo zusammen,

ich möchte mit einem MSP430 Mikrocontroller (G2553) Daten über Ethernet 
versenden. Als Ethernet-Controller kommt der W5500 von Wiznet zum 
Einsatz. Geplant ist die Kommunikation per UDP.

Die SPI-Kommunikation zwischen dem MSP430 und dem W5500 habe ich bereits 
eingerichtet und erfolgreich getestet.

Ich habe mir auch die offizielle ioLibrary_Driver von Wiznet auf GitHub 
angeschaut – allerdings fällt mir der Einstieg etwas schwer. Besonders 
die Struktur der Bibliothek und die initiale Einbindung wirken auf den 
ersten Blick etwas unübersichtlich.

Hat jemand hier im Forum bereits erfolgreich die ioLibrary mit dem W5500 
in Verbindung mit einem MSP430 verwendet?
Ich würde mich sehr über Beispiele, Tipps oder Hinweise zur 
Implementierung freuen. Danke

von Arduino F. (Firma: Gast) (arduinof)


Lesenswert?

Na dann....
Hast du deine SPI Funktionen schon in der Lib registriert, bzw. eigene 
gebaut?
Nein?
Machen!

von Cyblord -. (cyblord)


Lesenswert?

Man kann den W5500 auch ohne lib nutzen. Einfach nach Datenblatt 
programmieren. So habe ich damit auch ein paar einfache Ethernet 
Anwendungen gemacht.
Wenn du allerdings ein echtes Socket Interface brauchst, würde ich das 
Rad nicht neu erfinden und versuchen die bereitgestellte library nehmen.

von Uli D. (megi)


Angehängte Dateien:

Lesenswert?

Hi,
leider bin ich nicht wirklich weiter gekommen. Finde die wiznet Lib 
ziemlich verwirrend. (Was wird für UDP bzw TCP benötigt, kann da leider 
nicht wirklich eine Beschreibung finden. Habe testweise mal die w5500.h, 
socket.h und wizchip_conf.h mit #include geladen. Doch leider bekomme 
ich da mit Socket schon gleich Probleme (shift count to large).

Im Anhang habe ich meinen Anfang angehängt, @arduinof ist das was du 
gemeint hast?

Danke

von Uli D. (megi)


Lesenswert?

Danke, Cyblord – ich bin mir noch nicht sicher, was die bessere Lösung 
ist.
Das generelle Ziel ist es, Sensordaten per LAN an einen Empfänger 
(Computer oder vielleicht ein WLAN-Modul) zu übertragen. In Zukunft 
könnte das Projekt (relativ) komplexer werden, z. B. durch den Einsatz 
von Motoren, um den Sensor in X- und Y-Richtung zu verfahren, oder durch 
die Ansteuerung zusätzlicher Module.
Daher bin ich unsicher, ob es sinnvoll ist, die offizielle Library zu 
verwenden oder ob es besser wäre, alles selbst zu programmieren – ich 
habe wenig Ahnung von Ethernet, und die Datenübertragung ist nicht das 
eigentliche Problem. Deshalb wollte ich es so einfach wie möglich 
halten.
Würdest du UDP für meine Anwendung empfehlen? Hast du vielleicht 
Beispielcode, an dem ich mich orientieren könnte (Hauptsache der Code 
ist in C)?

Danke!

von Cyblord -. (cyblord)


Lesenswert?

Uli D. schrieb:
> Das generelle Ziel ist es, Sensordaten per LAN an einen Empfänger
> (Computer oder vielleicht ein WLAN-Modul) zu übertragen.

Das hätte jetzt nicht allgemeiner sein können. Aber wie?

Welche Stacks oder Protokolle willst du nutzen? Nur UDP oder läuft da 
was drauf?

> Hast du vielleicht
> Beispielcode, an dem ich mich orientieren könnte (Hauptsache der Code
> ist in C)?

Dein Problem ist schlicht dass beide Ansätze einen gewissen Skillevel 
erfordern, den du nicht hast.
Es erfordert grundlegendes Wissen um Controller, SPI, Ethernet und den 
W5500 um ihn direkt anzusteuern.
Es erfordert Wissen um SPI und allgemein C um fertige Libs einzubinden 
und zu nutzen.
Du kannst aktuell beides nicht. Fang kleiner an.

: Bearbeitet durch User
von Martin S. (strubi)


Lesenswert?

Da in den G2553 jetzt nicht ewig viel reinpasst und Code-Banking nicht 
drinliegt, wuerde ich jetzt eher den Wiz bare metal programmieren. Das 
ist nicht allzu aufwendig. Dazu kommt, dass in der Wiz-library auch mal 
"verbotene" potentielle Endlosschleifen drin stecken, heisst, 
Watchdog-Szenarien, die zuschlagen koennen. Also, als Beispielcode zu 
sehen.

Im Hinblick auf weitere Komplexitaet ist vielleicht der msp430 etwas eng 
bemessen. Ich mache es hier andersrum, der MSP430 ist der intelligente 
ADC-Slave und den ganzen Rest macht ein FPGA-SoC (da spare ich mir den 
Wiznet).
Daten streamen macht per UDP schon Sinn, wenn es um Echtzeit-Messdaten 
gehen, und ab und an mal ein Paket fehlen darf. Bei TCP kann es Haenger 
geben, Queues volllaufen, Watchdog zuschlagen, usw.

von Cyblord -. (cyblord)


Lesenswert?

Ansonsten, WENN du doch bereits die SPI Kommunikation hast, dann schau 
ins Datenblatt und fang an, ein Socket zu erstellen, zu öffnen und was 
zu schicken.

Ich empfehle die Programme Wireshark und PacketSender um den Erfolg zu 
kontrollieren.

Ob MAC und Source IP Adresse korrekt konfiguriert sind, kann man sogar 
schon mit einem PING vom PC aus testen.
Also da kann man schön Step by Step vorgehen.

: Bearbeitet durch User
von Wastl (hartundweichware)


Angehängte Dateien:

Lesenswert?

Cyblord -. schrieb:
> Ansonsten, WENN du doch bereits die SPI Kommunikation hast

Hat er nicht.

Ich hab mal die grundlegenden Routinen für SPI als Source
angehängt. Ist zwar für einen STM32F4, aber man kann erkennen
was unbedingt erforderlich ist um mit dem Chip zu sprechen.

Ja, die vier Funktionen braucht man unbedingt. Das alles kann
man aber auch aus dem Datenblatt entnehmen. Das ist der
"Urschleim", wenn man das kann, kann man mit dem Aufbau der
höheren Level beginnen.

von Wastl (hartundweichware)


Angehängte Dateien:

Lesenswert?

Hier noch die unbedingt erforderlichen Sourcen für den W5500
die direkt oberhalb des SPI Levels angesiedelt sind. In
W5500.h sind jede Menge Makros und Adressen abgelegt.

Leicht umgeschrieben und beautyfied aus den Sourcen von Wiznet.
Allerdings nicht unbedingt sofort passend für den MSP430.

Wenn man das fehlerfrei compilieren kann ist man schon recht weit.

von Uli D. (megi)


Angehängte Dateien:

Lesenswert?

Ich habe jetzt erstmal versucht Daten mit UDP zu senden - ohne Lib mit 
Register. Leider keine Daten am anderen Ende. Der PC am anderen Ende 
schein wohl daten zu senden... SPI schein mir soweit die richtigen daten 
zu senden.
Unten habe ich den Ablauf meines Programmes aufgelistet - ist der Ablauf 
richtig? Habe ich was vergessen? (Im Anhang auch mein aktuelle Code)

1. Software Reset:
(0x0000, 0x04, 0x80)

2. Wait

3. Set MAC(00:08:DC:AB:CD:EF):
(0x0009, 0x04, 0x00);(0x000A, 0x04, 0x08);(0x000B, 0x04, 0xDC);(0x000C, 
0x04, 0xAB);(0x000D, 0x04, 0xCD);(0x000E, 0x04, 0xEF);

4. Set IP(192.168.0.10):
(0x000F, 0x04, 192);(0x0010, 0x04, 168);(0x0011, 0x04, 0);(0x0012, 0x04, 
10);

5. Set Subnet(255.255.255.0):
(0x0005, 0x04, 255);(0x0006, 0x04, 255);(0x0007, 0x04, 255);(0x0008, 
0x04, 0);

6. Set Gateway(192.168.0.1):
(0x0001, 0x04, 192);(0x0002, 0x04, 168);(0x0003, 0x04, 0);(0x0004, 0x04, 
1);

7. Set Socket UDP:
(0x4000, 0x0C, 0x02);

8. Set Port 5000:
(0x4004, 0x0C, 0x13);(0x4005, 0x0C, 0x88);

9. Open Socket:
(0x4001, 0x0C, 0x01);

10. TX Write Pointer:
(0x0024, 0x0C);(0x0025, 0x0C);

11. Transfer Data:
(0x8000 + i, 0x14, data[i])

12. Read Socket 0 TX Write Pointer:
(0x4000 + 0x20, 0x0C, (len >> 8) & 0xFF); (0x4000 + 0x21, 0x0C, len & 
0xFF);

13. Send Command:
(W5500_SOCKET0_BASE + 0x01, 0x0C, 0x20);

14. Wait:
while (!(w5500_read(0x4000 + 0x02, 0x0C) & 0x10));

15. Clear:
(0x4000 + 0x02, 0x0C, 0x10);

von Wastl (hartundweichware)


Lesenswert?

Deine magischen Zahlen zu übersetzen und zu prüfen ist mir zu
mühselig. Du solltest schon die von Wiznet gelieferten Defines
benutzen (kostet ja nix) damit man eine einigermassen
vernünftige Basis für einen Meinungsaustausch hat. Insbesondere
deine Prosa-Source ist da nicht weiter hilfreich.

Nur soviel: Wenn mal alles aufgesetzt (initialisiert, gestartet)
ist sollte man das Statusregister des W5500 dauernd lesen und
daraus seine Schlüsse ziehen. Einfach blind Daten senden und auf
Reaktion/Empfang warten lässt einen hilflos im Wald stehen.

Auf die Schnelle sehe ich dass deine Reset Steuerung wohl so
nicht ausreicht. Im Datenblatt wird von 500usec gesprochen.
Deine Soft-Delay-Loop ist dafür ungeeignet (ist zu kurz und
könnte zudem vom Compiler weg-optimiert werden), da sollte es
im Framework des Controllers zumindest etwas Besseres geben.

Dass es durchaus hilfreich ist in verschiedenen Leveln zu
programmieren scheint dir noch nicht geläufig zu sein. Zumindest
in diesem Fall sollte man sich darauf "einigen", SPI, W5500-HAL
(Register-Operationen) und Applikation in getrennten Levels zu
behandeln. Eigentlich sind die Socket-Operationen nochmal ein
eigener Level unterhalb der Applikation.

Übrigens: Quelltext wir hier im Forum als *.c Datei gepostet,
nicht als *.txt.

Deine SPI Read- und Write-Funktionen sind doppelt gemoppelt, es
genügt eine Funktion (SPI Transfer) die sowohl ein Byte
schreibt und bei der Rückkehr ein gelesenes Byte liefert.

von Uli D. (megi)


Lesenswert?

Ja, da hast du definitiv recht...
Wobei das Datenblatt und die w5500.h nicht gerade zur Verständlichkeit 
beitragen – die Registerbezeichnungen wirken nicht durchgängig 
konsistent. Aber gut, das ist im Moment eher zweitrangig.

Ich arbeite aktuell (wieder) an meiner SPI-Kommunikation und bin mir 
noch nicht sicher, ob das Empfangen von Daten wirklich funktioniert.
Gibt es ein Register, das man abfragen kann und das immer einen 
konstanten Wert zurückliefert (zur Überprüfung der SPI-Kommunikation)?

Ich habe versucht, die Versionsnummer (VERSIONR) auszulesen – mit 
folgender Byte-Sequenz:
0x00, 0x39, 0x01, 0x00, 0x00
(also Adresse 0x0039, Read-Befehl, 1 Byte Daten; die letzten beiden 
Bytes sind Platzhalter für die Antwort des W5500)

Auf dem Bus sehe ich mit dem Logikanalysator folgendes:
MOSI: 0x00 | 0x39 | 0x01 | 0x00 | 0x00
MISO: 0x01 | 0x02 | 0x03 | 0x04 | 0x01

Bei anderen Registern, die ich adressiere, bekomme ich ähnliche 
Rückmeldungen, als würde intern irgendwie hochgezählt werden – die 
Rückgabewerte 0x01, 0x02, 0x03 usw. wiederholen sich.
Hat jemand Erfahrung damit oder einen Tipp für ein Register, das 
zuverlässig einen festen Wert zurückliefert?

von Wastl (hartundweichware)


Angehängte Dateien:

Lesenswert?

Uli D. schrieb:
> Auf dem Bus sehe ich mit dem Logikanalysator folgendes:
> MOSI: 0x00 | 0x39 | 0x01 | 0x00 | 0x00
> MISO: 0x01 | 0x02 | 0x03 | 0x04 | 0x01

Da ist ein Byte zuviel. Wie das Datenblatt angibt sind 4 Bytes
zu schreiben (Fixed Data Length Mode 01), im letzten Transfer
kommt ein zu lesendes Byte daher. Chip Select rahmt die vier
Transfers ein.

Uli D. schrieb:
> die letzten beiden
> Bytes sind Platzhalter für die Antwort des W5500)

Du kommandierst "1 Byte lesen", redest aber dann von zweien?
Bist du sicher dass du weisst was du tust?

Im Anhang meine (hoffentlich selbsterklärende) Startup-
Testroutine ob der W5500 ansprechbar ist.

von Wastl (hartundweichware)


Angehängte Dateien:

Lesenswert?

Wastl schrieb:
> im letzten Transfer
> kommt ein zu lesendes Byte daher. Chip Select rahmt die vier
> Transfers ein.

Ist alles glasklar im Datenblatt beschrieben. Was ist daran
nicht zu verstehen? Ist dir der Mechanismus des SPI Transfers
noch nicht klar?

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.