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
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
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
@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.
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
@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
@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 ?
Hallo, ich habe mal mit dem 16C80 eine SD-Kalte mit Hardware-SPI angesteuert. Vielleicht hilft euch mein Quellcode. Andy
@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
So, Hardware-SPI funktioniert. Hast du Lust, das Projekt mit µIP zu teilen? Mfg Sascha
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).
Kannst du mir gerne mal schicken. Dann brauche ich das Rad nicht neu zu erfinden (: sascha_streiber affenzeichen freenet punkt de Gruß Sascha
@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
@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
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
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
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.