ENC28J60 - Build in self test

Gast #878680
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.
1
int Enc28j60Heartbeat(void)
2
{  
3
  LED_RT(0);
4
  DESELECT();
5
  //Siehe Seite 75 im Datenblatt
6
  Enc28j60WriteReg(BANKX_ECON1, Enc28j60ReadReg(BANKX_ECON1) & 0xD3);
7
  Enc28j60SwitchBank(BANK0);
8
  Enc28j60WriteReg(BANK0_EDMASTL, 0x00);
9
  Enc28j60WriteReg(BANK0_EDMASTH, 0x00);
10
  Enc28j60WriteReg(BANK0_EDMANDL, 0xFF);
11
  Enc28j60WriteReg(BANK0_EDMANDH, 0x1F);
12
  Enc28j60WriteReg(BANK0_ERXNDL, 0xFF);
13
  Enc28j60WriteReg(BANK0_ERXNDH, 0x1F);
14
  Enc28j60SetMaskReg(BANKX_ECON1, (1<<BANKX_ECON1_CSUMEN));
15
  //Enable Test mode, select the desired test, select the desired port configuration for the test.
16
  //Autofill normal Port Conf
17
  Enc28j60SwitchBank(BANK3);
18
  //Set TME
19
  Enc28j60SetMaskReg(BANK3_EBSTCON, (1<<1));  
20
  //Set TMSEL0
21
  Enc28j60SetMaskReg(BANK3_EBSTCON, (1<<2));
22
  //Set TMSEL1
23
  Enc28j60ClearMaskReg(BANK3_EBSTCON, (1<<3));
24
  //Set PSLE
25
  Enc28j60ClearMaskReg(BANK3_EBSTCON, (1<<4));
26
  //START  Set BIST
27
  Enc28j60SetMaskReg(BANK3_EBSTCON,(1<<0));
28
  Enc28j60SetMaskReg(BANKX_ECON1, (1<<BANKX_ECON1_DMAST));
29
  
30
  starttime();
31
  while( (0x20 & Enc28j60ReadReg(BANKX_ECON1)) != 0x20)
32
  {
33
    //mindestens 100ms
34
    if(gettime() >= 100)  
35
    {      
36
      //Fehler
37
      LED_RT(1);
38
      Enc28j60Reset();
39
      stoptime();
40
      cleartime();
41
      return 2;
42
    }
43
  }
44
  
45
  //Berechnung fertig
46
  Enc28j60SwitchBank(BANK0);
47
  uint8_t edmacsl = Enc28j60ReadReg(BANK0_EDMACSL);
48
  uint8_t edmacsh = Enc28j60ReadReg(BANK0_EDMACSH);
49
  Enc28j60SwitchBank(BANK3);
50
  uint8_t ebstcsl = Enc28j60ReadReg(BANK3_EBSTCSL);
51
  uint8_t ebstcsh = Enc28j60ReadReg(BANK3_EBSTCSH);
52
  if( edmacsl ==  ebstcsl &&  edmacsh == ebstcsh)
53
    {
54
      //Fehlerfrei
55
      stoptime();
56
      cleartime();
57
      return 0;
58
    }
59
  else
60
    {
61
    //Fehler
62
    Enc28j60Reset();
63
    stoptime();
64
    cleartime();
65
    return 1;
66
  }
67
}

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

Antwort schreiben

Eine eigene Frage? Dieser Thread ist über 18 Jahre alt. Stell sie in einem eigenen Thread – dort lesen mehr Leute mit, und sie wird öfter und schneller beantwortet.

Neuen Thread starten

Eine Lösung, Ergänzung oder Rückmeldung zu diesem Thread? Dann antworte hier.

Formatierung
  • [c]C-Code[/c]
  • [code]Code in anderen Sprachen, ASCII-Zeichnungen[/code]
  • [math]Formel in LaTeX-Syntax[/math]
  • [[Titel]] – Link zu einem Artikel
  • Verweis auf einen anderen Beitrag: Rechtsklick auf dessen Beitrags-ID (#8078628), „Adresse kopieren“, in den Text einfügen

Mehr zur Formatierung

Längeren Sourcecode als Anhang, nicht in den Text. JPG nur für Fotos und Scans; Zeichnungen und Screenshots als PNG oder GIF. Siehe Bildformate.

Schon registriert? Anmelden

Wird nicht angezeigt. Wir schicken dir einen Link; sobald du damit bestätigst, erscheint dein Beitrag.

Mit dem Abschicken legst du einen kostenlosen Account an und erkennst die Nutzungsbedingungen und die Datenschutzerklärung an.