Hi,
für ein Projekt mit Ethernetanbindung verwende ich einen Davicom
DM9000BI (ohne angeschlossenen EEPROM) und einen ATmega128
(16MHz-Quarz). Nun hat sich allerdings das Problem ergeben, dass der
DM9000BI einfach nicht antworten will. Ich bin mir relativ sicher, alles
genau nach Datenblatt zu machen. Ein Defekt des DM9000BI ist
unwarscheinlich, da der angeschlossene 25MHz-Quarz schwingt. Ich habe
auch schon alle relevanten Pins des DM9000 durchgemessen: Die richtigen
Werte kommen dort an, wenn ich allerdings etwas lesen will, scheint es
so, als ob die Datenpins des DM9000 auf Input/High-Z wären: Wenn ich am
ATmega die Input-Pull-Ups deaktiviere, kommt nur minimales Zittern raus,
also auch kein GND, da ist viel mehr Störung drauf. Wenn ich die
Input-Pull-Ups aktiviere, kriege ich logischerweise nur die +5V Vcc des
ATmegas.
Zur Kontrolle hier der Quellcode (das schaut normal nicht so aus, nur um
sicherzugehen, dass alles passt habe ich alle Werte/Ports explizit
angegeben):
1 | uint8_t ethernet_read_register(DM9000_REG reg)
|
2 | {
|
3 | PORTA = 0x28; // VID1: Vendor ID low byte
|
4 | PORTC &= ~(1 << PC7); // CMD: INDEX port
|
5 | PORTC &= ~(1 << PC3); // CS#
|
6 | PORTC &= ~(1 << PC4); // IOW#
|
7 | _delay_us(100.0); // etwas übertrieben, nur testweise
|
8 | PORTC |= (1 << PC4); // IOW#
|
9 | PORTC |= (1 << PC3); // CS#
|
10 |
|
11 | // Port auf Input
|
12 | PORTA = 0xFF; // oder 0x00
|
13 | DDRA = 0;
|
14 |
|
15 | PORTC &= ~(1 << PC3); // CS#
|
16 | PORTC &= ~(1 << PC5); // IOR#
|
17 | _delay_us(100.0);
|
18 | uint8_t regval = PINA;
|
19 | PORTC |= (1 << PC5); // IOR#
|
20 | PORTC |= (1 << PC3); // CS#
|
21 | return regval;
|
22 | }
|
Hat vielleicht jemand eine Idee, was hier schief laufen könnte?
Grüße,
Philipp