Hallo liebe Community,
ich habe ein Problem mit dem W5200 von WIZnet. Ich würde diesen Chip
gerne verwenden um die serielle Schnittstelle des STM32F103C8
(Entwicklungsumgebung COIDE) auf Ethernet umzusetzen. Der µC sammelt
verschiedene Sensordaten und soll diese periodisch an einen PC senden.
Die Übertragung ist verlusttolerant, ich wollte dafür das UDP-Protokoll
verwenden. Ich verwende kein Developmentboard, sondern eine eigene
Schaltung. Diese ist bereits fertig. Aus diesem Grund würde ich auch
gerne genau diesen Chip verwenden.
Mein Problem besteht darin, dass ich einfach nicht weiß, wie dieser Chip
funktioniert. Ich weiß nicht wie ich ihn programmieren kann bzw. was ich
überhaupt für eine Entwicklungsumgebung/Compiler ich verwenden kann. Ich
habe ziemlich viel im Internet rumgegoogelt und auch einiges an
Dokumenten/Foreneinträgen usw. gefunden aber nichts was mit weiterhilft.
Ich habe auch noch recht wenig Erfahrung mit µC. Hat einer von euch
Erfahrung mit dem Chip? Ich würde mich wahnsinnig über ein paar Tipps
freuen.
Grüße
Karl-Friedrich
Danke Spess. Soweit war ich auch schon. In den Datenblättern steht
allerdings nur irgendetwas von SPI-Mode, was ich nicht wirklich
begreife:(
Muss ich dem W5200 die Firmware per SPI schicken? Und wenn ja wie?
Karl-Friedrich schrieb:> Muss ich dem W5200 die Firmware per SPI schicken? Und wenn ja wie?
Die Firmware hat er schon fertig im Bauch. Der TCP/IP-Socket-API von dem
Teil wird per SPI angesprochen, d.h. Open/Read/Write/Close Operationen
auf Sockets werden per SPI übertragen.
Aha ok, jetzt fang ich langsam an zu verstehen...
Weiß jemand von euch wo man diesen Befehlssatz findet?
Wie kann ich dann Register setzten? (Wenn ich z.B. UDP als Protokoll
auswählen will?)
Vielen Dank euch allen
Hi
>Muss ich dem W5200 die Firmware per SPI schicken? Und wenn ja wie?
Dem schickst du überhaupt keine Firmware. Der W5200 wird über Common und
Socket Register konfiguriert. Und das sowie der Zugriff auf Sende- und
Empfangspuffer erfolgt über SPI.
Da must du dich mal durchs Datenblatt wühlen. Ist aber nicht soo
kompliziert. Meine Firmware läuft auf AVRs und ist in Assembler
geschrieben.
MfG Spess
Gut, aber dann habe ich immer noch ein Problem. Ich komme in meinem
Programm ja letztendlich immer an den Punkt, an dem ein Befehl wie z.B.
SPI_sendDatata("Was gesendet werden soll") steht. Was trage ich hier
ein? Ich finde keine Befehle und ich kann ja wohl schlecht C-Code im
ASCII Format schicken oder?
Hi
>Ich finde keine Befehle und ich kann ja wohl schlecht C-Code im>ASCII Format schicken oder?
Weil es in dem Sinne keine Befehle gibt. Das erfolgt alles über die
Register des W5200. Um z.B dem WS5200 die IP-Adresse 192.168.0.2
zuzuweisen must du folgendes über SPI senden:
0x00 HighByte SIPR-Adresse
0x0F Lowbyte SIPR-Adresse
0x80 HighByte Länge Daten (Bit 7 = 1 -> Schreiben)
0x04 Lowbyte Länge Daten (4 Byte)
0xC0 192
0xA8 162
0x00 0
0x02 2
Oder um den Socket0 zu öffnen:
0x40 HighByte Socket0 Command Register
0x01 LowByte Socket0 Command Register
0x80 HighByte Länge Daten (Bit 7 = 1 -> Schreiben)
0x01 Lowbyte Länge Daten (1 Byte)
0x01 Befehl Socket öffnen
MfG Spess
Hi
>Vielen Dank Spess. Genau so was hatte ich gesucht.
Ich habe eigentlich nur das wiedergegeben, was in Kapitel 6 External
Interface ausführlich beschrieben ist.
MfG Spess
Hi
>Kann es sein, dass wir verschiedene Datenblätter haben?>Der Titel von meinem lautet "iEthernet W5200 Datasheet (Version 1.3.0)">und umfasst 88 Seiten.
Bei mir ist es Version 1.2.1. Aber Die Unterschiede zur aktuellen
Version sind nicht gravierend. Wie kommst du jetzt darauf?
MfG Spess
Hi
>Weil ich aus den Angaben im Datenblatt nicht auf dein Beispiel gekommen>wäre.
Dann lies dir doch noch mal den
/* Pseudo Code for Write data of 8bit per packet */
...
SpiSendData(((addr+idx) & 0xFF00) >> 8); // Address byte 1
SpiSendData((addr+idx) & 0x00FF); // Address byte 2
SpiSendData((data_write_command | ((data_len& 0x7F00) >> 8)));
SpiSendData((data_len& 0x00FF));
for(int idx = 0; idx<data_len; idx++)
SpiSendData(data_buf[idx]);
...
in Ruhe durch und vergleiche das mal mit meinen Kommentaren.
Und beachte bitte, das im Datenblatt Pseudocode verwendet wird. Das
zweite Beispiel von mir würde im Datenblatt als
Sn_CR = OPEN;
auftauchen. Dahinter steckt aber so eine Sequenz wie oben beschrieben.
MfG Spess
Hi
Ja das hab ich jetzt auch geschnallt, vielen Dank. Bis jetzt hab ich
einfach nicht kapiert wie das mit dem Pseudo-Code gemeint ist. Ich
dachte, dass sei Beispiel Code. Aber als ich es gerade nochmal gelesen
hab ist es mir auch aufgefallen. Ich hab halt ziemlich wenig Erfahrung
mit µC und ich bin auch nicht sonderlich versiert mit hardwarenahen
Sprachen. Aber ich habe es jetzt denk ich geschnallt.
Es werden immer 4 Informationen gesendet, bestehend aus
Register-Adresse, Lesen/Schreiben, Datenlänge und den Daten. Ich denk
mit dem Verständnis bekomm ich das schon auf die Reihe.
Vielen Dank Spess
Hi
>Es werden immer 4 Informationen gesendet, bestehend aus>Register-Adresse, Lesen/Schreiben, Datenlänge und den Daten. Ich denk>mit dem Verständnis bekomm ich das schon auf die Reihe.
Das R/W-Bit ist höherwertigste Bit der Datenlänge. Wird also zusammen
mit dem High-Byte gesendet.
>Ich hab halt ziemlich wenig Erfahrung>mit µC und ich bin auch nicht sonderlich versiert mit hardwarenahen>Sprachen.
Hatte ich mir schon gedacht.
MfG Spess
Hi zusammen,
bei mir hat sich doch noch einmal eine Frage ergeben: Woher weiß der
W5200 eigentlich, ob ich gerade Befehle sende, die er verarbeiten soll,
oder ob ich gerade Daten schicke, die er nur weitersenden soll?
Wäre wichtig zu wissen, nicht dass er nachher meine Nutzdaten als
Befehle interpretiert.
Hi
>Woher weiß der>W5200 eigentlich, ob ich gerade Befehle sende, die er verarbeiten soll,>oder ob ich gerade Daten schicke, die er nur weitersenden soll?
Das ergibt sich aus dem Register in das du schreibst. Die einzigen
Register die Befehle annehmen können sind, wie der Name schon sagt, die
Socket Command Register.
MfG Spess
Hi
OK, das heißt also ich schreibe Daten die keine Befehle sind in den
RX_Memory.
Also um das nochmal Zusammenzufassen, wie ich mir das vorstelle:
Nutzdaten werden in den RX_Memory geschrieben. Dann wird der Socket
konfiguriert und geöffnet. Danach werden die Nutzdaten vom RX_Memory in
den RX_Memory des Sockets geschrieben und dann losgeschickt. Ist das so
korrekt?
Vielen Dank Spess
Hi
>Also um das nochmal Zusammenzufassen, wie ich mir das vorstelle:>Nutzdaten werden in den RX_Memory geschrieben.
Wenn schon, dann in den TX-Puffer.
>Dann wird der Socket konfiguriert und geöffnet.
Bevor du Daten in den TX-Puffer schreibst muss der erst mal konfiguriert
sein. Die acht Sockets teilen sich jeweils 16k TX- und 16k RX-Puffer.
Den einzelnen Sockets können Speicherbereichein der Größe von 0, 1, 2,
4, 8 oder 16k zugewiesen werden. Wobei die Summe der Speicher der
verwendeten Sockets 16k nicht überscheiten darf.
Persönlich konfiguriere ich einen Socket gleich komplett.
>Danach werden die Nutzdaten vom RX_Memory in>den RX_Memory des Sockets geschrieben und dann losgeschickt. Ist das so>korrekt?
Nicht ganz. Im RX-Puffer landen die empfangenen Daten und in den
TX-Puffer werden die Daten geschrieben, die gesendet werden sollen.
Sieh dir doch einfach mal an wie das gemacht wird.
Work->App->Source->W5200 in
http://www.wiznet.co.kr/UpLoad_Files/ReferenceFiles/W5200_TCP_and_UDP_SampleCode_v1.3.zip
MfG spess