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


von Thomas B. (Gast)


Angehängte Dateien:

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

von Sascha S. (sascha)


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

von Ulli (Gast)


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

von Thomas B. (Gast)


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.

von Sascha S. (sascha)


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

von TheMason (Gast)


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

von Thomas B. (Gast)


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 ?

von Andy (Gast)


Angehängte Dateien:

Lesenswert?

Hallo,

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

Andy

von Sascha S. (sascha)


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

von Sascha S. (sascha)


Lesenswert?

So,

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

Mfg Sascha

von Thomas B. (thomasb)


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

von Sascha S. (sascha)


Lesenswert?

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

sascha_streiber affenzeichen freenet punkt de

Gruß Sascha

von Alex (Gast)


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

von Sascha S. (sascha)


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

von Nik B. (nikbamert)


Angehängte Dateien:

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

von Sascha S. (sascha)


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

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.