Hallo
Wie lautet die I/O-Adresse für ISA-Netzwerkkarten für den Webserver von
mikrocontroller.com bei 3Com Netzwerkkarten?
Die Realttekkarten müssen auf 0x300 stehen.
Wie sieht es mit den 3C5x9 Karten von 3Com aus?
Ich bekomme zur Zeit gar keinen Zugriff auf die Karte. Die steht bei mir
momentan auf 0x300.
Es geht nicht jede Version der 3c509, die B-Version geht, die A-Version
nicht. Ich meine auch, dass man das DOS-Config-Programm bemühen muss,
non-PNP oder so.
Ich habe eine 3C509B-TPO-Karte.
Die Karte muss pnp deaktiviert haben, JR45 eingeschaltet, IRQ egal (da
alle Pins verbunden sind). Das ist klar.
In den Kommentarzeilen wird von Adresse 0x310 geredet, aber auch von
einem soweit ich weiss, nicht verwendeten Interrupt. Von daher zweifelte
ich.
Leider kann ich die Karte nicht selber umstellen, weil meine ISA-Rechner
nicht mehr laufen oder irgendwo durch Null teilen.
Die I/O-Adresse kann ich auch nicht mehr unter Windows umstellen, da der
pnp-Modus deaktiviert ist.
Die I/O Adresse ... ist etwas kompliziert (und das Ganze ist auch schon
etwas her).
Erst mal die Phasen der Initialisierung. Die sind zwar nicht (mehr)
besonders sinnvoll abgestuft da sie aus den Zeiten der allerersten
Versuche stammen, können aber helfen den Code zu unterteilen.
Phase 1. Vorbereiten der I/O Register des AVR.
Phase 2. Hardware Reset auf den "virtuellen" ISA Bus geben.
Phase 3. Warten bis Karte Resettet hat.
Phase 4. Die Karte wird "aktiviert".
Phase 5. Auslesen der MAC Adresse und I/O Adresse aus dem
Karten-EEPROM.
Phase 6. Mit der I/O Adresse programmieren.
Phase 7. Auslesen der hersteller-ID und Karten-ID.
Phase 8. War mal debug...
Phase 9. Programmieren der Karte mit der aus dem EEPROM gelesenen
MAC Adresse.
Phase 10. Vorbereiten der Karte auf Empfang und Senden.
Phase 11. Sendden und Empfangen freigeben.
Aktivieren der Karte (Phase 4):
Nach dem Reset/Power on wartet die Karte darauf, dass ein bestimmtes
Datenmuster auf den ID-Port geschriben wird.
Dieser Port ist der Port im I/O Bereich 1x0h auf den als letztes eine
00h geschrieben wurde (in activate_3c5x9_nic passiert das gleich zwei
mal).
In der Schleife wird das Bytemuster erzeugt und ausgegeben.
1
/*
2
* Die Netzwerkkarte muss erst "aktiviert" werden damit sie,
3
* und nur sie auf dem
4
* Port 0x1x0 Befehle entgegennimmt und Informationen zurückgibt.
5
* Dazu muss ein bestimmtes Bytemuster auf den Port (ID_PORT) im Bereich
6
* 0x1x0 (x=1...F) ausgegeben werden, auf den als letztes der Wert NULL
7
* geschrieben wurde.
8
*/
9
staticvoidactivate_3c5x9_nic(void)
10
{
11
uint16_tid;
12
uint16_tloop;
13
// ----------------
14
// Write ID loop
15
id=0xFF;
16
outportb(ID_PORT,0);// Enable IDport
17
outportb(ID_PORT,0);// Enable IDport
18
for(loop=0;loop<255;loop++)
19
{
20
outportb(ID_PORT,id);
21
id<<=1;
22
if(id&0x100)
23
id^=0xCF;
24
}
25
}
Nach dem Aktivieren kann über den ID-Port das EEPROM der Karte auslesen.
Das Auslesen erfolgt bitseriell.
1
/*
2
* Um von ID_PORT EEPROM-Daten zu lesen müssen diese 16-bit Werte nach
3
* Anforderung in einer Schleife vom Bit #0 des ID-PORT eingelesen werden.
4
* Höchstwertiges Bit zuerst.
5
*/
6
uint16_treadLoop(uint8_teadr)
7
{
8
uint8_tloop;
9
uint16_tst=0;// to keep the compiler happy
10
11
// Fordere NIC-Controller auf die Daten von der
12
// EEPROM Adresse eadr zu lesen.
13
outportb(ID_PORT,0x80+eadr);
14
delay(100);// Warte bis Daten im EEPROM Datenregister
15
// zur Verfügung stehen
16
17
for(loop=0;loop<16;loop++)
18
{
19
st<<=1;
20
st|=inportb(ID_PORT)&1;
21
}
22
returnst;
23
}
Das setzten der I/O-Adresse auf welche die Karte dann endgültig hört
erfolgt auch über den ID-Port.
1
// Setze Basis I/O Adresse auf 0x310.
2
// "Activate the adapter at the preconfigured
3
// I/O base address and return to the ID_WAIT state."
4
outportb(ID_PORT,0xE0+((0x310-0x200)>>4));// 0F1H für 310H
5
outportb(ID_PORT,0x0);
Genauers aus dem Datenblatt zu den 3c5x9b Karten.
Gibt z.B. hier (einfach nach 3c5x9b.pdf suchen).
http://www.janw.dommel.be/PIC18F452_3COM_3C509B_Ethernet/3c5x9b.pdf
P.S.
To make the attorney/prosecutor happy...
Das ist 1. nicht meine HP und habe diese URL angegeben weil sie die
erste war die auf ein Suchanfrage von einer Suchmaschine im Internet
zurückgeliefert wurde. 2. Ich habe keinerlei Informationen über weitere
auf dieser Seite vorhandenen oder verlinkten Daten. 3. Falls diese Daten
gegen geltendes Recht verstoßen sollten, distanziere ich mich explizit
davon.
Aus der Firmware 1.39 Datei 3c5x9.c Zitat:
Auf dem AtMega32 Board von Holger Buss.
Auftrennen der Verbindung von A9 mit A8 (ISA Slot Pin A22-A23, Lötseite)
und verbinden mit A4 (ISA Slot Pin A27, Lötseite).
Wenn A9 mit A4 verbunden ist, dann ist der
ID-Port der 3c5x9 = 0x100 und der Datenport = 0x310
Ansprechen des IDPorts über Adresse 0x00.
Ansprechen der Datenregister über Adresse 0x10-0x1F.
Die Karte muss vorher mit 3c5x9cfg.exe konfiguriert sein.
Aktuelle Einstellungen: INT3, I/O 310H, TP, PnP aus, Full-Duplex aus.
Die I/O kann im Quellcode über den IDPort (fast) beliebig zwischen 0x200
und 0x3F0 gelegt werden. Welche gehen steht im Datenblatt (Siehe Oben).
Änderung: Einfach 0x310 durch den gewünschten Wert ersetzen.
1
#define IOPORTADDR 0x310
2
3
// Setze Basis I/O Adresse auf IOPORTADDR.
4
// "Activate the adapter at the preconfigured
5
// I/O base address and return to the ID_WAIT state."
6
outportb(ID_PORT,0xE0+((IOPORTADDR-0x200)>>4));// z.B. 0F1H für 310H
7
outportb(ID_PORT,0x0);
Das DOS-Konfigurationsprogramm schreibt nur in das Karten-EEPROM.
Man braucht es nicht!
Die daraus resultierenden notwendigen Änderungen des restlichen Codes
kann ich Euch aber auf die Schnelle nicht sagen.
Hmm. Wenn die IO-Adresse erst ab
// Setze Basis I/O Adresse auf IOPORTADDR.
// "Activate the adapter at the preconfigured
// I/O base address and return to the ID_WAIT state."
outportb(ID_PORT, 0xE0+((IOPORTADDR-0x200)>>4)); // z.B. 0F1H für
310H
outportb(ID_PORT, 0x0);
hier interesseant ist, dann wird es erst mal weitere fehler geben.
Bei mir hört es früher schon auf und zwar hier:
printf_P(PSTR("Phase 3\n"));
// Erst mal warten, nic initialisiert sich
delay(100);
printf_P(PSTR("Phase 4\n"));
// Aktivierungssequenz schicken
activate_3c5x9_nic();
printf_P(PSTR("Phase 5\n"));
// read the mac address of this card from eeprom address 10,11, and 12
st = readLoop(10);
printf_P(PSTR("node %02X-"),st);
// Every nic i have seen has "00" in the msb mac field
if((st & 0xff00) != 0) // no nic, i guess
return 1;
Es wird Phase5 Node0xFFFF oder so ähnlich ausgeben.
Wenn er bis hier nur aus dem EEPROM ließt, funktioniert das wohl erst
mal nicht. Auf µC.com wird die Hardwareanpassung beschrieben. Demnoch
soll (und habe) ich nicht nur:
"Auftrennen der Verbindung von A9 mit A8 (ISA Slot Pin A22-A23,
Lötseite)
und verbinden mit A4 (ISA Slot Pin A27, Lötseite)."
sondern auch noch die zweite Verbindung zum ATmega32 trennen.
Hat das Einfluss auf das EEPROM?
Dann wird evtl. die I/O-Adresse 0x100 nicht richtig auf den "AT-Bus"
gelegt.
0x1x0 (IDPort) ist notwending um die eigentlich Adresse setzen zu
können.
Legende: A=1, a=0
0x100 = Nur Adressleitung A8 = 1
0x310 = A9, A8 und A4 = 1
Zum Nachmessen für 0x100 in init_3c5x9 vor der Ausgabe des Textes
"printf_P(PSTR("Phase 2\n"));" eine Endlosschleife einbauen und dann die
Adressleitungen mit einem Multimeter nachmessen.
Zum Testen ob 0x3100 richtig angelegt wird vor die Enlosschleife ein
" PORT_REGISTER(0x310);" eintragen und messen. Erst dann muss man
weitersehen ob RD und WR richtig anliegen. Ich tippe stark auf ein
Hardwareproblem (Brücke oder Unterbrechung).
Zu dem PDF von mir: Der bei µC.com zusätzlich getrennte Anschluss ist
nur der REF-Pin. Das spielt also hierbei wohl keine Rolle. Der ADC wird
ja erst später verwendet.
--
@ Werner B.
Ich werde das Layout komplett prüfen und deine Vorschläge nachmessen.
Ja, die sind leider bei mir schon getrennt.
Ich merke gerade, dass mein Brenner in Köln ist und ich 40km davon
entfernt bin. Werde das erst nächste Woche testen können. Ich verspreche
mir davon aber nicht viel, da dann eigentlich nur der mega32 defekt sein
könnte.
Ich habe hier noch eine RTL8019AS Karte mit EEPROM herumliegen.
Aber der Duron findet die Karte mal wieder nicht.
Ich habe bisher 5 Netzwerkkarten gekauft.
Ist die RTL8019AS unproblematischer?
Ich habe jetzt nach Wochen endlich die Messungen ausgeführt.
Der ID-Port wird richtig angelegt, aber der PORTC funktioniert nicht
richtig.
Bit 4,5,6 sind immer auf 5V.
Werde den µC nächste Woche einmal austauschen.
Wie der jetzt zerstört wurde, kann ich mir nicht erklären. Ich messe
lieber noch einmal die ganze Schaltung durch.