Forum: Mikrocontroller und Digitale Elektronik ENC28j60 schickt zwei identische Pakete


von As B. (b-a)


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?

von Hal (Gast)


Lesenswert?

Der 80J60 ist zu doof irgendwas von selbst zu tun. Er macht, falls 
ueberhaubpt irgendwas, das was mas man ihm sagt. Keine 
debugmoeglichkeiten ? ZB um zu schauen, was dem 80J60 gesagt wird ?

von As B. (b-a)


Lesenswert?

Beim Debugging wird ein anderes Packet generiert und auch über die 
SPI-Schnittstelle gesendet.
Muss man den Sendepuffer leeren?

von As B. (b-a)


Lesenswert?

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?

von Εrnst B. (ernst)


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

von As B. (b-a)


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

von Εrnst B. (ernst)


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

von As B. (b-a)


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.

von As B. (b-a)


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?

von As B. (b-a)


Lesenswert?

Okay, Fehler gefunden.

Ich hatte vergessen, dass ich in Bank1 bin. Nachdem ich immer wenn ich 
auf ein Paket warte jetzt wieder auf Bank0 schalte funktioniert es.

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.