Wenn der Empfangsbuffer vom ENC28j60 überläuft (er überschreibt die ältesten Daten) initialisiere ich meinen Readpointer neu und ich bekomme die restlichen Daten. Nur habe ich jetzt das Problem, dass ich keine Packete mehr bekomme. Woran kann das liegen? Muss ich irgendein Bit löschen oder setzen?
Hallo, eigentlich sollte der Interne Puffer nicht überlaufen, das sollte der interne Controller verhindern indem neue eintreffende Packete verworfen werden, das wäre zumindest RFC-konform. Dirk
Was muss ich tun, wenn der Buffer voll läuft? Derzeit initialisiere ich den Buffer neu.
Schau mal im Datenblatt, du mußt glaube einfach nur einen Pointer um die Anzahl Bytes vermindern, die das letzte Paket groß war. Der Interne Puffer läuft übrigens nicht über. Wenn er voll ist, weil man z. B. vergessen hat, Speicher wieder freizugeben, werden in der Tat alle weiteren Pakete verworfen.
So wie ich verstehe muss ich nach dem ich ein Packet abgearbeitet habe, das Register ERXRDPT aktualisieren.
Den ERXRDPT am Schluss zu aktualisieren hat leider auch nichts gebracht. Ich habe soger das Bit RXERIF gelöscht. Sobald er vom Ende des Buffers zum Anfang springt muss ich alles neu initialisieren, damit der Empfang wieder funktioniert. Welches Register muss ich aktualisieren, damit ich nicht neu initialisieren muss?
int enc28j60PacketReceive(void) { int rxstat; //check if a packet has been received and buffered if (enc28j60Read(EPKTCNT) == 0) { return 0; } //Set the read pointer to the start of the received packet #ifdef WEB_DEBUG_TCPIP printf("ENC28J60 block received\r\n"); printf("Actual read address: %04x\r\n", NextPacketPtr); #endif enc28j60Write(ERDPTL, LO(NextPacketPtr)); enc28j60Write(ERDPTH, HI(NextPacketPtr)); //read the next packet pointer NextPacketPtr = (int)(enc28j60ReadOp(ENC28J60_READ_BUF_MEM, 0)); NextPacketPtr |= (int)(enc28j60ReadOp(ENC28J60_READ_BUF_MEM, 0)) << 8; #ifdef WEB_DEBUG_TCPIP printf("Next read address: %04x\r\n", NextPacketPtr); #endif //read the packet length RecdFrameLength = (int)(enc28j60ReadOp(ENC28J60_READ_BUF_MEM, 0)); RecdFrameLength |= (int)(enc28j60ReadOp(ENC28J60_READ_BUF_MEM, 0)) << 8; #ifdef WEB_DEBUG_TCPIP printf("Bytes read: %04x\r\n", RecdFrameLength); #endif //read the receive status rxstat = (int)(enc28j60ReadOp(ENC28J60_READ_BUF_MEM, 0)); rxstat |= (int)(enc28j60ReadOp(ENC28J60_READ_BUF_MEM, 0)) << 8; #ifdef WEB_DEBUG_TCPIP printf("Receive status: %04x\r\n", rxstat); #endif //copy the packet from the receive buffer enc28j60ReadBuffer(); //Move the RX read pointer to the start of the next received packet //This frees the memory we just read out //Errata workaround #13, Packetpointer must not contain even number if((NextPacketPtr - 1) == 0xFFFF) { enc28j60Write(ERXRDPTL, LO(RXSTOP_INIT)); enc28j60Write(ERXRDPTH, HI(RXSTOP_INIT)); } else { enc28j60Write(ERXRDPTL, LO(NextPacketPtr - 1)); enc28j60Write(ERXRDPTH, HI(NextPacketPtr - 1)); } //decrement the packet counter indicate we are done with this packet enc28j60WriteOp(ENC28J60_BIT_FIELD_SET, ECON2, ECON2_PKTDEC); return rxstat; }
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.