ENC28j60 schickt zwei identische Pakete

OP #535584
Lesenswert?

Ich schicke eine DHCP-Request-Anfrage an den DHCP-Server. Bekomme ich 
keine Antwort, soll der ENC28j60 eine DHCP-Offer-Anfrage schicken. Nur 
leider schickt er wieder die erste Anfrage. Beim Debuggen des 
Mikrocontrollers konnte ich festellen, dass der Mikrocontroller die 
Daten für ein DHCP-Offer dem ENC28j60 schickt. Woran kann das liegen?
#536876
Lesenswert?

As B- wrote:
> Es wird definitiv ein anderes Packet generiert und auch zum ENC28j60
> gesendet.
> Irgendwie merkt sich der ENC28j60 das Packet und überschreibt nicht
> seinen Inhalt. Muss ich irgendwas beachten?

Kontrolier mal den Pointer für die aktuelle Schreibposition.
Für das nächste Packet den wieder an den Anfang des Sendebuffers setzen, 
und somit das erste Packet Überschreiben, oder beim Senden vom Zweiten 
Packet auch die richtige Position im Sendebuffer angeben.

/Ernst
OP #537793
Lesenswert?

Ich setze erst die Startadresse des Sendebuffers (ETXST). Dann setze ich 
den Pointer (EWRPTL). Dann schreibe ich die Daten mit 
Write_Buffer_Memory ind den Puffer. Dann setze ich die Endadresse des 
Sendebuffers (ETXND). Dann setze ich TXRST in ECON1 und lösche es 
wieder. Nun starte ich den Sendeprozess mit dem setzen des Bits TXRTS in 
ECON1.
So sieht meine Senderoutine aus. Hab ich irgendwass vergessen?

Dirk
#537880
Lesenswert?

As B- wrote:
..
> So sieht meine Senderoutine aus. Hab ich irgendwass vergessen?

Denke nicht, hier mal ein Codeschnipsel aus einem anderen Projekt:
1
    //setup write pointer:
2
        enc28j60_write_address(ENC28J60_REG_EWRPTL, (ENC28J60_TX_BUFFER_START&0xFF));
3
        enc28j60_write_address(ENC28J60_REG_EWRPTH, (ENC28J60_TX_BUFFER_START)>>8);
4

5
        //set tx end pointer to [start+len]:
6
        enc28j60_write_address(ENC28J60_REG_ETXNDL, (ENC28J60_TX_BUFFER_START+len)&0xFF);
7
        enc28j60_write_address(ENC28J60_REG_ETXNDH, (ENC28J60_TX_BUFFER_START+len)>>8);
8

9
        //start buffer write command
10
        enc28j60_spi_write_word(ENC28J60_OP_WRITE_BUF_MEM, 0x00);
11

12
        //copy buffer to enc28j60:
13
        enc28j60_write_buffer(buffer, len);
14

15
        //bad silicon workaround:
16
        //reset tx logic:
17
        enc28j60_spi_write_word(ENC28J60_OP_BFS | ENC28J60_REG_ECON1, (1<<ENC28J60_BIT_TXRST));
18
        enc28j60_spi_write_word(ENC28J60_OP_BFC | ENC28J60_REG_ECON1, (1<<ENC28J60_BIT_TXRST));
19

20
        //activate transmission
21
        enc28j60_spi_write_word(ENC28J60_OP_BFS | ENC28J60_REG_ECON1,(1<<ENC28J60_BIT_TXRTS)|(1<<ENC28J60_BIT_RXEN));
OP #538431
Lesenswert?

Ich sehe den Unterschied, dass der ETXST nicht überschrieben wird, und 
das ETXND vor dem Schreiben in den Buffer gesetzt wird.
Okay, jetzt ist es so, dass ich mich mit über NBNS registriere 4 
unterschiedliche Packete senden muss und dass geht einwandfrei.
OP #562686
Lesenswert?

Okay, es gibt weitere Erkenntnisse. Schicke ich das Packet ca. 1 Sekunde 
später, wird das letzte Packet versendet (und dass ist immer dasselbe).
Schicke ich die Packete sofort hintereinander, wird das Packet 
verändert.

Woran kann das liegen?

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