Forum: Compiler & IDEs ENC28J60 - Build in self test


von Josef (Gast)


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.
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.

von Josef (Gast)


Angehängte Dateien:

Lesenswert?

Hat keiner eine Idee? Ich hab mal die enc28j60.h und .c beigelegt.....

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
Noch kein Account? Hier anmelden.