www.mikrocontroller.net

Forum: Mikrocontroller und Digitale Elektronik ENC28J60 Tx funktioniert nicht


Autor: Andy (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
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:
void enc28j60_Init(unsigned char *MAC)
{
  // Chip-Select einrichten
  CS_DIR |= CS;
  ClearCS();

  // Reset
  ResetMacSW();

  // Speicher-Setup für Empfagspuffer
  BankSel(0);
  WriteCtrReg(ERXSTL,LOWBYTE(RXSTART_INIT));
  WriteCtrReg(ERXSTH,HIGHBYTE(RXSTART_INIT));
  WriteCtrReg(ERXNDL,LOWBYTE(RXSTOP_INIT));
  WriteCtrReg(ERXNDH,HIGHBYTE(RXSTOP_INIT));

  // Speicher-Setup für Sendepuffer
  WriteCtrReg(ETXSTL, LOWBYTE(TXSTART_INIT));
  WriteCtrReg(ETXSTH, HIGHBYTE(TXSTART_INIT));

  // Lese-Zeiger auf Anfang
  WriteCtrReg(ERXRDPTL, LOWBYTE(RXSTART_INIT));
  WriteCtrReg(ERXRDPTH, HIGHBYTE(RXSTART_INIT));

  // Empfagsfilter setzen
//  BankSel(1);
//  WriteCtrReg(ERXFCON, ERXFCON_UCEN | ERXFCON_CRCEN | ERXFCON_BCEN);

  // MAC initialisieren
  BankSel(2);                             // select bank 2
  SetBitField(MACON1, MACON1_MARXEN|    // Enable reception of frames
            MACON1_TXPAUS|MACON1_RXPAUS);
//  WriteCtrReg(MACLCON2, 63);
  WriteCtrReg(MACON2, 0);
  SetBitField(MACON3, MACON3_FRMLNEN |    // Type / len field will be checked
                        MACON3_TXCRCEN |    // MAC will append valid CRC
                        MACON3_PADCFG0);    // All small packets will be padded


//  SetBitField(MACON4, MACON4_DEFER);
  WriteCtrReg(MAIPGL , 0x12);             // non back to back interpacket gap. set as per data sheet
  WriteCtrReg(MAIPGH , 0x0C);
  WriteCtrReg(MABBIPG, 0x12);             // back to back interpacket gap. set as per data sheet
  WriteCtrReg(MAMXFLL, LOWBYTE(MAXFRAMELEN));     // set max frame len
  WriteCtrReg(MAMXFLH, HIGHBYTE(MAXFRAMELEN));

  // MAC-Adresse schreiben
  BankSel(3);
  WriteCtrReg(MAADR6,*MAC++);
  WriteCtrReg(MAADR5,*MAC++);
  WriteCtrReg(MAADR4,*MAC++);
  WriteCtrReg(MAADR3,*MAC++);
  WriteCtrReg(MAADR2,*MAC++);
  WriteCtrReg(MAADR1,*MAC++);

  // PHY initialisieren
  WritePhyReg(PHCON2, PHCON2_HDLDIS);
  WritePhyReg(PHCON1, PHCON1_PDPXMD);

  // Interrupt ein
  BankSel(0);
  SetBitField(EIE, EIE_INTIE|EIE_PKTIE);

  // Empfang starten
  WriteCtrReg(ECON1, ECON1_RXEN);
}
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:
/** MACRO for rev B5 fix.*/
#define ErrataFix()   SetBitField(ECON1, ECON1_TXRST);ClrBitField(ECON1, ECON1_TXRST);ClrBitField(EIR, EIR_TXERIF | EIR_TXIF)

void enc28j60_PacketSend(unsigned char *Buffer, unsigned short BufferLen)
{
  // Schreibzeiger auf Paketanfang
  BankSel(0);
  WriteCtrReg(EWRPTL, LOWBYTE(TXSTART_INIT));
  WriteCtrReg(EWRPTH, HIGHBYTE(TXSTART_INIT));

  // TxEnde auf Paket-Ende
  WriteCtrReg(ETXNDL, LOWBYTE(TXSTART_INIT+BufferLen));
  WriteCtrReg(ETXNDH, HIGHBYTE(TXSTART_INIT+BufferLen));

  // Control-Byte schreiben
  unsigned char ControlByte = 0;
  WriteMacBuffer(&ControlByte, 1);

  // Puffer schreiben
  WriteMacBuffer(Buffer, BufferLen);

  // Paket abschicken
  ErrataFix();
  SetBitField(ECON1, ECON1_TXRTS);
}
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

Autor: Simon K. (simon) Benutzerseite
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Ich kann dir leider nicht direkt helfen, aber in meinem uWebServer ist 
auch noch ein (von mir geschriebene) ENC28J60 Treiber drin:
Beitrag "ENC28J60 (Mikro-)Web-Server die Nächste"

Kannst du ja mal damit abgleichen.

Autor: Andy (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
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

Antwort schreiben

Die Angabe einer E-Mail-Adresse ist freiwillig. Wenn Sie automatisch per E-Mail über Antworten auf Ihren Beitrag informiert werden möchten, melden Sie sich bitte an.

Wichtige Regeln - erst lesen, dann posten!

  • Groß- und Kleinschreibung verwenden
  • Längeren Sourcecode nicht im Text einfügen, sondern als Dateianhang

Formatierung (mehr Informationen...)

  • [c]C-Code[/c]
  • [avrasm]AVR-Assembler-Code[/avrasm]
  • [code]Code in anderen Sprachen, ASCII-Zeichnungen[/code]
  • [math]Formel in LaTeX-Syntax[/math]
  • [[Titel]] - Link zu Artikel
  • Verweis auf anderen Beitrag einfügen: Rechtsklick auf Beitragstitel,
    "Adresse kopieren", und in den Text einfügen




Bild automatisch verkleinern, falls nötig
Bitte das JPG-Format nur für Fotos und Scans verwenden!
Zeichnungen und Screenshots im PNG- oder
GIF-Format hochladen. Siehe Bildformate.
Hinweis: der ursprüngliche Beitrag ist mehr als 6 Monate alt.
Bitte hier nur auf die ursprüngliche Frage antworten,
für neue Fragen einen neuen Beitrag erstellen.

Mit dem Abschicken bestätigst du, die Nutzungsbedingungen anzuerkennen.