Forum: Mikrocontroller und Digitale Elektronik ENC28J60 Problem


von Thomas B. (Gast)


Lesenswert?

Hallo.

Hab kleine Probleme damit den ENC28J60 vollständig anzusprechen.
Prinzipiell funktioniert es (also das Lesen und Schreiben), allerdings
scheint es Probleme mit dem Ansprechen der MACON und der MAC Register
zu geben.
Habe mich dabei an die Initialisierungsreihenfolge in der Procycon
AVRLib gehalten (Als Controller verwende aber ich einen M16C/62P).

SPI Frequenz ist derzeit auf 12MHz, hab aber auch  6MHz und 1MHz
probiert.

Was mir auffällt: Ich kann das ECON2 Register zwar problemlos lesen,
aber anscheinend nicht schreiben (und somit MARST nicht zurücksetzen).

Hier die auslesenen Registerinhalte:

RevID: 0x2
EIE: 0x0 EIR: 0x0 ESTAT: 0x1 ECON2: 0x80 ECON1: 0x3
MACON1: 0x0 MACON2: 0x80 MACON3: 0x0 MACON4: 0x0
MACADDR:   0 45 0 0 0 0

Jemand eine Idee was da falsch laufen könnte ? Hab ich irgendetwas
übersehen ?

Schöne Grüße,
Thomas

von Thomas B. (Gast)


Lesenswert?

Nachtrag: meinte nicht da ECON2 sondern das MACON2-Register.

von Thomas B. (Gast)


Lesenswert?

Habe dieses Problem noch immer nicht zufriedenstellend lösen können:
Testweise hab ich nämlich die SPI-Kommunikation softwaremässig
integriert, und siehe da: es geht.

Per Hardware SPI klappt es aber immer noch nicht so wie es soll; was
ich nicht ganz verstehe, da er mir ja gewisse Register richtig ausliest
(komplett falsch können die Einstellungen also nicht sein).

Ich schätze also mal, daß es irgendwas mit dem SPI vom M16C/62P auf
sich hat. Kann es da irgendwelche Inkompatibilitäten mit dem ENC geben
? Hab auch schon ziemlich mit den Timings (z.B. CS# Setup Time, CS#
Disable Time, usw.) herumgespielt, aber ohne Erfolg.
Leider hab ich im Moment keinen Logic-Analyser um mir das Timing genau
anzuschauen ...

Hier die Grundfunktionen wie ich sie implementiert habe:
1
unsigned char ReadETHReg(unsigned char Address)
2
{
3
  CHIP_SELECT = 0;
4
  delaytick(100);  
5
  ir_s3ic = 0;
6
  asm("nop");
7
8
  s3trr = (0x00 | Address);  
9
  while (!ir_s3ic);
10
  ir_s3ic = 0;
11
          
12
  s3trr = 0x00;  
13
  while (!ir_s3ic);
14
  ir_s3ic = 0;
15
16
  delaytick(100);
17
  CHIP_SELECT = 1;
18
19
  
20
  return s3trr;
21
}
22
23
unsigned char ReadMACReg(unsigned char Address)
24
{
25
  CHIP_SELECT = 0;
26
  delaytick(100);  
27
  ir_s3ic = 0;
28
  asm("nop");
29
30
  s3trr = (0x00 | Address);  
31
  while (!ir_s3ic);
32
  ir_s3ic = 0;
33
  
34
  // Erstes Dummy Byte          
35
  s3trr = 0x00;  
36
  while (!ir_s3ic);
37
  ir_s3ic = 0;
38
39
        // Zweites Dummy Byte
40
  s3trr = 0x00;
41
  while (!ir_s3ic);
42
  ir_s3ic = 0;
43
44
  delaytick(100);
45
  CHIP_SELECT = 1;
46
  
47
  return s3trr;
48
}
49
50
void WriteReg(unsigned char Address, unsigned char Data)
51
{
52
  CHIP_SELECT = 0;
53
  delaytick(100);
54
  ir_s3ic = 0;
55
56
  s3trr = (0x40 | Address);  
57
58
  while (!ir_s3ic);
59
  ir_s3ic = 0;
60
61
  s3trr = Data;
62
63
  while (!ir_s3ic);
64
  ir_s3ic = 0;
65
66
  delaytick(50);
67
  CHIP_SELECT = 1;
68
  delaytick(100);
69
}

Die Initialisierung des SPI vom M16C sieht folgendermassen aus:
1
prc2=1;
2
s3c = 0x68;
3
prc2=0;
4
5
/*
6
01101000;   // s3c
7
||||||||______ f1SIO gewählt
8
|||||||_______ 
9
||||||________ SOUT3 auf Output
10
|||||_________ SOUT3 Output, CLK3 function
11
||||__________ transmit: fallende Flanke von CLK
12
|||            receive: steigende Flanke von CLK
13
|||___________ MSB first
14
||____________ Internal Clock
15
|_____________ SOUT3 Initial Value: Low Output
16
*/
17
18
s3brg = 2;

Mit der Clockrate hab ich mich auch schon ziemlich herumgespielt; ohne
Erfolg.

Kennt sich jemand gut mit dem M16C (und dessen SPI Modus) aus, und kann
mir sagen was ich noch probieren könnt ?

Schöne Grüße,
Thomas

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.