mikrocontroller.net

Forum: Mikrocontroller und Digitale Elektronik ENC28J60/M16C/uIP Problem


Autor: Thomas B. (Gast)
Datum:
Angehängte Dateien:

Bewertung
0 lesenswert
nicht lesenswert
Hallo !

Ich versuche zur Zeit mit der Kombination ENC28J60 - M16C/62P - uIP
einen kleinen Webserver aufzubauen. Prinzipiell klappt das, d.h. das
Anpingen funktioniert und Pakete verden in beide Richtungen geschickt.

Allerdings scheint es irgendwie Probleme mit der Checksumme zu geben.
Alle Pakete die der ENC vom PC erhält, haben laut uIP einen
Checksummen-Fehler, obwohl sie genau dem entsprechen was vom PC
weggeschickt wird (aufgezeichnet mittels Packetyzer/Ethereal). Das
selbe ist auch in der Richtung Pc zu ENC: Die Daten die am PC ankommen
entsprechen denen die ich in den ENC reinschicke, haben aber einen
Checksum-Error.
D.h. die Übetragung an sich dürfte funktionieren.

Ich weiß jetzt nun nicht wo ich da mit der Fehlersuche weiter ansetzen
soll. Hab mir mehrere Ports von uIP angeschaut, wobei eigentlich immer
die selben Checksummen-routinen verwendet werden. Also werden die schon
so stimmen. Im übrigen hatte ich das selbe Checksummen Problem auch
schon mit dem TCP Stack von Microchip (aus diesem Grund hab ich jetzt
mal uIP versucht).

Im Anhang hab ich das aufgezeichnete Verhalten plus einer Textdatei mit
dem was der ENC gesendet und empfangen hat.

Hat schon jemand uIP auf einem M16C laufen ? Waren da irgendwelche
Änderungen notwendig ??

Schöne Grüße,
Thomas

Autor: Sascha Str (sascha)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hi,

versuche mich gerade selber an dem M16C62 und dem ENC28J60.
Nur kriege ich keine SPI-Verbindung hin. Könntest du mir mitteilen, wie
du die SPI-Schnittstelle eingestellt hast?

Mfg Sascha

