Forum: Mikrocontroller und Digitale Elektronik Daten mit Wiz550io als TCP Client versenden


von Lenz (Gast)


Lesenswert?

Hallo,
ich möchte von meinem Xplained Pro D21 über einen Wiz550io Daten an den 
PC senden. Das ändern der IP des Wiz550io hat schonmal geklappt und ich 
kann den Wiz550io auch vom PC aus anpingen. Bloss werden keine Daten 
versendet, was bereits daran scheitert dass der Socket nicht erfolgreich 
geöffnet werden kann.
Die Befehlsfolge beim Start:
-IP des Wiz550io ändern  // {0x00, 0x0F, 0x04, 0xC0, 0xA8, 0x0A, 0x64}
-Modus von Socket 1 auf TCP ändern  // {0x00, 0x00, 0x2C, 0x01}
-Destination IP übertragen  // {0x00, 0x0C, 0x2C, 0xC0, 0xA8, 0x0A, 
0x01}
-Destination Port übertragen  // {0x00, 0x10, 0x2C, 0xEC, 0x54}
-Source Port übertragen  // {0x00, 0x04, 0x2C, 0xEA, 0x60}
-Socket 1 Command "OPEN" absetzen  // {0x00, 0x01, 0x2C, 0x01}
-100ms warten (unterschiedliche Wartezeiten ausprobiert)
-Socket 1 Status lesen -> "1" (sollte es gar nicht geben)  // {0x00, 
0x03, 0x28, 0x00}
-Socket 1 Command "CONNECT" absetzen  // {0x00, 0x01, 0x2C, 0x04}
-20 Byte in den TX Buffer des Socket 1 schreiben
-Socket 1 Command "SEND" absetzen  //  {0x00, 0x01, 0x2C, 0x20}

Auf PC Seite mir Wireshark den Netzwerktransfer überprüft, aber bis auf 
die ARP Anfrage des WIZ550io bei Start kommt gar nichts an.

von User (Gast)


Lesenswert?

Hab mich schon länger nicht mit dem W5500 beschäftigt, aber vielleicht 
hilft es Dir erstmal ein IP-Packet zu versenden...

von Loocee L. (loocee)


Lesenswert?

Lenz schrieb:
> -IP des Wiz550io ändern  // {0x00, 0x0F, 0x04, 0xC0, 0xA8, 0x0A, 0x64}
> -Modus von Socket 1 auf TCP ändern  // {0x00, 0x00, 0x2C, 0x01}
> -Destination IP übertragen  // {0x00, 0x0C, 0x2C, 0xC0, 0xA8, 0x0A,
> 0x01}
> -Destination Port übertragen  // {0x00, 0x10, 0x2C, 0xEC, 0x54}
> -Source Port übertragen  // {0x00, 0x04, 0x2C, 0xEA, 0x60}
> -Socket 1 Command "OPEN" absetzen  // {0x00, 0x01, 0x2C, 0x01}

Ich kann leider aus den Bytefolgen nicht erkenen was du da machst.
Meist ist dann doch ein längeres Programm-Listing nötig.

Aber in der Folge der Kommandos musst du sicherstellen dass im
Socket Status Register das drinsteht was du erwartest bzw.
kommandiert hast.

Dazu müsste nach dem Socket Open mindestens der Staus 0x13 Iinit)
oder mehr erreicht sein (im Fall einer Client App dann mindestens
0x17, Established). Ansonsten ist irgendetwas an der Initialisierung
fehlerhaft / nicht ausreichend und du musst sukkzessive (aus dem
"geringeren" Status) deine Schlüsse daraus ziehen.

von Lenz (Gast)


Angehängte Dateien:

Lesenswert?

User schrieb:
> vielleicht hilft es Dir erstmal ein IP-Packet zu versenden...

das versuche ich indem ich einen 20 Byte Puffer in den TX Buffer von 
Socket 1 schreibe und dann den SEND Command in das Command-Register 
schreibe, aber wenn Socket 1 gar nicht erst geöffnet werden kann, kann 
das auch nicht funktionieren.

