www.mikrocontroller.net

Forum: Compiler & IDEs ENC28J60 - Build in self test


Autor: Josef (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hallo zusammen,

ich habe mich mal daran gemacht den Self Test des ENC28J60 in die 
Treiber des Chips von Simon Kuepers einzupflegen. Leider schaffe ich es 
nicht diese Funktion fehlerfrei zu durchlaufen, obwohl mein ENC 
offensichltich funktioniert (sprich mein Programm läuft problemlos 
damit).
Ich habe zwar noch nie mit dem ENC Probleme gehabt, aber eine solche 
Funktion wäre mir schon noch recht.
Ich Poste meine Quellcode hier mal. Evtl. seht ihr ja den Fehler.
int Enc28j60Heartbeat(void)
{  
  LED_RT(0);
  DESELECT();
  //Siehe Seite 75 im Datenblatt
  Enc28j60WriteReg(BANKX_ECON1, Enc28j60ReadReg(BANKX_ECON1) & 0xD3);
  Enc28j60SwitchBank(BANK0);
  Enc28j60WriteReg(BANK0_EDMASTL, 0x00);
  Enc28j60WriteReg(BANK0_EDMASTH, 0x00);
  Enc28j60WriteReg(BANK0_EDMANDL, 0xFF);
  Enc28j60WriteReg(BANK0_EDMANDH, 0x1F);
  Enc28j60WriteReg(BANK0_ERXNDL, 0xFF);
  Enc28j60WriteReg(BANK0_ERXNDH, 0x1F);
  Enc28j60SetMaskReg(BANKX_ECON1, (1<<BANKX_ECON1_CSUMEN));
  //Enable Test mode, select the desired test, select the desired port configuration for the test.
  //Autofill normal Port Conf
  Enc28j60SwitchBank(BANK3);
  //Set TME
  Enc28j60SetMaskReg(BANK3_EBSTCON, (1<<1));  
  //Set TMSEL0
  Enc28j60SetMaskReg(BANK3_EBSTCON, (1<<2));
  //Set TMSEL1
  Enc28j60ClearMaskReg(BANK3_EBSTCON, (1<<3));
  //Set PSLE
  Enc28j60ClearMaskReg(BANK3_EBSTCON, (1<<4));
  //START  Set BIST
  Enc28j60SetMaskReg(BANK3_EBSTCON,(1<<0));
  Enc28j60SetMaskReg(BANKX_ECON1, (1<<BANKX_ECON1_DMAST));
  
  starttime();
  while( (0x20 & Enc28j60ReadReg(BANKX_ECON1)) != 0x20)
  {
    //mindestens 100ms
    if(gettime() >= 100)  
    {      
      //Fehler
      LED_RT(1);
      Enc28j60Reset();
      stoptime();
      cleartime();
      return 2;
    }
  }
  
  //Berechnung fertig
  Enc28j60SwitchBank(BANK0);
  uint8_t edmacsl = Enc28j60ReadReg(BANK0_EDMACSL);
  uint8_t edmacsh = Enc28j60ReadReg(BANK0_EDMACSH);
  Enc28j60SwitchBank(BANK3);
  uint8_t ebstcsl = Enc28j60ReadReg(BANK3_EBSTCSL);
  uint8_t ebstcsh = Enc28j60ReadReg(BANK3_EBSTCSH);
  if( edmacsl ==  ebstcsl &&  edmacsh == ebstcsh)
    {
      //Fehlerfrei
      stoptime();
      cleartime();
      return 0;
    }
  else
    {
    //Fehler
    Enc28j60Reset();
    stoptime();
    cleartime();
    return 1;
  }
}

Sobald ich die Funktion ausführe, bekomme ich immer einen Returnwert von 
1.
ebstcsl und ebstcsh sind immer 0x00.

Autor: Josef (Gast)
Datum:
Angehängte Dateien:

Bewertung
0 lesenswert
nicht lesenswert
Hat keiner eine Idee? Ich hab mal die enc28j60.h und .c beigelegt.....

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.