Forum: Mikrocontroller und Digitale Elektronik ENC28j60 Bufferadressen berechnen


von As B. (b-a)


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?

von Dirk B. (sharandac)


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

von As B. (b-a)


Lesenswert?

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

von Katzebuckel (Gast)


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.

von As B. (b-a)


Lesenswert?

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

von As B. (b-a)


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?

von Peter (Gast)


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;
}

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
Noch kein Account? Hier anmelden.