Eberhard F. schrieb:
> Aber in der Folge der Kommandos musst du sicherstellen dass im
> Socket Status Register das drinsteht was du erwartest bzw.
> kommandiert hast.

genau bei der Folge der Kommandos bzw. irgendwelchen notwendigen 
Wartezeiten (zu Wartezeiten steht im Datenblatt leider nichts drin) 
hatte ich auf Erfahrungswerte gehofft. Ich habe zwischen den SPI 
Botschaften jeweils ein 100µs Delay und übertrage mit SS Leitung, also 
auch mit Variabler Datenlänge. An der SPI Kommunikation an sich vermute 
ich keine Fehler, da das ändern der IP funktioniert und der 
Logic-Analyser das gleiche anzeigt was ich auch im Debugger sehe. Nur 
eben will der Status von Socket 1 nicht auf Init wechseln (established 
wäre erst dann nach dem CONNECT Befehl)

Source ist im Anhang, aber viel mehr steht da nicht drin.

von Loocee L. (loocee)


Lesenswert?

Lenz schrieb:
> Source ist im Anhang, aber viel mehr steht da nicht drin.

Hast du denn eine gültige MAC Adresse konfiguruiert?

In diesem Fall wären das die Register SHAR0...SHAR5

Antwortet denn dein W5500 auf einen Ping Request?

von Loocee L. (loocee)


Lesenswert?

Lenz schrieb:
> irgendwelchen notwendigen
> Wartezeiten (zu Wartezeiten steht im Datenblatt leider nichts drin)
> hatte ich auf Erfahrungswerte gehofft.

Wartezeiten sind eine schlechte Idee. Du musst - wie bereits
eingangs erwähnt - Statusse solange auswerten bis das richtige
daherkommt und ein Timeout Error Handling vorsehen dafür wenn
nicht das Erwartete passiert.

von Loocee L. (loocee)


Lesenswert?

Lenz schrieb:
> An der SPI Kommunikation an sich vermute
> ich keine Fehler, da das ändern der IP funktioniert

Die SPI Kommunikation kannst du ja einfachst verifizieren
indem du die Register die du beschreibst auch wieder zurückliest.
Es sind ja praktisch alle Register schreib- und lesefähig.

Ich mache solche Verifikationen (Schreiben/Lesen/Vergleichen)
routinemässig beim Startup / Init um die korrekte Datenverbindung
sicherzustellen.

von Loocee L. (loocee)


Angehängte Dateien:

Lesenswert?

Nachdem hier etwas Stille eingekehrt ist kann ich ja mal zeigen wie
ich die Probleme gelöst habe den W5100 (ja ... nicht den W5500) in
den Griff zu kriegen

LABWindows       Printer     Interface             W5100
CVI          --> Port    --> Printer Port --SPI--> auf Arduino
Testprogramm     Driver      zu W5100              Ethernet Shield

Mein Windows Testprogramm greift über den Druckerport auf den W5100
zu. Damit kann ich alle Register schreiben/lesen und übersichtlich
(es gibt ja doch einiges anzuzeigen) darstellen.

Dabei sind alle relevanten Sourcen (*.h und *.c) so gestaltet dass
ich sie nahezu ohne Änderungen in einem Projekt mit AVR GCC
verwenden kann. Mit diesem Programm habe ich zunächst die
grundsätzliche Hardware-Initialisierung verifiziert, dann das
Socket Handling implemetiert und in einem weiteren Schritt auch den
DHCP-Mechanismus aufgebaut.

Mit dem Debugger in LABWindows CVI lässt sich das (im Gegensatz zu
AVR Debugger) sehr komfortabel verfolgen und man muss nicht dauernd
einen neuen Code in den Controller laden.

