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