ENC28j60 Bufferadressen berechnen

OP #517186
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?
Gast #517616
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.
OP #521047
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?
Gast #521063
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

Bitte melde dich an, um einen Beitrag zu schreiben.

oder

Mit Google-Account einloggen

Die Registrierung ist kostenlos und dauert nur eine Minute.

Jetzt registrieren