Hallo,
ich habe ein Problem mit dem PHY DP83848VV am STM32F429:
Kurz:
Nach Verwenden der BIST-Funktion bekomme ich beim Lesen des PHYCR
Registers ein FFFF zurück....
Lang:
Mit meinem Evalboard hab ich ein abgewandeltes Example-Programm zum
Laufen bekommen. (Dazu gab es noch nen anderen Thread, aber das hier ist
ein neues Thema...)
Ich wollte nun das Programm auf die Zielhardware portieren (eigene
Platine mit STM32 und dem PHY). Dazu habe ich in der CubeIDE per CubeMX
ein neues Projekt erstellt und konfiguriert. Danach die nötigen
Codeteile kopiert. Die Kommunikation läuft aktuell über netconn.
Ich kann eine netconn erzeugen und binden, allerdings kann ich mich
nicht mit einem Verbindungspartner verbinden. Laut LWIP Debug kommt die
Meldung, dass zu viele Verbindungsversuche aufgetreten sind. Es kommt
angeblich nichts zurück.
Am Verbindungspartner blinkt die "Act-LED" am LAN Anschluss, aber laut
"Ethernet Monitor" (Verbindungspartner ist ein Messgerät mit Software
Logger für die Ethernet Kommunikation) kommt nichts an, bzw. es wird
nichts angezeigt.
Verwende ich den PC mit Wireshark als Verbindungspartner , zeigt der mir
auch keine eingehenden Pakete vom uC.
--> Eigentlich müsste ich doch hier was sehen, oder? Es scheint, als ob
der uC nichts sendet...
Das LWIP Debug zeigt mir aber eingehende Broadcasts vom PC an, also
scheint zumindest die RD Seite zu klappen...
Nun wollte ich MII und TD mit der "BIST" Funktion des DP83848
überprüfen.
Dazu habe ich nun wieder ein neues leeres Programm mit Ethernet in
CubeMX erzeugt. Nach der Init-Routine des Ethernet lese ich nun die
Register des PHY aus, ändere einzelne Bits und schreibe die Register
wieder:
Beispiel: 1 | uint16_t regvalue;
| 2 | printf("Init: %x\n",regvalue);
| 3 | HAL_ETH_ReadPHYRegister(&heth, 0x00, ®value);
| 4 | printf("Read BMCR: %x\n",regvalue);
| 5 | regvalue |= PHY_LOOPBACK;
| 6 | printf("Write BMCR: %x\n",regvalue);
| 7 | HAL_ETH_WritePHYRegister(&heth, 0x00, ®value);
|
Im BMCR Register sind das "Speed Selection" Bit und das "Duplex Mode"
Bit gesetzt. Ich schreibe noch das "Loopback" Bit dazu.
Dann lese ich das PHYCR Register, wo das "MDIX_EN" Bit gesetzt ist,
sowie das "LED_CNFG[0]" Bit und das "PHY ADDR" (0) Bit.
Hier setze ich nun noch das "BIST_START" Bit zu 1.
Laut Doku soll man nun das "BIST_STATUS" Bit prüfen, ob es 1 ist, dann
wäre alles ok. Aber beim Lesen des PHYCR Register oder des CDCTRL1
Register kommt ein FFFF zurück.
Das ergibt für mich keinen Sinn...
--> Woran kann das liegen?
--> Die MII Schnittstelle sollte doch klappen, wenn ich die Register
lesen und schreiben kann, bzw. wenn zumindest das Empfangen per Ethernet
klappt, oder?
Ich vermute einen Fehler im Routing meiner TD Leitungen, was ich mit dem
BIST und einem Loopback Stecker testen wollte. Aber leider bin ich zu
blöd dazu.... :-)
Vielen Dank vorab!
Ergänzung:
Ein Test des Programms auf dem EVAL Board zeigt das gleiche Verhalten.
Auch ein FFFF ab dem Zeitpunkt, wo ich das BIST starte.
Woran kann das liegen?
Daniel F. schrieb:
> Beispiel: uint16_t regvalue;
> printf("Init: %x\n",regvalue);
> HAL_ETH_ReadPHYRegister(&heth, 0x00, ®value);
> printf("Read BMCR: %x\n",regvalue);
> regvalue |= PHY_LOOPBACK;
> printf("Write BMCR: %x\n",regvalue);
> HAL_ETH_WritePHYRegister(&heth, 0x00, ®value);
Hab einen Fehler gefunden!
Beim Schreiben wird kein Pointer verwendet, sondern der Wert direkt.
Weiterhin muss die Variable eine uint32_t sein.
Somit ist die Lösung:
1 | uint32_t regvalue;
| 2 | printf("Init: %x\n",(uint16_t)regvalue);
| 3 | HAL_ETH_ReadPHYRegister(&heth, 0x00, ®value);
| 4 | printf("Read BMCR: %x\n",(uint16_t)regvalue);
| 5 | regvalue |= PHY_LOOPBACK;
| 6 | printf("Write BMCR: %x\n",(uint16_t)regvalue);
| 7 | HAL_ETH_WritePHYRegister(&heth, 0x00, regvalue);
|
Hab es diagnostiziert, indem ich die Register beschrieben und direkt
wieder ausgelesen habe. War ein wenig Try'n'Error.
Und ich hab nach der Verwendung der Befehle in der HAL Library gesucht.
Auf jeden Fall funktioniert nun der BIST Test über einen LOOPBACK
Stecker in der LAN Buchse.
Allerdings kommen (scheinbar) noch keine Daten an.
Laut Debug möchte LwIP sich mit einem Zielport verbinden, jedoch kommt
keine Antwort.
Eine Idee?
Daniel F. schrieb:
> Allerdings kommen (scheinbar) noch keine Daten an.
> Laut Debug möchte LwIP sich mit einem Zielport verbinden, jedoch kommt
> keine Antwort.
Häng doch mal einen Logic Analyzer an Dein MII und schau was zwischen µC
und PHY so an Daten fließt und ob das zu dem passt was Du erwartest.
Damit kannst Du eingrenzen ob das Problem eher auf der MAC-Ebene oder
der PHY-Ebene liegt - auf der Gegenstelle kommt ja weiterhin nichts an
wenn ich Dich richtig verstehe.
Ok, danke für den Tip.
Werde ich morgen mal testen.
Ich bin bisher davon ausgegangen, dass wenn ich die Register des PHY
auslesen und beschreiben kann, dass die MII Schnittstelle dann korrekt
funktionieren sollte.
Sehe ich das richtig, dass das nicht unbedingt so ist?
Daniel F. schrieb:
> Ich bin bisher davon ausgegangen, dass wenn ich die Register des PHY
> auslesen und beschreiben kann, dass die MII Schnittstelle dann korrekt
> funktionieren sollte.
> Sehe ich das richtig, dass das nicht unbedingt so ist?
Das Auslesen und Beschreiben der Register geht bei MII über die
MDIO-Pins. Das ist ein Bus ähnlich I2C. Das ist getrennt von den
eigentlichen Datensignalen.
Wenn Du also die Register auslesen kannst, heißt das nicht daß auch die
Daten korrekt fließen.
Wenn der Loopback-Test wirklich ohne Fehler durchläuft, dürften die Pins
aber nicht allzu falsch angeschlossen sein. Aber der MAC könnte z.B.
falsche Daten senden oder aber der Anschluss des PHY an Magnetics und
Buchse falsch sein. Wenn Du Dir die Daten anschaust die auf dem MII
laufen, kannst erkennen in welche Richtung Du schauen musst.
Noch ein Punkt der mir einfällt: schau Dir die Taktgenerierung für den
PHY an. Die muss sauber sein. PHYs mögen z.B. Jitter gar nicht und
reagieren dann mit Link-Abbrüchen oder bekommen keine Daten empfangen
oder gesendet. Ich weiß von einigen Fällen bei denen das klar die
Ursache für Ethernet-Probleme war, z.B. Takt per schlecter PLL aus einem
µC generiert oder unpassender MEMS-Oszillator verwendet.
Hi,
danke für die Infos!
Hab mich mittlerweile auch noch ein wenig in die MII Schnittstelle
eingelesen...
Der BIST Test testet wohl die RX und TX Leitungen am Ethernet Port. Mit
einem RJ45 Loopback Stecker ist der Test erfolgreich. Ohne Stecker
nicht.
Daher gehe ich nicht davon aus, dass hier ein Problem ist. Es müsste
also alles ab PHY in Richtung LAN korrekt sein.
Ich dachte, dass man mit dem BIST Test auch die MII Schnittstelle testen
kann. Allerdings scheint das nicht zu gehen.
Ich finde nur den Loopback Modus, der kommende Daten vom MII wieder an
den uC zurücksendet.
Allerdings habe ich noch nicht herausgefunden, wie ich "manuell" per MII
Daten senden und wieder lesen kann, sodass ich hier mal ausgehende und
eingehende Daten vergleichen kann.
Ich habe beim Routen nicht richtig aufgepasst und habe die TXD Leitungen
nicht gleich lang gemacht (zwischen 24 und 39mm). Daher hab ich nun
nochmal testweise an einer Platine die Leitungen durch Lackdrähte
ersetzt, die alle annähernd gleich lang sind. Auch ohne Erfolg.
An den Drähten hab ich nun ein RedPitaya mit Logic Analyzer dran.
Ich hab nun das Signal aufgenommen, in mehreren Zuständen:
Während dem Verbindungsaufbau, während der uC per debug in "pause" ist,
etc.
Ich werd aus dem Signal nicht schlau.
Erwartungsgemäß müsste das TXEN Signal ja auf high wechseln, wenn Daten
anliegen. Dort scheint aber eher ein Takt drauf zu sein.
Weiterhin ist TXCLK nicht wirklich konstant da, wobei ich auf anderen
Bildern gesehen hab, dass das scheinbar nicht immer so ist...
Manchmal hab ich ganz viel "Gewackel" auf den TXD Leitungen, was wie
Daten aussieht. Manchmal sind ein Teil der Leitungen auf Dauer-High...
Aktuell wälze ich das Datenblatt und versuche, das Signal zu deuten.
Eventuell sind das auch alles nur Störungen, das muss ich mit dem Oszi
nochmal testen...
Hi,
die CLK ist laut Logic Analyzer 25MHz, das passt!
Ich gehe davon aus, dass der Rest dann auch passen müsste.
Die Flanken liegen übereinander...
Aber ich kann nicht testen, ob die Daten auch dem entsprechen, was
gesendet wurde...
Wie kann ich denn auf der MII Schnittstelle bestimmte Daten senden?
Und wie kann ich da was empfangen?
Weil dann könnte ich die Daten definieren, die ich im Logic Analyzer
untersuche.
Oder ich könnte den Loopback des Phy testen...
Bitte melde dich an um einen Beitrag zu schreiben. Anmeldung ist kostenlos und dauert nur eine Minute.
|