ENC28J60 Errata #11 (ERXRDPT)

OP #3166994
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?
Gast #3167105
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.
OP #3167347
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?
OP #3167351
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)
#3167400
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
OP #3167976
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.

Antwort schreiben

Eine eigene Frage? Dieser Thread ist über 13 Jahre alt. Stell sie in einem eigenen Thread – dort lesen mehr Leute mit, und sie wird öfter und schneller beantwortet.

Neuen Thread starten

Eine Lösung, Ergänzung oder Rückmeldung zu diesem Thread? Dann antworte hier.

Formatierung
  • [c]C-Code[/c]
  • [code]Code in anderen Sprachen, ASCII-Zeichnungen[/code]
  • [math]Formel in LaTeX-Syntax[/math]
  • [[Titel]] – Link zu einem Artikel
  • Verweis auf einen anderen Beitrag: Rechtsklick auf dessen Beitrags-ID (#8078628), „Adresse kopieren“, in den Text einfügen

Mehr zur Formatierung

Längeren Sourcecode als Anhang, nicht in den Text. JPG nur für Fotos und Scans; Zeichnungen und Screenshots als PNG oder GIF. Siehe Bildformate.

Schon registriert? Anmelden

Wird nicht angezeigt. Wir schicken dir einen Link; sobald du damit bestätigst, erscheint dein Beitrag.

Mit dem Abschicken legst du einen kostenlosen Account an und erkennst die Nutzungsbedingungen und die Datenschutzerklärung an.