Hallo zusammen,
Mein lan9303 wird sehr heiß nach einiger minuten und dann bleibt
Oft hängen- keine Kommunikation mit dem möglich.
Kann er wegen zu hocher Temperatur nicht mehr funktionieren?
Nach Abkühlung und neu start gehr er wieder.
Hat jemand solche probleme gehabt? Siet es nach einem Layout Fehler
aus oder configuration?
Qone schrieb:> Hallo zusammen,>> Mein lan9303 wird sehr heiß nach einiger minuten und dann bleibt> Oft hängen- keine Kommunikation mit dem möglich.> Kann er wegen zu hocher Temperatur nicht mehr funktionieren?> Nach Abkühlung und neu start gehr er wieder.>> Hat jemand solche probleme gehabt? Siet es nach einem Layout Fehler> aus oder configuration?
Kenne zwar das Teil nicht im speziellen, aber wie sieht das Layout aus?
QFN Exposed Pad, Thermal Vias, möglicherweise Solder Voids unterhalb des
ICs?
Der LAN9303 benötigt bei 100Base-TX laut Datenblatt stolze 190mA @ 3,3V,
dazu kommen noch 2x 42mA Übertragerstrom. Bei 10Base-T liegen die
Verhältnissse noch etwas ungünstiger. *
Je nachdem, wie die im Baustein erzeugte Wärme vom Gehäuse abgeführt
wird, beträgt die Temperaturerhöhung auf dem Chip rund 30°C bis 50°C
gegenüber der direkten Umgebungstemperatur. Das kann also schon
reichlich heiß werden, sollte die Funktion aber nicht beeinträchtigen,
solange die Chip-Temperatur (Tj, also intern) nicht an 125°C **
herankommt.
Abgesehen von den Wärmeverlusten und der damit verbundenen
Temperaturerhöhung kann das nicht näher beschriebene Problem aber auch
woanders liegen.
Du solltest zuerst überprüfen, ob noch externer Datenverkehr zwischen
den beiden PHY-Ports möglich ist, indem Du eine bestehende
Ethernet-Verbindung (z.B. zwischen PC und Internet) auftrennst und die
beiden PHY-Ports quasi als Brücke an der Auftrennung einfügst. Das RMII
würde ich hierfür sogar deaktivieren (z.B. per µC-Software).
Zur Überprüfung kannst Du auch noch den Switch-Status per MIIM/SMI
mittels µC auslesen.
Erst wenn dieser PHY-zu-PHY-Pfad zuverlässig funktioniert, schaust Du
die RMII-Schnittstelle zwischen Switch und µC genauer an. Oft liegt dort
der Hund begraben.
Es kann aber auch viele andere Gründe geben, die man erst mit einem
genauen und vollständigen Schaltplan (einschl. Übertrager), ggf. auch
anhand des Platinen-Layouts analysieren kann.
Ist es eine selbst geschnitzte Platine oder etwas fertig Gekauftes?
Schließlich kann auch eine falsch eingesetzte Management-Software zu
Problemen zwischen Switch und µC führen.
Noch etwas: Falls der µC auch das MII unterstützt und hierfür genügend
Pins frei sind, ist das MII immer dem RMII vorzuziehen.
* Es gibt vergleichbare-Ethernet-Switches, die eine deutlich geringere
Gesamtstromaufnahme haben.
** Nicht im Datenblatt des LAN9303 spezifiziert, aber ein üblicher
Maximalwert für solche Bausteine.
Schon vielen Dank fur eure Antworten!
Layout oder Schaltplan habe ich momentan nicht dabei.
Es ist auch oft, dass der uC nach neu start keine ip bekommen kann, muss
man dafur mehrere mals arps senden um auf den draufzukommen, oder mehere
mals reseten.
Platine wurde in china hergestellt.
Ich mache keine Einstellungen über smi für lan9303 beim aufstart.
Vielleicht fehlt ihm was deswegen?
Solange der Switch nicht rund läuft, musst Du dir über IP-Adressen keine
Gedanken machen, denn diese werden in einem höheren Layer übertragen und
kümmern einen Switch normalerweise nicht (sondern nur MAC-Adressen).
Das Debuggen eines neuen Ethernet-Designs geschieht immer harwaremäßig
von der PHY-Seite aus.
Sind bei Dir die Übertrager mit auf der gekauften Platine oder hast Du
sie selbst angebracht und wie sind sie dann angeschlossen? Alle Details
rund um die Übertrager sind wichtig.
Bevor hier nicht alles nach Vorschrift des Ethernet-Baustein-Herstellers
ausgeführt ist, braucht man an anderer Stelle erst gar nicht suchen.
Das Management-Interface eines PHYs oder (wie hier) eines Switches ist
immer eine gute Hilfe bei der Fehlersuche.
Am besten, man zieht darüber per Software alle Register des/der PHYs
bzw. des Switches in eine Datei ab und vergleicht die Voreinstellungen
laut Datenblatt (und laut Pin-Strapping) mit den tatsächlichen Werten,
einmal direkt nach einem Reset und dann nach Auftreten des Fehlers (bei
der Fehlersuche also insgesamt mindestens 3 Registersätze).
Bei Switches gibt es einen umfangreichen Status/Statistik-Registersatz
(beim LAN9303 per SMI auszulesen), mit dessen Inhalt man sehr schnell
auf Fehlerursachen schließen kann. Allerdings ist das Auswerten ziemlich
mühsam, falls man keine Erfahrung damit hat.
Bei den wenigen PHY-Registern (ein Satz pro PHY-Port, per MIIM oder per
SMI auszulesen) gibt es entsprechend wenige Hinweise auf Fehler. Aber
vielleicht hilft das bereits, einfache Fehler zu lokalisieren.
Achtung: Die beiden Pins MDC und MDIO (Pull-Up nicht vergessen) eines µC
als Teil dessen Ethernet-MAC unterstützen hardwaremäßig normalerweise
nur das per IEEE-802.3 definierte MIIM-Protokoll, nicht irgend ein
(herstellerspezifisches) SMI-Protokoll eines Switches, das bei
Verwendung per Bit-Banging emuliert werden muss (falls es beim Switch
nicht ein separates anderes Slave-Management-Interface gibt, dann meist
SPI oder I²C).
Eine weitere Hilfe beim Fehlersuchen sind diverse Loopback-Modi, sowohl
bei PHYs als auch bei Switches. Auch hier sind die
Management-Schnittstellen der Weg zum Ziel.
Ich sollte erwähnen, dass ich keine eigene Erfahrung speziell mit dem
LAN9303 habe, nur mit PHYs und Switches (und deren
Management-Schnittstellen) anderer Hersteller.
Was meinst du mit übertrager?
Mir ist jetzt aufgefallen, dass der switch mit uC stabil läuft wenn nur
ein phy genutzt wird. Sobald ich die nachrichten über das zweite phy
verschicke, hangt der uC nach einer ca. minute.
Qone schrieb:> Was meinst du mit übertrager?
Hast Du zwischen den beiden PHYs und deren RJ45-Buchsen keine
1:1-LAN-Übertrager angeschlossen?
Wie schauen die Schaltungsdetails an dieser Stelle aus?
Wenn keine LAN-Übertrager vorhanden sind (diesen Fall gibt es in
besonderen Fällen auch), musst Du erläutern, warum.
> Mir ist jetzt aufgefallen, dass der switch mit uC stabil läuft wenn nur> ein phy genutzt wird. Sobald ich die nachrichten über das zweite phy> verschicke, hangt der uC nach einer ca. minute.
Falls an einem µC-MAC ein einzelner PHY (also 1 Port) durch einen Switch
ersetzt wird (offensichtlich wie bei Deiner Applikation, z.B. um mehr
Ports zu bekommen), wird oft unbedacht der bereits vorhandene
08/15-PHY-Software-Treiber belassen, wodurch manchmal unvorhergesehene
Effekte passieren.
Dann ist es besser, man deaktiviert den PHY-Software-Treiber (oder passt
ihn an den Switch an), denn ein Switch benötigt diesen
PHY-Software-Treiber im Normalfall nicht.
Erst wenn ein Switch-Management benötigt wird, muss man per
Management-Interface auf den Switch zugreifen, dann aber nicht per
eingeschränktem MIIM (das kann – wie bereits beschrieben - nur auf die
PHY-Register zugreifen), sondern per SMI (wie beim LAN9303), SPI oder
I²C, je nachdem, was der jeweilige Switch als
Switch-Management-Schnittstelle unterstützt.
Ich habe eth switch an Buchsen angeschlossen wie es im eingefügten bild
dargestellt ist(lan9303 phy Informationion sheet). Als Buchsen habe ich
si-60062-f genommen.ist der übertrager in ihnen integriert?
Qone schrieb:> Ich habe eth switch an Buchsen angeschlossen wie es im eingefügten bild> dargestellt ist(lan9303 phy Informationion sheet). Als Buchsen habe ich> si-60062-f genommen.ist der übertrager in ihnen integriert?
Sowohl im Schaltbild als auch beim verwendeten SI-60062-F (2x für 2
PHYs) sind die RX/TX-Übertrager jeweils integriert.
Wichtig ist, dass alle chipseitigen Mittenanzapfungen gemäß Schaltbild
angeschlossen sind, also paarweise per RX und TX (bei SI-60062-F jeweils
die Pins P2 und P5) über 10 Ohm an die analogen 3,3V des LAN9303.
P8 des SI-60062-F wird mit dem Schirm des RJ-45 verbunden, nicht mit der
Masse des Systems. Zwischen Schirm und System-Masse wird statt R29 = 0
Ohm oft auch ein 1nF/2kV-Kondensator verwendet.
Kontrolle: Wenn die Übertrager richtig angeschlossen sind, sollten an
den 10-Ohm-Widerständen bei einem bestehenden Link (nur dann) rund 200mV
abfallen.
Die RX/TX-Abschlusswiderstände (je 49,9 Ohm) müssen zwingend auch alle
vorhanden sein. Falls sie nicht bereits auf der gekauften
LAN9303-Platine sind, müssen sie nachgerüstet werden (möglichst nahe an
den beiden PHYs).
- Klappt die vorgeschlagene "Brücke" mit den beiden PHY-Ports bereits
zuverlässig?
- Hast Du schon überprüft, was der PHY-Software-Treiber genau macht?
- Welche PHY-Ports frägt er ab?
Die vorgeschlagene Brücke geklappt. Über das board komme ich mit meinem
PC ins Internet. Ich habe noch kein treiber für switch. Werde ich mal
Gedanke machen, wie ich register schreiben und lesen kann.
Wenn die "Brücke" zuverlässig klappt, bestätigt das, dass die PHYs
richtig angeschlossen sind und der Switch an sich funktioniert.
Wenn nun über den 3. Port (das RMII*) durch den µC zugegriffen wird und
das MIIM (Pins MDIO/MDC) angeschlossen und vermutlich irgend ein
TCP/IP-paket installiert ist, kommt im Normalfall ein
Standard-PHY-Treiber zum Einsatz.
Wie bereits angedeutet, muss dieser PHY-Software-Treiber bei Betrieb mit
einem Switch entweder deaktiviert werden (denn ein Switch benötigt ihn
nicht) oder mit einer sinnvollen Logik an den Switch angepasst werden.
Vielleicht bekommst Du sogar einen fertig angepassten Software-Treiber
für den LAN9303 beim Hersteller.
* Sofern dieses richtig und zuverlässig funktioniert.
Ich habe gerade ein Verständnisproblem mit Write Register, um z.b. LED
zu konfigurieren.
Hat jemand mit dem PHY Erfahrung?
LED Configuration Resister
Offset: 1BCh Size: 32 bits
Description:
...
5:0 LED Enable 5-0(LED_EN[5:0])
0:
1: Enable the associated pin as a LED output
Write Sequence:
In write sequence, the host sends 32-bit preamle, 2-bit start of frame,
2-bit op code, 5-bit PHY Address, 5-bit Register Address, 2-bit turn
-around time, and finalle the 16-bits of data.
Wie kann ich PHY Addresse und Register Addresse bilden?
Wie bereits gesagt: Ich habe mit dem LAN9303 (und mit PIC32) keine
eigene praktische Erfahrung, aber mit Switches anderer Hersteller. Dort
funktionieren einige Dinge etwas anders, wie z.B. die SMI-Schnittstelle.
Um per Management-CPU (hier PIC32) auf die Switch-Register zugreifen zu
können, muss der LAN9303 im SMI-Management-Mode gestrappt sein (und bei
Deiner Applikation offensichtlich auch im RMII-PHY-Mode).
Im SMI-Management-Mode erfolgt der Zugriff auf alle Switch-Register
ebenso per MDIO/MDC-Pins, wie auch im MIIM-Mode (bei SMSC PMI genannt)
auf die beiden PHY-Register-Sätze.
Wie beim LAN9303 die Unterscheidung zwischen SMI und PMI erfolgt, ist
mir noch nicht ganz klar, offensichtlich automatisch per
Protokoll-Format.
Es scheint, dass bei PHY_Address[4] = 1 das SMI-Format gilt und bei
PHY_Address[4] = 0 das PMI-Format, wobei aber letzteres nicht explizit
im Datenblatt beschrieben ist (es wäre gegenüber der MIIM-Spezifikation
in IEEE-802.3 eine Einschränkung im Adressierungsbereich auf vier statt
fünf Bits für die PHY-Adressen, bei diesem Switch aber sicher kein
Problem, da im unteren Adressbereich festgelegt).
Der Vorteil dieser Methode* ist, dass man die MIIM-Hardware (Pins
MDIO/MDC) des µC-MAC sowohl für das SMI als auch für das PMI verwenden
kann, und zwar offensichtlich auch im Mischbetrieb (jeweils komplette
Frames).
Das ist dann sehr praktisch, wenn man einen vorhandenen
PHY-Software-Treiber (zwingend auf den Switch angepasst!!), der
normalerweise das PMI/MIIM bedient, zusammen mit einer
Switch-Management-Software verwenden möchte, die zwangsläufig das SMI
nützen muss.
Das Format für SMI und PMI ist in den Tabellen 10.1 und 10.2 des
Datenblatts dargestellt.
Ein 32-Bit-Frame wird zusammengesetzt aus 4 Bits für Start und Op-Code
(Lesen/Schreiben), 10 Bit PHY/Register-Adresse, 2 Bit TA und 16
Datenbits. Die 32 Bit für Preamble werden automatisch vom MAC erzeugt.
Die 32 Bit eines Befehls/Daten-Frames werden durch den µC in die
entsprechenden MAC-Register geschrieben bzw. 16 Bit davon bei einem
Lesebefehl von dort gelesen.
Die einzelnen 32+32 Bits sieht man per Scope auf der MDIO-Leitung
zeitlich von links (MSB) nach rechts (LSB).
Bei einem Schreibbefehl sendet der MAC des µC also 32+32 Bits.
Bei einem Lesebefehl sendet er nur 32+14 Bits. Der LAN9303 bedient dann
direkt anschließend die beiden TA-Bits und sendet 16 Datenbits.
Voraussetzung für eine solide SMI/PMI-Funktion ist ein geeignet
dimensionierter Pull-Up-Widerstand bei MDIO (typisch 4,7kΩ bis 1kΩ, je
nach MDC-Frequenz, die normalerweise 2,5MHz beträgt).
Noch etwas:
Die PHY-Register sind (per IEEE-802.3) alle 16 Bit breit, d.h. mit einem
Schreib/Lese-Befehl wird ein PHY-Register beschrieben/gelesen.
Die Switch-Register sind beim LAN9303 dagegen 32 Bit breit, d.h. man
benötigt immer zwei Schreib/Lesebefehle pro Switch-Register-Zugriff. Das
Register-Adressbit 0 legt fest, ob die oberen oder die unteren 16 Bit
geschrieben bzw. gelesen werden.
Zunächst solltest Du versuchen, ein paar Register mit bekanntem Inhalt
per SMI (Switch) und PMI (die beiden PHY-Ports) auszulesen.
Erst wenn das Lesen solide klappt, kannst Du auch in die PHY- bzw.
Switch-Register beschreiben.
Du bist Dir sicher im Klaren, dass die Ethernet-Daten zwischen Switch
und µC ausschließlich über das RMII gehen. Das ist dann die nächste
Übung.
* Bei anderen SMI-Definitionen, die nicht mit dem MIIM-Standard konform
sind, muss man oft auf Bit-Banging oder andere Tricks zurückgreifen.
Um einen phy register zu schreiben, muss man erst den EMAC1MADR von
pic32 mit phy adresse und register adresse beschreiben:
EMAC1MADR:
32:24 --------
23:16 --------
15:8 ---00000 (phy Adresse )
7:0 --00000 (register Adresse)
Ein einem beispiel vom Datenblatt pic32 phy adresse ist immer gleich
0x1f und so wird in den register geschrieben :
EMAC1MADR = reg_add | (phy_adrr << 8)
Wie kann ich nun auf diese weise einen 32 bit register von lan9303
schreiben?
Wie gesagt: Der SMI-Frame wird in Tabelle 10.1 beschrieben.
Demnach wird die Adresse des zu addressierenden Switch-Registers in zwei
Teile aufgeteilt, nämlich die unteren Bits [5:1] kommen nach REGISTER
ADDRESS [4:0] bzw. das untere Byte von Register EMAC1MADR.
Und die nächsten 4 Bit [9:6] kommen nach PHY ADDRESS [3:0], das nächst
höhere Byte von EMAC1MADR.
Zusätzlich muss für den SMI-Mode noch Bit 4 bei PHY ADDRESS bzw. (wenn
ich mich nicht verzählt habe) Bit 12 von EMAC1MADR auf 1 gesetzt werden
(wie gesagt, PIC32 ist nicht mein Ding).
Die 16-bit-Daten pro SMI-Frame kommen schließlich nach DATA bzw. werden
aus DATA gelesen.
Für einen vollständigen Switch-Register-Zugriff sind (wie bereits
beschrieben) wegen den 32-bit-Daten bei den Switch-Registern (statt 16
Bit bei PMI und den PHY-Registern) zwei SMI-Frames nötig, die sich
bezüglich Adressierung im LSB von REGISTER ADRESS unterscheiden (1 für
das höherwertige 16-bit-Wort (also Bytes 3 und 2) und 0 für das
niederwertige 16-bit-Wort (also Bytes 1 und 0).
Das steht übrigens alles ausführlich im LAN9303-Datenblatt direkt
oberhalb von Tabelle 10.1.
---
Das von Dir erwähnte EMAC1MADR-Beispiel bezieht sich nicht auf den
SMI-Mode, sondern allgemein auf den PMI-Mode (wenn also nur ein PHY
statt einem Switch am MAC des µC angeschlossen ist), der ganz allgemein
pro PHY* bis zu 32 PHY-Register addressieren kann.
Viele der Ethernet-PHY-Register (insbesondere die unteren 16) sind per
IEEE-802.3-Standard allgemein gültig und herstellerunabhängig bitgenau
festgelegt.
Die PHY-Register des LAN9303 sind in Tabelle 13.8 ganz knapp beschrieben
(hier heißen sie INDEX #), denn sie werden im Switch-Register-Satz
gespiegelt und sind dort ausführlich beschrieben (siehe Links in Tabelle
13.8).
Die PHY-Adresse für die beiden PHYs des LAN9303 ist je nach
phy_addr_sel_strap entweder 1 und 2 (Standard) oder 2 und 3.
Die PHY-Register und PHY-Adressen werden für einen
Standard-PHY-Software-Treiber benötigt, der bei einem Switch ggf.
richtig angepasst werden muss (wie bereits mehrfach erwähnt).
Falls man bei einem Switch auschließlich mit dem SMI und nicht auch noch
zusätzlich mit dem PMI arbeiten will, kann man die echten PHY-Register
des LAN9303 also auch indirekt per SMI erreichen. Allerdings müsste man
einen allgemeinen PHY-Software-Treiber (so überhaupt verwendet) dann
komplett auf SMI umschreiben. Wer will sich das antun?
So langsam solltest Du die Zusammenhänge begriffen haben, oder?
Ich habe auch nur das LAN9303-Datenblatt gelesen ...
* Theoretisch können wegen den 5 PHY-Adress-Bits laut IEEE-802.3 bis zu
32 verschiedene PHYs gemeinsam von einem einzigen MIIM bedient werden.
Bei Einzel-PHYs wird deren PHY-Adresse meist per Pin-Strapping
festgelegt.
Danke! Nun verstehe ich, wie ich phy_addr und reg_addr aus switch system
registern bilden kann. Deine Beschreibung und die Tabelle 10.1 echt gut
geholfen. Ich kann schon was lesen, aber die werte können variieren und
dann halb richtig. Z.b. für test_byte 0x064 bekomme ich 7654321h (
richtig 87654321h) und für chip id 1303 (richtig 9303).
Du machst Fortschritte, wenn auch ziemlich langsam. ;-)
Offensichtlich geht beim Lesen per SMI (und vermutlich auch per PMI)
genau das höchstwertige Bit des 16-Bit-Datenwortes verloren.
Das kann zwei Gründe haben:
1. Der Pull-Up-Widerstand an MDIO ist nicht richtig dimensioniert.
Für den LAN9303 werden 1,5 kOhm nach 3,3V (digitale Versorgung)
vorgeschlagen.
1.1 Wie groß ist der Wert tatsächlich?
1.2 Werden genau dieselben 3,3V auch beim RMII des PIC32 verwendet?
2. Für MDC sind beim LAN9303 im SMI-Betrieb maximal 2,5 MHz zulässig.
2.1 Welche Taktfrequenz wird vom PIC32 bei MDC geliefert?
In EMAC1MCFG des PIC32 muss per CLKSEL<3:0> bzw. EMAC1MCFG<5:2> die
CPU-Frequenz so heruntergeteilt werden, dass sich nicht mehr als 2,5MHz
für MDC ergeben, siehe auch Tabelle "MIIM Clock Selection" im
PIC32-Ethernet-Referenz-Manual*.
2.2 Wie groß ist die CPU-Frequenz und welchen Wert hat CLKSEL<3:0>?
Am Besten MDIO und MDC auch per Scope überprüfen (beide gemeinsam),
insbesondere das erste MDIO-Bit direkt nach TA (siehe Tabelle 10.1).
MDIO muss ausreichend steile Flanken haben, MDC sowieso.
* Eigentlich wollte ich mich damit nicht auch noch beschäftigen ... ;-)
Eberhard H. schrieb:> Du machst Fortschritte, wenn auch ziemlich langsam. ;-)>> Offensichtlich geht beim Lesen per SMI (und vermutlich auch per PMI)> genau das höchstwertige Bit des 16-Bit-Datenwortes verloren.>> Das kann zwei Gründe haben:>> 1. Der Pull-Up-Widerstand an MDIO ist nicht richtig dimensioniert.> Für den LAN9303 werden 1,5 kOhm nach 3,3V (digitale Versorgung)> vorgeschlagen.>> 1.1 Wie groß ist der Wert tatsächlich?> 1.2 Werden genau dieselben 3,3V auch beim RMII des PIC32 verwendet?>> 2. Für MDC sind beim LAN9303 im SMI-Betrieb maximal 2,5 MHz zulässig.> 2.1 Welche Taktfrequenz wird vom PIC32 bei MDC geliefert?>> In EMAC1MCFG des PIC32 muss per CLKSEL<3:0> bzw. EMAC1MCFG<5:2> die> CPU-Frequenz so heruntergeteilt werden, dass sich nicht mehr als 2,5MHz> für MDC ergeben, siehe auch Tabelle "MIIM Clock Selection" im> PIC32-Ethernet-Referenz-Manual*.>> 2.2 Wie groß ist die CPU-Frequenz und welchen Wert hat CLKSEL<3:0>?>> Am Besten MDIO und MDC auch per Scope überprüfen (beide gemeinsam),> insbesondere das erste MDIO-Bit direkt nach TA (siehe Tabelle 10.1).> MDIO muss ausreichend steile Flanken haben, MDC sowieso.>> * Eigentlich wollte ich mich damit nicht auch noch beschäftigen ... ;-)
Am MDIO habe ich einen 1.5K pull up wiederstand. LAN9303 und PIC32 haben
die gleiche 3.3 V Spannung.
Warum für MDC ist 2.5 MHz notwendig? Das verstehe ich nicht ganz.
Ich betreibe MII im reduce mode und so verdoppelt sich die Taktfrequenz
auf 50 MHz. So initialisiere ich ethernet MII mit System Frequenz von
PIC32 80 MHz und 50 MHz als MII clock. Fur MII nutze ich einen 50 MHz
externen Referenz clock von einem Oszillator.
Das war ein sehr guter Hinweis, MIIM Clock zu prüfen !!! Noch Mal Danke!
:)
Ich habe die auf 2 MHz runter gedreht und jetzt Daten von LAN9303 auch
richtig und vollständig.
Ich lerne auch bei dem Projekt und wusste nicht, dass z.B. MII Clock
nicht mehr als 2.5 MHz sein überschreiten soll.
So jetzt ist die nächste Aufgabe, Switch Register zu schreiben.
Ich habe z.b. noch nicht geschafft, den LED Register zu konfigurieren.
OK, gut.
Du hast zwei Dinge durcheinander gebracht, nämlich MII/RMII und das
MII-Management-Interface MIIM (bei SMC je nach Betriebsart PMI bzw. SMI
genannt.)
Hier die Zusammenhänge für Fast-Ethernet (FE):
Das MII ist per IEEE-802.3 festgelegt und wird bei FE-Betrieb* mit genau
25 MHz getaktet (die vom PHY bzw. Switch geliefert werden, nicht vom
MAC).
Das macht bei 2x 4 Datenleitungen insgesamt 100 Mbps
Vollduplex-Durchsatz. Über das MII werden ausschließlich Ethernet-Pakete
(= Daten) übertragen.
Vom MII gibt es noch eine Turbo-Variante mit 200 Mbps, die aber nicht
per IEEE-802.3 festgelegt (und auch nicht sehr verbreitet) ist.
Diese funktioniert natürlich nur, wenn sie sowohl vom MAC als auch vom
PHY bzw. Switch unterstützt wird.
Das RMII (nicht per IEEE-802.3 definiert) hat nur 2x 2 Datenleitungen
und benötigt deshalb genau 50 MHz RMII-Takt für dieselben 100 Mbps
Vollduplex.
Im Unterschied zum MII kann der RMII-Takt wahlweise vom PHY/Switch, vom
MAC oder von extern geliefert werden.
Wie ich eingangs geschrieben habe: Wenn man bei einem Design die Wahl
zwischen MII und RMII hat (oft hat man sie leider nicht), sollte man
immer das narrensichere und besser spezifizierte MII nehmen, das wegen
dem halben MII-Takt darüberhinaus auch noch weniger EMI (wichtig bei
Industrieanwendungen etc.) und damit weniger Kopfschmerzen beim
Entwickler erzeugt.
Das ebenfalls per IEEE-802.3 festgelegte und aus zwei Leitungen MDIO und
MDC bestehende MII-Management-Interface (MIIM**) wird vom MIIM-Master
per Definition mit maximal 2,5 MHz getaktet (weniger ist immer OK),
wobei es seit Jahren durchaus viele Ethernet-Bausteine gibt, die einen
deutlich schnelleren MDC-Takt erlauben.
Aber wiederum ist dafür Voraussetzung, dass beide Seiten den höheren
MDC-Takt unterstützen. Beim LAN9303 sind maximal 2,5 angegeben, also
darf der PIC32 das Signal MDC demnach nicht schneller als mit 2,5 MHz
takten. Und wie Du nun herausgefunden hast, klappt es locker mit 2 MHz.
Offensichtlich akzeptiert der LAN9303 zwar einen schnelleren MDC-Takt,
aber das Umschalten von Empfang auf Senden (nämlich während der
TA-Phase) klappt nicht schnell genug, wodurch das direkt auf 0 folgende
Bit im Zustand 1 (und nur in diesem) nicht schnell genug bereit gestellt
werden kann.
Die Übertragungsrate des MIIM ist normalerweise ziemlich unkritisch, da
über das MIIM ursprünglich nur der Status des PHYs abgefragt bzw. nach
dem Reset per MIIM ggf. einige Einstellungen gemacht werden, falls das
Pin-Strapping dafür nicht ausreicht.
Erst bei einem echten Switch-Management wünscht man sich für das
Management-Interface etwas höhere Taktraten. 2,5 MHz sind aber
normalerweise keine allzugroße große Einschränkung. Manche
Switch-Hersteller nehmen für das Switch-Management oft das schnellere
SPI, dann aber separat vom MIIM.
Wenn das bei Dir verwendete RMII des LAN9303 dann auch noch wunschgemäß
läuft (noch hast Du es nicht bestätigt), ist der Rest nur noch Software.
* Bei 10Base-T beträgt der MII-Takt (genau) 2,5 MHz.
** Das MIIM wird für MII, RMII und sogar GMII und RGMII gleichermaßen
verwendet, mit der kuriosen Tatsache, dass die Signal-Pegel für die
niedrigen Signalpegel moderner GMACs (<= 1,5V) ungeeignet sind und
deshalb - wenn man es genau nimmt - Pegelwandler beim MIIM nötig werden.