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.
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.
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.
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?
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.
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.
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.
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.
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.
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.
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.
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.
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?
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.