Autor: Ulli (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hallo,
ich habe selbst mal mit dem uIP-Stack gearbeitet und kann mich
erinnern, dass man da einer Header-Datei angeben musste ob die
Zielarchitektur Little- oder Big-Endian ist. Vielleicht liegts ja daran
dass du diese Einstellmöglichkeit übersehen hast und standardmäßig das
verkehrte eingestellt ist. Dann könnte es zu dem von dir beschriebenen
Verhalten kommen.

Ulli

Autor: Thomas B. (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
@Sascha
Ich hab die SPI Schnittstelle per Software SPI realisiert. Hab das
leider nie mit der Hardware SPI hingebracht, wieso auch immer (will ich
mir aber eh wieder mal anschaun, kann ja net sein). Bei andren
Bausteinen die ich verwende (zb. ADC) klappt HW-SPI ja ohne Probleme.

Die Einstellungen die ich für die Hardware SPI verwendet hatte waren:
s3c = 0b01101000;
/*      01101000
        ||||||||______ 00 .. f1 oder f2 , 01 .. f8
  |||||||_______ 10 .. f32
  ||||||________ SOUT output
  |||||_________ SOUT output, CLK enable
  ||||__________ output at falling edge, input = rising
  |||___________ MSB first
  ||____________ Internal Clock
  |_____________ SOUT3 Init Value LOW
*/

Soweit ich mich erinnere, konnte ich damit zwar die "normalen"
Register direkt auslesen, aber ich kam nicht an die PHY Register ran.
Ist auch möglich, dass das Schreiben nicht geklappt hat ...

@Ulli
Nein, das mit dem Endian hat eh gepasst. Der Fehler lag anscheinend an
den near/far Pointern beim M16C. Hab inzwischen alles daraufhin
angepasst und seitdem funktioniert es.

Autor: Sascha Str (sascha)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
So langsam vezweifle ich auch an der Hardware SPI. Laut Teiler, müßte
ich einen Clock von 8MHz haben, ausreichend um die MAC Register zu
schreiben und zu lesen. Und genau da harpert es. Die EREVID auslesen
funktioniert.
Bei der MAC Adresse, ließt er nur die MAADR5 aus.
Die erklärung dau, habe ich wohl auch schon. Der M16C62 kann nur
SPI-Mode 1 (0,1) und Mode 3 (1,1). Der ENC möchte aber laut Datenblatt
Mode0 (0,0).

Mfg Sascha

Autor: TheMason (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
@thomas

ich habe mir vor ein paar tagen auch den enc28j60 zukommen lassen. mit
dem dingen werde ich später mal was machen.
eine frage hab ich allerdings :

wenn jetzt zwei pakete reinkommen, wird dann nur das erste gespeichert
oder das zweite ?
mich wundert das du einen sw spi verwendest. ich dachte das ich um nen
hw spi nicht drum rum komme da mir sonst pakete verloren gehen.
ich habe das datenblatt des enc noch nicht angeschaut, aber wie verhält
es sich denn dann ? (mit den paketen)
für die ersten tests würde ich dann unter umständen auch sw spi
verwenden. (wenns denn machbar ist). ich werde allerdings mit einem
msp430 arbeiten

gruß
rene

Autor: Thomas B. (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
@TheMason
Also ob HW oder SW SPI sollte meiner Meinung nach egal sein;
vorrausgesetzt es kommt zu keinen Problemen aufgrund des Bugs im
ENC28J60 mit den 8Mhz, was bei mir aber nicht der Fall ist.

Wenn du HW SPI verwendest, musst du ja auch darauf warten bis die Daten
übertragen sind, ob du da wie beim HW-SPI darauf wartest bis das
entsprechende Bit gesetzt ist (bzw ein Interrupt kommt) oder wie beim
Software SPI die Befehle zum Übertragen nacheinander durchlaufen musst,
is ja prinzipiell egal.

@Sascha
Ja das mit den Moden hab ich auch mal gsehn, aber was is da der
Unterschied zwischen denen ?

Autor: Andy (Gast)
Datum:
Angehängte Dateien:

Bewertung
0 lesenswert
nicht lesenswert
Hallo,

ich habe mal mit dem 16C80 eine SD-Kalte mit Hardware-SPI angesteuert.
Vielleicht hilft euch mein Quellcode.

Andy

Autor: Sascha Str (sascha)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
@Thomas
Einmal der Pegel, wenn SPI nicht läuft, on High oder Low.
Ich habs auch noch nicht so ganz verstanden. In der App. steht z.B.
while( !ti_u2c1 ); // wait for tx buffer to empty
while( !txept_u2c0 ); // wait for tx register to empty
re_u2c1 = 0; // disable rx
te_u2c1 = 0; // disable tx
ckpol_u2c0 = 1; // drive CLK2 low
CHIP_SELECT = 1; // bring CS' high
ckpol_u2c0 = 0; // let CLK2 idle high

Dort wird CKPOL beim Transfer Ende umgeschaltet.

Mfg Sascha

Autor: Sascha Str (sascha)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
So,

Hardware-SPI funktioniert. Hast du Lust, das Projekt mit µIP zu
teilen?

Mfg Sascha

Autor: Thomas B. (thomasb)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Klar kann ich dir die Teile vom uIP zukommen lassen; bis jetzt hab ich
allerdings nicht viel mehr gmacht als das Ding an den M16C anzupassen.

Der Programmierstil der bei uIP verwendet wird, gefällt mir nicht so
wirklich ;) Deswegen werd ich da wohl im weiteren Verlauf einiges
umformatieren/umbauen. Hab mich auch schon etwas mit indent
rumgespielt, aber hier hab ich bis jetzt nicht rausgefunden, wie man
Tabulatoren zum Einrücken angeben kann (d.h. er macht mir nur eine
wählbare Anzahl Leerezeichen).

Autor: Sascha Str (sascha)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Kannst du mir gerne mal schicken. Dann brauche ich das Rad nicht neu zu
erfinden (:

sascha_streiber affenzeichen freenet punkt de

Gruß Sascha

Autor: Alex (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
@Sascha
Hast Du wirklich die Hardware-SPI mit dem EN28J60 laufen? Würde mich
auch gerne intereseieren wie du das gelöst hast. Denn laut Datenblatt
kann der EN28J60 nur SPI-Mode 0 und der M16C wiederum nur Mode 1 und 3.


In der Renesas App. Note wird der CKPOL am Ende umgeschaltet nur weil
der EEprom das verlangt.

Gruss,
Alex

Autor: Sascha Str (sascha)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
@Alex
So sieht die Init aus:

void init_spi(void)
{
  CS_ENC28J60_DDR = 1;
  CS_ENC28J60 = 1;
  ENC_RESET_DDR = 1;
  ENC_RESET = 1;
  ENC_RESET = 0;
  Delay(2000);
  ENC_RESET = 1;
  u2c0 = 0x90;
  u2c1 = 0x00;
  u2brg = 3 ;
  ckpol_u2c0 = 0;
  ckph_u2smr3 = 1;
  u2mr = 0x01;
}

Nachdem ich das Bit ckph_u2smr3 auf 1 gesetzt habe, geht es. Nur leider
nicht mit dem Code von Nik. Da hängt er sich nach 4 Ping`s weg.

Mfg Sascha

Autor: Nik Bamert (nikbamert)
Datum:
Angehängte Dateien:

Bewertung
0 lesenswert
nicht lesenswert
Hi Sascha!

Das kann fast nur sein, weil mein Code die ENC Errata noch nicht
vollständig erfüllt. Vielleicht habe ich einfach nur Glück(?), ich hab
die Errata nämlich nur noch nich implementiert, weil bei mir dennoch
alles wie am Schnürchen läuft.(siehe Screenshot) Jedenfalls habe ich in
2 Wochen wieder Zeit zum Coden, dann versuche ich alles mal umzusetzen
:-)

Nik

Autor: Sascha Str (sascha)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Muß nicht aber kann (:

Beim Avr läufts bei mir auch. Beim M16C jedoch nicht, kann an der
Umsetzung von mir liegen. Wenn ich die UDP Geschichte weglaß, hab ich
auch keine Probleme.

Mfg Sascha

Antwort schreiben

Die Angabe einer E-Mail-Adresse ist freiwillig. Wenn Sie automatisch per E-Mail über Antworten auf Ihren Beitrag informiert werden möchten, melden Sie sich bitte an.

Wichtige Regeln - erst lesen, dann posten!

  • Groß- und Kleinschreibung verwenden
  • Längeren Sourcecode nicht im Text einfügen, sondern als Dateianhang

Formatierung (mehr Informationen...)

  • [c]C-Code[/c]
  • [avrasm]AVR-Assembler-Code[/avrasm]
  • [code]Code in anderen Sprachen, ASCII-Zeichnungen[/code]
  • [math]Formel in LaTeX-Syntax[/math]
  • [[Titel]] - Link zu Artikel
  • Verweis auf anderen Beitrag einfügen: Rechtsklick auf Beitragstitel,
    "Adresse kopieren", und in den Text einfügen




Bild automatisch verkleinern, falls nötig
Bitte das JPG-Format nur für Fotos und Scans verwenden!
Zeichnungen und Screenshots im PNG- oder
GIF-Format hochladen. Siehe Bildformate.
Hinweis: der ursprüngliche Beitrag ist mehr als 6 Monate alt.
Bitte hier nur auf die ursprüngliche Frage antworten,
für neue Fragen einen neuen Beitrag erstellen.

Mit dem Abschicken bestätigst du, die Nutzungsbedingungen anzuerkennen.