Forum: Mikrocontroller und Digitale Elektronik ENC28J60 Errata #11 (ERXRDPT)


von Cube S. (cube_s)


Lesenswert?

Der ENC28J60 liefert ja mit jedem Ethernet Frame einen Header der einen 
Pointer auf den nächsten Receive-Buffer zeigt. Diesen schreibe ich wie 
im Datenblatt empfohlen nach Auswertung des Frames in das Registerpaar 
ERXRDPT. Die Rev B7 Silicon Errata empfiehlt jedoch darauf zu achten, 
dass dieser Pointer stets ungerade beschrieben werden soll. Man wähle 
dazu einfach den Pointer aus dem Header minus 1.

Sobald ich der Empfehlung aus den Errata folge, geht nach dem 1. Frame 
schon nichts mehr weil ich völlig unsinnige Werte im Header erhalte 
nachdem ich den modifizierten Pointer einmal geschrieben habe.

Kurz und gut: So wie im Datenblatt geht es (auch über Stunden), der 
Workaround aus den Errata funktioniert nicht.

Gibt es Errata zu den Errata oder habe ich etwas ganz banales vergessen. 
Kennt sonst noch jemand dieses Verhalten?

von c-hater (Gast)


Lesenswert?

Cube S. schrieb:

> Die Rev B7 Silicon Errata empfiehlt jedoch darauf zu achten,
> dass dieser Pointer stets ungerade beschrieben werden soll.

Das ja.

> Man wähle
> dazu einfach den Pointer aus dem Header minus 1.

Das nein. Du mußt dringend an deinem Verständnis des Datenblatt-Englisch 
arbeiten.

von Cube S. (cube_s)


Lesenswert?

c-hater schrieb:
> Das nein. Du mußt dringend an deinem Verständnis des Datenblatt-Englisch
> arbeiten.

Da steht:

Ensure that only odd addresses are written to the ERXRDPT registers. 
Assuming that ERXND con- tains an odd value, many applications can 
derive a suitable value to write to ERXRDPT by subtracting one from the 
Next Packet Pointer (a value always ensured to be even because of 
hardware padding) and then compensating for a potential ERXST to ERXND 
wrap-around.

Was verstehe ich hier falsch?

von Andreas G. (beastyk)


Lesenswert?

Ich glaub das meint eher das du einen Wert von nem anderen Wert abziehst 
und nicht das du den Pointer um eins erniedrigst.

von Cube S. (cube_s)


Lesenswert?

1
if (Next Packet Pointer = ERXST) 
2
  then:
3
ERXRDPT = ERXND 
4
  else:
5
ERXRDPT = Next Packet Pointer – 1
So steht's geschrieben. Heißt für mich eins abziehen und genau so mache 
ich das auch. Im eher seltenen Fall, dass ERXRDPT=ERXND ausgeführt wird 
führt es übrigens zum gleichen Fehler. (ERXND ist wie in den Errata 
empfohlen ungerade)

von Uwe B. (derexponent)


Lesenswert?

Hi Cube S.,

du hast das schon richtig verstanden
und dein "Programm" sieht auch ok aus
(wenn du darauf geachtet hast, das alles 16bit Werte sind)

muss also irgendwo noch ein anderer Fehler sein
hier mal meinen Code (vom ATMega2560) zum vergleich der funktioniert
1
    //-----------------------------------------------
2
    // VORSICHT !! das hier ist ein Workaround
3
    // aus dem Errata-Sheet Punkt.14 (Seite 6) 
4
    // -> es duerfen nur ungerade Adressen in 
5
    //    ERXRDPT geschrieben werden
6
    //-----------------------------------------------
7
8
    // ERXST,Bank0 auslesen
9
    ENC_setControlRegisterBank(0);
10
    lo=ENC_readControlRegisterE(ENC28J60_CRE_ERXSTL);
11
    hi=ENC_readControlRegisterE(ENC28J60_CRE_ERXSTH);
12
    uint=(hi<<8);
13
    uint=(uint|lo);
14
15
    // Pointer fuer RX neu einstellen
16
    // und damit den Speicher wieder freigeben
17
    if(ENC_RX_POINTER==ENC_RX_START) {
18
      // Pointer für RX ganz normal einstellen
19
      lo=(ENC_RX_ENDE&0x00FF);
20
      hi=(ENC_RX_ENDE>>8);
21
      ENC_writeControlRegister(ENC28J60_CRE_ERXRDPTL,lo);
22
      ENC_writeControlRegister(ENC28J60_CRE_ERXRDPTH,hi);      
23
    }
24
    else {
25
      uint=(ENC_RX_POINTER-1);
26
      lo=(uint&0x00FF);
27
      hi=(uint>>8);
28
      ENC_writeControlRegister(ENC28J60_CRE_ERXRDPTL,lo);
29
      ENC_writeControlRegister(ENC28J60_CRE_ERXRDPTH,hi); 
30
    }
31
32
    // Packet Counter um 1 decrementieren
33
    wert=0;
34
    wert|=0x40; // PKTDEC Bit setzen
35
    ENC_setBitRegister(ENC28J60_CRE_ECON2,wert);

Gruss Uwe

von Cube S. (cube_s)


Lesenswert?

Uwe B. schrieb:
> muss also irgendwo noch ein anderer Fehler sein

So ist es: Ich hatte den modifizierten Pointer nach Empfang des nächsten 
Paketes dann auch als Paketstart verwendet (also ERXRDPT) und nicht den 
originalen NextPointer. Und kaum macht man's richtig schon geht's.

Danke für die Hinweise.

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.