Hallo zusammen,
ich stehe momentan ziemlich auf dem Schlauch.
Habe einen ENC28J60 an einem LPC2129 sowie uIP als Stack. Momentan
scheitere ich am Senden eines Paketes (getestet mit dem beliebten ping).
Die Anfrage wird korrekt empfangen und uIP generiert auch ein sinnvolles
Antwort-Paket. Das kommt allerdings nie zum PC zurück.
Habe eine andere Implementierung des ENC28J60-Treibers ausprobiert und
die funktioniert (ist nur ein wenig chaotisch geschrieben, über
Geschmack läßt sich bekanntlich streiten). Nur bin ich irgendwie zu
doof, den Unterschied zu meiner Implementierung zu finden.
Zumindest bin ich sicher, daß die Hardware und meine SPI-Routinen
funktionieren.
Die Initialisierung sieht bei mir folgendermaßen aus:
SetBitField(MACON1,MACON1_MARXEN|// Enable reception of frames
32
MACON1_TXPAUS|MACON1_RXPAUS);
33
// WriteCtrReg(MACLCON2, 63);
34
WriteCtrReg(MACON2,0);
35
SetBitField(MACON3,MACON3_FRMLNEN|// Type / len field will be checked
36
MACON3_TXCRCEN|// MAC will append valid CRC
37
MACON3_PADCFG0);// All small packets will be padded
38
39
40
// SetBitField(MACON4, MACON4_DEFER);
41
WriteCtrReg(MAIPGL,0x12);// non back to back interpacket gap. set as per data sheet
42
WriteCtrReg(MAIPGH,0x0C);
43
WriteCtrReg(MABBIPG,0x12);// back to back interpacket gap. set as per data sheet
44
WriteCtrReg(MAMXFLL,LOWBYTE(MAXFRAMELEN));// set max frame len
45
WriteCtrReg(MAMXFLH,HIGHBYTE(MAXFRAMELEN));
46
47
// MAC-Adresse schreiben
48
BankSel(3);
49
WriteCtrReg(MAADR6,*MAC++);
50
WriteCtrReg(MAADR5,*MAC++);
51
WriteCtrReg(MAADR4,*MAC++);
52
WriteCtrReg(MAADR3,*MAC++);
53
WriteCtrReg(MAADR2,*MAC++);
54
WriteCtrReg(MAADR1,*MAC++);
55
56
// PHY initialisieren
57
WritePhyReg(PHCON2,PHCON2_HDLDIS);
58
WritePhyReg(PHCON1,PHCON1_PDPXMD);
59
60
// Interrupt ein
61
BankSel(0);
62
SetBitField(EIE,EIE_INTIE|EIE_PKTIE);
63
64
// Empfang starten
65
WriteCtrReg(ECON1,ECON1_RXEN);
66
}
Die Auskommentierten Zeilen stehen im funktionierenden Treiber nicht
drin, haben aber keine Auswirkung auf die Anwesenheit meines Problems.
Die Sende-Routine schaut bei mir so aus:
Schon mit und ohne ErrataFix() probiert, hat nichts geändert.
Der Puffer-Inhalt, der in die Routine übergeben wird, stimmt. Die
Sub-Funktionen sollten auch in sich funktionieren, sonst käme ich mit
dem Lesen der enc-Register und dem Empfang ja auch nicht klar.
Die Register haben bei mir vor & nach dem Senden den gleichen Inhalt
(über 1min nach Senden getestet):
ESTAT 0x01
EIR 0x08
EIE 0xc0
ECON1 0x04
ECON2 0x80
Sieht jemand, woran es liegen könnte? Oder hat jemand einen Vorschlag,
wie ich der Wurzel des Problems näher kommen könnte?
Grüzi
Andy
Hallo Simon,
danke für den Link. Deine Speicheradressen im ENC sind anders als bei
dem Treiber, der bei mir funktioniert.
Habe jetzt die Speicheradressen geändert und schreibe den Sendepuffer
jetzt an einem Stück in den ENC (ohne zwischen Controll-Byte und Daten
CS wegzunehmen).
Das Ergbnis ist interessant: ARP funktioniert, ICMP nicht.
Da ich an uIP nichts geändert habe, vermute ich noch einen Fehler im
Puffer von Rx oder Tx.
Muß ich weitersuchen...
Danke!
Andy