mikrocontroller.net

Forum: Mikrocontroller und Digitale Elektronik ENC28j60 Bufferadressen berechnen


Autor: As B- (b-a)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
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?

Autor: Dirk Broßwick (sharandac)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
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

Autor: As B- (b-a)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Was muss ich tun, wenn der Buffer voll läuft?
Derzeit initialisiere ich den Buffer neu.

Autor: Katzebuckel (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
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.

Autor: As B- (b-a)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
So wie ich verstehe muss ich nach dem ich ein Packet abgearbeitet habe, 
das Register ERXRDPT aktualisieren.

Autor: As B- (b-a)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
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?

Autor: Peter (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
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

Die Angabe einer E-Mail-Adresse ist freiwillig. Wenn Sie automatisch per E-Mail über Antworten auf Ihren Beitrag informiert werden möchten, melden Sie sich bitte an.

Wichtige Regeln - erst lesen, dann posten!

  • Groß- und Kleinschreibung verwenden
  • Längeren Sourcecode nicht im Text einfügen, sondern als Dateianhang

Formatierung (mehr Informationen...)

  • [c]C-Code[/c]
  • [avrasm]AVR-Assembler-Code[/avrasm]
  • [code]Code in anderen Sprachen, ASCII-Zeichnungen[/code]
  • [math]Formel in LaTeX-Syntax[/math]
  • [[Titel]] - Link zu Artikel
  • Verweis auf anderen Beitrag einfügen: Rechtsklick auf Beitragstitel,
    "Adresse kopieren", und in den Text einfügen




Bild automatisch verkleinern, falls nötig
Bitte das JPG-Format nur für Fotos und Scans verwenden!
Zeichnungen und Screenshots im PNG- oder
GIF-Format hochladen. Siehe Bildformate.
Hinweis: der ursprüngliche Beitrag ist mehr als 6 Monate alt.
Bitte hier nur auf die ursprüngliche Frage antworten,
für neue Fragen einen neuen Beitrag erstellen.

Mit dem Abschicken bestätigst du, die Nutzungsbedingungen anzuerkennen.