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