Forum: Mikrocontroller und Digitale Elektronik Seriell/Ethernet umestzen mit WIZnet 5200


von Karl-Friedrich (Gast)


Lesenswert?

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

von spess53 (Gast)


Lesenswert?

Hi

Hier findest du die passenden Informationen:

http://www.wiznet.co.kr/Sub_Modules/en/product/Product_Detail.asp?cate1=5&cate2=7&cate3=56&pid=1144#tab

Die Firmware ist für STM32F10X gemacht. Datenblätter von WIZNET sind 
recht verständlich.

MfG Spess

von Karl-Friedrich (Gast)


Lesenswert?

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?

von (prx) A. K. (prx)


Lesenswert?

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.

von Karl-Friedrich (Gast)


Lesenswert?

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

von spess53 (Gast)


Lesenswert?

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

von Karl-Friedrich (Gast)


Lesenswert?

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?

von (prx) A. K. (prx)


Lesenswert?

Karl-Friedrich schrieb:
> Weiß jemand von euch wo man diesen Befehlssatz findet?

In der Doku. Die gibt es wirklich. Nachweislich.

von spess53 (Gast)


Lesenswert?

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

von Frank M. (ukw) (Moderator) Benutzerseite


Lesenswert?

spess53 schrieb:

> 0xA8    162
            ^
            8

Ist aber nur ein klitzekleiner Fehler im Kommentar, die 0xA8 stimmen :-)

von Karl-Friedrich (Gast)


Lesenswert?

Vielen Dank Spess. Genau so was hatte ich gesucht.

von spess53 (Gast)


Lesenswert?

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

von Karl-Friedrich (Gast)


Lesenswert?

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.

von spess53 (Gast)


Lesenswert?

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

von Karl-Friedrich (Gast)


Lesenswert?

Hi

Weil ich aus den Angaben im Datenblatt nicht auf dein Beispiel gekommen 
wäre.
Vielen Dank. Ich glaube jetzt sollte ich einigermaßen klarkommen :)

von spess53 (Gast)


Lesenswert?

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

von Karl-Friedrich (Gast)


Lesenswert?

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

von spess53 (Gast)


Lesenswert?

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

von Karl-Friedrich (Gast)


Lesenswert?

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.

von spess53 (Gast)


Lesenswert?

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

von Karl-Friedrich (Gast)


Lesenswert?

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

von spess53 (Gast)


Lesenswert?

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

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.