Forum: Mikrocontroller und Digitale Elektronik Wieder mal ENC28J60


von Thomas B. (Gast)


Lesenswert?

Hallo !

konnte zwar mein Problem mit dem Hardware SPI (
http://www.mikrocontroller.net/forum/read-1-309359.html#309359 ) noch
nicht lösen, aber mit der softwaremässigen Implentierung scheint es
halbwegs zu klappen.

Hab jetzt aber wieder das nächste Problem:
Die Daten die vom ENC empfangen und gesendet werden sind fehlerhaft und
stimmen nicht mit den von Ethereal aufgezeichneten überein.

Als Beispiel:

ARP Broadcast vom Computer an 192.168.0.20
PC (Etherreal):
0000  ff ff ff ff ff ff 00 11  d8 5e e0 2e 08 06 00 01   ........
.^......
0010  08 00 06 04 00 01 00 11  d8 5e e0 2e c0 a8 00 01   ........
.^......
0020  00 00 00 00 00 00 c0 a8  00 14                     ........ ..



Emfpang beim ENC:

rxstat: 0x0
len: 0x70
Received packet len: 112, type:0x21 | 33
Packet Contents
     00 01 02 03 04 05 06 07 08 09 0A 0B 0C 0D 0E 0F  0123456789ABCDEF
     -----------------------------------------------  ---- ASCII -----
0000 FF FF FF FF F0 02 76 2F E0 5C 20 30 00 21 00 03  ÿÿÿÿð.v/à\
0.!..

0010 04 00 04 00 1D 0B B8 17 C0 50 00 08 00 00 00 00  ......¸.ÀP......

0020 00 81 A0 00 40 00 00 00 00 00 00 00 00 00 00 00  . .@...........

0030 00 00 00 00 0B 1E 92 A7 B

D.h. schon die Länge stimmt nicht mit dem gesendeten überein, und bei
den Daten scheinen nur die ersten paar Bytes richtig zu sein (sofern
man das mit 0xFF beurteilen kann ;) )


Ähnliches spielt sich beim Senden ab:
ENC sendet ein UDP Packet an 255.255.255.255:4950 mit dem Inhalt
"hello_test".
Ethereal erhält:

0000  ff ff ff ff ff ff 66 55  44 33 22 11 08 00 59 00   ......fU
D3"...Y.
0010  00 4e 00 00 00 00 80 11  f3 fc c0 a8 00 14 ff ff   .N......
........
0020  ff ff 13 56 13 56 00 3a  00 00 bc 23 ff 90 b9 8a   ...V.V.:
...#....
0030  fa f1 07 1d 93 f3 48 89  c6 26 0b c7 a3 e2 b7 b2   ......H.
.&......
0040  07 a4 a1 33 73 4e f0 3c  a4 e7 3a 7c 2e 53 3e a1   ...3sN.<
..:|.S>.
0050  e8 ff 1f b0 da d4 b3 00  00 00 00 00               ........ ....


Hierbei sind dann aber die Source IP (192.168.0.20) und die MAC vom ENC
(665544332211) richtig. Nur der Rest der Daten ist wieder irgendwas...

Der Speicher vom ENC an sich dürfte keine Probleme machen; zumindest
zeigt der Speichertest (übernommen vom  Microchip Stack) daß alles in
Ordnung ist.
Die grundsätzlichen Routinen hab ich von der avrlib übernommen und an
soweit notwendig an meinen Controller (M16C) angepasst.

Was mir noch auffällt: Wenn ich das Bit LLSTAT vom PHSTAT1 Register
abfrage, erhalte ich die Antwort, daß der MAC Layer nicht verbunden
ist. Auch die Link Led leuchtet am ENC nicht; am Switch hingegen schon.
Die LED selber funktioniert aber.

Und noch etwas was mich interessiert: Was hat es mit dem Lesen der MAC
und MII Register auf sich; diese beginnen ja laut Datenblatt alle mit
MAC bzw MI und sind mit einem speziellen Lesebefehl zu behandeln, bei
dem erst ein Dummy Byte ausgelesen wird und erst danach das eigentliche
Datenbyte. Aber in der AVRLib wird auch für dir MAC Register der normale
Lesebefehl wie für die anderen Register benutzt; auch praktisch
funktioniert bei mir nur dieser.
Hab ich da in der Errata Note etwas dazu übersehen ? Oder verstehe ich
da irgendwas im Datenblatt falsch ?

