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?
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 ?
Beim Debugging wird ein anderes Packet generiert und auch über die SPI-Schnittstelle gesendet. Muss man den Sendepuffer leeren?
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?
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
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
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)); |
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.
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?
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
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.