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 | static void activate_3c5x9_nic(void) |
10 | {
|
11 | uint16_t id; |
12 | uint16_t loop; |
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_t readLoop(uint8_t eadr) |
7 | {
|
8 | uint8_t loop; |
9 | uint16_t st = 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 | return st; |
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.
Dieses Zitat habe ich in einem anderen Forum auch schon gepostet. Anscheinend hat es dem TO nicht geholfen...
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?
Die Widersprüche zur Layoutrennung habe ich in ein PDF gepackt und angehängt.
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.
Zum Layout: Du musst BEIDE trennen (hat mich einige Zeit geköstet das ohne Layout im bestückten Zustand rauszufinden).
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.
Jaja, das gute alte Datenblatt hat Antwort. Du musst die JTAG-Funktion der Pins abschalten, dann verhalten sie sich wie ganz normale Pins.
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.