Hat jemand ne Ahnung was ich da bei der Fehlersuche noch überprüfen
könnte ? Mir fällt langsam nichts mehr ein.

Schöne Grüße,
Thomas B.

von Ssss S. (sssssss)


Lesenswert?

>Aber in der AVRLib wird auch für dir MAC Register der normale
>Lesebefehl wie für die anderen Register benutzt; auch praktisch
>funktioniert bei mir nur dieser.
Achtung, man muss bei allen Regs die mit MA oder MI anfangen ein dummy
byte lesen.
In der avrlib wird es dadurch realisiert dass die ganzen defines mit
0x80 (bit7) verodert werden.
Bit7 wird sonst nicht genutzt -> es wird als Flag verwendet um zwischen
normal und extra dummy umzuschalten (clevere idee btw).
Die MAC regs werden auch alle mit extra dummy ausgelesen (siehe
enc28j60.h ....|0x80 )

Hängt sonst noch was am SPI ?
Wenn ich mein ISP Kabel nicht abziehe kommt auch nur murks an.

Wie hoch ist deine SPI BAudrate / welche chiprev ?

Laut errata soll man mit >8mhz lesen. Bei mir gehts aber auch mit den
ersten Samples mit 7.32/2 mhz...

Bye, Simon

von Jesper (Gast)


Lesenswert?

Note that the code from AVR-Lib does not implement the erratas.
You need to modify the code in a few places, to make workaraounds for
Errata #2,6,12 and 13.
Especially #13 is important.
Without these modifications/workaraounds, the driver is unreliable.

I have no problems with using lower speed than 8 MHz either.

/Jesper

von Ssss S. (sssssss)


Lesenswert?

@jesper:
how do you fix #6 ?
if i try to use:
1
if (enc28j60_read_address(ENC28J60_REG_EPKTCNT) == 0)
2
 return;

instead of
1
if ((enc28j60_read_address(ENC28J60_REG_EIR) &
2
(1<<ENC28J60_BIT_PKTIF)) == 0)
3
return 0;
it receives some packets ~10 times...

the PKTIF flag works as expected. (rev2 of enc28j60)

#13 never happened during my whole tests...

Bye, Simon

von Thomas B. (Gast)


Lesenswert?

@ssss

also als Controller benutze ich einen Renesas M16C/62P. Wie hoch die
SPI Frequenz bei mir jetzt genau ist, kann ich im Moment nicht sagen,
da ich SPI zur Zeit nur softwaremässig implementiert hab (um die
Probleme mit dem Hardware SPI in den Griff zu bekommen werd ich mir das
mal mit einem Logic Analyzer genauer anschaun müssen). Die Taktfrequenz
des Controllers beträgt 24Mhz. (d.h. schätzungsweise hab ich bei den
getestesteten SPI-Clocks einen Bereich von irgendwas bis 10MHz
abgedeckt)
Habe aber auch schon ziemlich mit den diversen Delays herumprobiert,
ohne merkbarer Veränderung des Verhaltens.

Prinzipiell funktioniert ja das Auslesen der Register; Hierzu die
Ausgabe der Register nach der Initialisierung des ENC:

RevID: 0x2
EIE: 0x0 EIR: 0x0 ESTAT: 0x1 ECON2: 0x80 ECON1: 0x7
MAC   MACON1: 0xD MACON2: 0x0 MACON3: 0x32 MACON4: 0x0
MACADDR   0x66 0x55 0x44 0x33 0x22 0x11
Rx
  ERXSTL: 0x0  ERXSTH: 0x6  ERXNDL: 0xFF  ERXNDH: 0x1F
  ERXWRPTH: 0x0  ERXWRPTL: 0x0  ERXRDPTH: 0x6  ERXRDPTL: 0x0
  ERXFCON: 0xA1  EPKTCNT: 0x0  MAMXFLH: 0x5  MAMXFLL: 0xEE

