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?
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.
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?
Ich glaub das meint eher das du einen Wert von nem anderen Wert abziehst und nicht das du den Pointer um eins erniedrigst.
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)
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
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
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.