Forum: Mikrocontroller und Digitale Elektronik AVR Webserver 3C5x9 I/O-Adresse


von Wolfram Hildebrandt (Gast)


Lesenswert?

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.

von A.K. (Gast)


Lesenswert?

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.

von Wolfram Hildebrandt (Gast)


Lesenswert?

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.

von Werner B. (Gast)


Lesenswert?

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.

von Mike (Gast)


Lesenswert?

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.

von Elektrikser (Gast)


Lesenswert?

Dieses Zitat habe ich in einem anderen Forum auch schon gepostet. 
Anscheinend hat es dem TO nicht geholfen...

von Werner B. (Gast)


Lesenswert?

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.

von Wolfram Hildebrandt (Gast)


Lesenswert?

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?

von Wolfram Hildebrandt (Gast)


Angehängte Dateien:

Lesenswert?

Die Widersprüche zur Layoutrennung habe ich in ein PDF gepackt und 
angehängt.

von Werner B. (Gast)


Lesenswert?

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).

von Wolfram Hildebrandt (Gast)


Lesenswert?

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.

von Werner B. (Gast)


Lesenswert?

Zum Layout:

Du musst BEIDE trennen (hat mich einige Zeit geköstet das ohne Layout im 
bestückten Zustand rauszufinden).

von Wolfram Hildebrandt (Gast)


Lesenswert?

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?

von Wolfram Hildebrandt (Gast)


Lesenswert?

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.

von Mike (Gast)


Lesenswert?

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