Tx
  ETXSTH: 0x0  ETXSTL: 0x0  ETXNDH: 0x0  ETXNDL: 0x0
  MACLCON1: 0xF  MACLCON2: 0x37  MAPHSUP: 0x10

Teste ENC Speicher ...  OK
Initializing Network Stack
Initializing Network Device
Initializing ARP cache
Initializing Addressing
Eth Addr is: 102:85:68:51:34:17:
IP  Addr is: 192.168.0.20
Network Stack is up!
MAC is not linked!
MAC is TX ready
Starting packet receive loop

von Jesper (Gast)


Lesenswert?

In start of enc28j60PacketReceive, I have this :

  // check if a packet has been received and buffered
  if( !(enc28j60Read(EIR) & EIR_PKTIF) )
  {
    // Errata workaround #6, PKTIF is not reliable
    // double check by looking at EPKTCNT
    if (enc28j60Read(EPKTCNT) == 0)
      return 0;
  }

Errata #13 is fixed like this a little later in the same function :

/* old code
  enc28j60Write(ERXRDPTL, (NextPacketPtr));
  enc28j60Write(ERXRDPTH, (NextPacketPtr)>>8);
*/
  // Errata workaround #13. Make sure ERXRDPT is odd
  //
  {
    uint16_t rs,re;
    rs = enc28j60Read(ERXSTH);
    rs <<= 8;
    rs |= enc28j60Read(ERXSTL);
    re = enc28j60Read(ERXNDH);
    re <<= 8;
    re |= enc28j60Read(ERXNDL);
    if (NextPacketPtr - 1 < rs || NextPacketPtr - 1 > re)
    {
      enc28j60Write(ERXRDPTL, (re));
      enc28j60Write(ERXRDPTH, (re)>>8);
    }
    else
    {
      enc28j60Write(ERXRDPTL, (NextPacketPtr-1));
      enc28j60Write(ERXRDPTH, (NextPacketPtr-1)>>8);
    }
  }


Sorry about the format, but I can find documentation of which tags to
use to make the code look nice and readable, like Simon did.

/Jesper

von Jesper (Gast)


Lesenswert?

I just saw your comment about #13 never happening for you. That's
interesting, because I got that very often.
The stack would hang and when I looked at the registers, ERXRDPT was
even. I added the fix, and it's been running for days now.
The test server is at http://www.slugone.mine.nu

/Jesper

von Ssss S. (sssssss)


Lesenswert?

I checked my code and i saw that i always use an even number for the rx
pointer.
My RX Region starts at 0x0602 and i have not recognized any problems
yet.
the counter goes up to 0x1FFF and then wraps around to 0x0602.
the revision register says it is an 0x02 revision (DIP)

you can format your code by using [ c ] code [ /c ] (without the extra
spaces)

it seems like i killed your server... i klicked multiple times reload
to see how the counter works. Then after ~5 tries the server does no
longer respond :-X sorry...

Bye, Simon

von Thomas B. (Gast)


Lesenswert?

Um diesem Thread hier ein positives Ende zu geben :
Der ENC läuft jetzt; allerdings hab ich die ganzen Funktionen (bis auf
das Software-SPI) neu geschrieben. Als Vorlage hab ich aber diesmal die
Microchip Firmware selber gewählt (wo dann auch gleich die Erratas
eingearbeitet sind).

Bin jetzt grade dran den ganzen Stack selber neu zu schreiben (der
Microchip Code ist mir zu aufgebläht).
Was mir da aber aufgefallen ist:
Es wird dort nirgends das MARST Bit zurückgesetzt; auch ein Register
Dump nach der Initialisierung zeigt, daß das Bit noch gesetzt ist.
Das Senden eines IP und ICMP Packets funktioniert aber einwandfrei
(grad nochmal getestet weil ich mir nicht sicher war).

Braucht dieses Bit entgegen dem Datenblatt doch nicht selber
zurückgesetzt werden ? Oder geschieht das irgendwie anders ?
Wie gesagt, bei mir funktionierts auch so; es würd mich jetzt nur
interessieren wieso das nichts ausmacht, bzw was ich da übersehe ...

Schöne Grüße,
Thomas

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.