Weil das alles so gut ging habe ich mir in einem weiteren Schritt
das Vergügen gegönnt an den Druckerport eine ATMega88 zu hängen und
ihn dazu benutzt die Kommandierung des W5100 über SPI zu
beschleunigen. Damit erspart man sich das lästige hinausschieben
des Kommando-Overheads (pro Datenbyte ein Kommando und 2 Byte
Adressen) über den Druckerport und das SPI ermöglicht eine
deutlich höhere Taktrate.

von Lenz (Gast)


Lesenswert?

Eberhard F. schrieb:
> Lenz schrieb:
>> Source ist im Anhang, aber viel mehr steht da nicht drin.
>
> Hast du denn eine gültige MAC Adresse konfiguruiert?
>
> In diesem Fall wären das die Register SHAR0...SHAR5
>
> Antwortet denn dein W5500 auf einen Ping Request?

Der Wiz550io übernimmt bereits die erste Initialisierung inkl. MAC 
Adressen-Vergabe. Und ja ich kann ihn anpingen.
Wenn ich in einer Schleife warte bis der Status auf Init geht ist es 
eine Endlosschleife, da der Status bei 0 bleibt.
Ich kann die Werte in der Registern auch verifizieren, bis auf Source IP 
und Destination IP. Da kommen andere IP's zurück als zu erwarten. Aber 
ich glaube mal gelesen zu haben dass die zurück gelesenen IP's erst 
stimmen nachdem der Socket CONNECTED Status hat. Da ich den Wiz550io 
auch nur unter der IP anpingen kann die ich beschreibe und nicht die ich 
zurück lese, macht das auch Sinn.
Das Problem ist und bleibt der Socket Status bleibt bei 0, egal was ich 
mache. Leider finde ich auch nirgends was genau die Bedingungen sind 
damit der Socket auf Init geht.

von Loocee L. (loocee)


Lesenswert?

Gibt es keinen W5500-spezifischen Besipielcode wo das Socket-
Init dargestellt ist? (habe nicht gegoogelt)

Lenz schrieb:
> Der Wiz550io übernimmt bereits die erste Initialisierung inkl. MAC
> Adressen-Vergabe.

Das konnte ich aus deinem Code nicht erkennen, ich hoffe du machst
es trotzdem.

Ich habe doch noch gegoogelt:

Es gibt Application Notes wo ziemlich klar beschrieben ist was für
einen Socket alles zu tun ist, vielleicht gibt das noch einen Hinweis.

http://wizwiki.net/wiki/doku.php?id=products:w5500:application:tcp_function

Ich zitiere daraus:
---------------------------------------
Setting network information

Basic network information setting for communication: It must be set the 
basic network information.

    SHAR(Source Hardware Address Register)
        It is prescribed that the source hardware addresses, which is 
set by SHAR, use unique hardware addresses (Ethernet MAC address) in the 
Ethernet MAC layer. The IEEE manages the MAC address allocation. The 
manufacturer which produces the network device allocates the MAC address 
to product.
    GAR(Gateway Address Register)
    SUBR(Subnet Mask Register)
    SIPR(Source IP Address Register)

Set socket memory information

This stage sets the socket tx/rx memory information. The base address 
and mask address of each socket are fixed and saved in this stage.
---------------------------------------
Zitat Ende

Zum Init gehört auch ein Initialisieren eines RX und TX Buffers,
hast du du das getan? Sorry, ich kann deinen Code so schlecht lesen.

von dunno.. (Gast)


Lesenswert?

Wow, so mies kommentierten code hab ich länger nicht gesehen. Komplett 
unverständlich, da hat doch niemand Lust drauf zu schauen. Wieso 
schreibst du nur die funktionsnamen als kommentar hin, aber NIE was da 
warum passiert?

Zur Sache: wiznet hat wirklich gute Beispiele zu ihren controllern, die 
zusammen mit dem Datenblatt lassen eigentlich nur wenig offen.

von Lenz (Gast)


Lesenswert?

Eberhard F. schrieb:
> Zum Init gehört auch ein Initialisieren eines RX und TX Buffers,
> hast du du das getan?

