ENC28j60 Bufferadressen berechnen

OP #517186
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?
Gast
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.
OP
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?
Gast
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;
}

Antwort schreiben

Eine eigene Frage? Dieser Thread ist über 19 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.