nein, ich kann aber auch nichts im Datenblatt finden dass das nötig ist. 
Ich finde, Zitat:
----
16KB RX memory is initially allocated into 2KB size for each
Socket RX Buffer Block (2KB X 8 = 16KB). The initial allocated 2KB size 
of Socket n RX
Buffer can be re-allocated by using ‘Socket n RX Buffer Size Register
(Sn_RXBUF_SIZE)’.
----
selbes zum TX Buffer, mir reichen die 2kb aber erstmal zur ersten (noch 
immer gescheiterten) Inbetriebnahme.

Das die von dir zitierten Register gesetzt werden müssen, stimmt für den 
W5500, beim Wiz550io werden diese aber bereits vor-initialisiert (und 
müssen bloss bei Bedarf geändert werden). Ich habe die Register auch mal 
bei Start ausgelesen und sie sind ungleich 0 (also vom wiz550io Modul 
initialisiert).
Wobei SUBR erwartungsgemäß 255.255.255.0 ist und sowohl GAR als auch 
SIPR falsche IP's sind (default ist 192.168.1.2 und darunter auch 
anpingbar, zurück gelesen wird aber 192.80.9.144 und GAR 192.80.2.3).

Die "schlechte Dokumentation" bezog sich auch eher auf das Wiz550io 
Modul also auf den W5500. Ich habe kein Dokument gefunden dass genau 
beschreibt was alles wie initialisiert wird bei Startup des Moduls.

Ich weiss ehrlich gesagt nicht was ich noch ausprobieren könnte.

von Loocee L. (loocee)


Lesenswert?

Lenz schrieb:
> nein, ich kann aber auch nichts im Datenblatt finden dass das nötig ist.
> Ich finde, Zitat:

Ok, dann ist das anders als beim W5100 auf den ich mich (als
äquivalentes Teil) bezogen habe.

Generell ist jedoch die Dokumentation der WizNet Leute aureichend
und korrekt um so einen Chip in Betrieb zu nehmen.

Ich weiss dann auch nicht weiter.

von Bastler (Gast)


Lesenswert?

Hallo, ich habe ein Wiz550io Modul mal auf die Schnelle mit dem 
Nötigsten angeschlossen: V3,3, GND, Reset über 10k nach Vdd.
Der RDY-Pin sagt 3,3V (also Ready State.)

Bei Anstecken meines Kabels (normal ungekreuzt) blinken auch die 
Lämpchen fleißig am Jack. Jedoch kann ich es nicht anpingen.
Laut Wiznet mit 192.168.1.2, aber da gibts 100% Verlust:


Ping wird ausgeführt für 192.168.1.2 mit 32 Bytes Daten:
PING: Fehler bei der Übertragung. Allgemeiner Fehler.
PING: Fehler bei der Übertragung. Allgemeiner Fehler.
PING: Fehler bei der Übertragung. Allgemeiner Fehler.
PING: Fehler bei der Übertragung. Allgemeiner Fehler.

Ping-Statistik für 192.168.1.2:
    Pakete: Gesendet = 4, Empfangen = 0, Verloren = 4
    (100% Verlust),


Was könnte hier noch faul sein?

von Verirrter Netzwerker (Gast)


Lesenswert?

Bastler schrieb:
> Bei Anstecken meines Kabels (normal ungekreuzt)

Von wo nach wo?

von Bastler (Gast)


Lesenswert?

Verirrter Netzwerker schrieb:
> Bastler schrieb:
>> Bei Anstecken meines Kabels (normal ungekreuzt)
>
> Von wo nach wo?

vom Wiz550 direkt zum PC.

von Verirrter Netzwerker (Gast)


Lesenswert?

Bastler schrieb:
> vom Wiz550 direkt zum PC.

Dann schätze ich mal dass du entweder ein gekreuztes Kabel
oder aber einen Hub bzw Switch brauchst.

Auch ein DSL Modem mit einer zusätzlichen freien Netzwerkbuchse
dürfte diese Aufgabe erfüllen.

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.