Hallo,
ich habe einen Microchip ENC28J60 an einem Xilinx FPGA angeschlossen.
Messtechnisch sind die Verbindungen in Ordnung, und auf dem Oszi sieht
das SPI-Signal am Chip so aus wie es soll.
Um zu sehen, ob die Datenübertragung funktioniert, würde ich den
ENC28J60 gerne mit einem minimalen Beispiel auf Funktion testen. Meine
Idee war, einfach die beiden LEDs blinken zu lassen, was ja laut
Datenblatt durch entsprechendes Setzen des PHLCON-Registers möglich ist.
Kommen wir gleich zur Sache: Es funktioniert nicht. Ich habe folgendes
ausgegeben (vielleicht liegt darin ja schon das Problem):
Zunächst einen software reset
-> 111 11111
Dann Bank 2 im ECON1 auswählen (da liegen MIREGADR, MIWRL und MIWRH)
-> 010 11111 00000010
Die Adresse von PHLCON (0x14) ins MIREGADR (0x14) schreiben
-> 010 10100 00010100
Ins MIWRL-Register (0x16) den Wert 1011 1010 zum LED-Blinken
-> 010 10110 10111010
Ins MIWRH-Register (0x17) den Wert 0000 1010 zum LED-Blinken
-> 010 10111 00001010
Zwischen jeder der genannten Übertragungen mache ich Pausen, in denen
ich CS auf High ziehe und die SPI-Clock ausschalte.
Nun die Frage: Habe ich was vergessen? Gibt es irgendwelche anderen
Kommandos, die man noch schicken muss, um den Chip aktiv zu schalten?
Oder hat er einfach das Zeitliche gesegnet?
schreib mal ins High-Register MIWRH 0011 1010
->kleiner tip am rande: Benutze den BitFieldSet-Command um Bits zu
setzen (100) und den BitFieldClear-Command um Bits zu löschen (101)
hi,
der einfachste test:
funktioniert das 'read control register' kommando?
wenn du nach dem 8ten clockimpuls noch 8 weitere clocks machst, müsste
auf der MISO leitung etwwas zu sehen sein.
fall da was kommt, solltest du prüfen, ob das auch einigermassen
plausibel ist (MSB kommt zuerst, datasheet 4.2.1).
:-)
In MIWRH habe ich jetzt 0011 1010 geschrieben. Hatte irgendwie zwei
inkonsistente Versionen des Datenblatts und mich versehentlich an der
älteren orientiert, die noch 0000 1010 vorgeschlagen hat. Leider ändert
das an das Tatsache, dass nichts blinkt, aber auch nichts.
Die BitFieldSet- und BitFieldClear-Kommandos machen natürlich an
bestimmten Stellen Sinn. Da sie laut Kapitel 4.2.5 des Datenblatts aber
auf MAC-, MII- und PHY-Register nicht angewendet werden können, wird
sich das auf die Bankwechsel beschränken.
Kontrollregister kann ich auslesen, z.B. habe ich nach dem
Software-Reset eine kontinuierliche Abfrage von ESTAT (000 11101 in Bank
1) eingebaut, um erst dann im Programmcode weiter fortzuschreiten, wenn
Bit 0 (LSB) gesetzt ist. Der ENC gibt hierbei auch 0000 0001 aus, wie zu
erwarten.
Ich werde mal schauen, ob es vielleicht daran liegt, dass ich die
anderen Register auch erst initialisieren muss, bevor die
Umkonfiguration der LEDs greift. Denn wenn ich ein Netzwerkkabel
anschließe, leuchtet eine LED und zeigt somit den Link-Status (wie in
der Default-Konfiguration festgelegt) an.
Danke trotzdem schon mal!
Ich hab meinen Fehler gefunden. Bei der Implementierung der Befehle habe
ich die in Kapitel 16 des Datenblatts angegebenen Timing-Restriktionen
nicht eingehalten. Nach einer Schreiboperation auf MI-Register (und
somit auch für PHLCON) muss der CS-Pin noch 210ns lang auf Low gehalten
werden... Es blinkt jetzt also munter vor sich hin :-)
So, ich bin mit dem ENC28J60 jetzt ein Stück weiter und stehe vor dem
nächsten Problem, genauer gesagt sind es sogar mehrere Wehwehchen:
1) Wenn ich EREVID abrufe, bekomme ich eine Revision 6 gemeldet (gibts
die denn überhaupt schon? Ein Errata-Sheet finde ich dazu auf jeden Fall
nicht). Schließe ich eine Mess-Strippe zwischen MISO und das Oszilloskop
an, sehen die Signale eigentlich recht gut aus und der ENC meldet
zuverlässig eine Revision 5. Ist jemandem sowas schon mal untergekommen?
Morgen werde ich eventuell zum Testen mal einen 10k Pullup/Pulldown an
MISO anschließen und sehen, ob sich damit was ändert...
2) Nach dem Reset ist bei mir im ECON1-Register das Bit 6 (RXRST)
gesetzt und bleibt gehalten. Laut Datenblatt sollte das doch aber
eigentlich mit Null initialisiert sein, oder?
3) Der Chip signalisiert auf LEDB zwar den Empfang von Paketen (in
meinem Fall ARP-Requests), erhöht EPKTCNT aber nicht, daher gehe ich
davon aus, dass er sie nicht in den Puffer schreibt. ERXST habe ich
hierbei auf 0x0000 gesetzt, ERXND auf 0x19FF und ERXRDPT ebenfalls auf
0x19FF. MARXEN und RXEN sind gesetzt, und ich habe auch schon versucht,
das in Problem (3) beschriebene RXRST zu clearen - ohne Erfolg...
Das ganze läuft bei einem SPI-Takt von 10 MHz. Über jegliche Hinweise
oder auch nur Vermutungen wäre ich dankbar :-)
Okay, die Problemchen haben sich alle nach einem langen Tag vor dem
Speicher-Oszi geklärt - im Fall (1) hat es ein schlichter 10k-Widerstand
gegen Masse getan, um den Einstreuungen den Garaus zu machen. Die
Leitungen zwischen FPGA und ENC28J60 sind leider recht dünn und auch gut
20cm lang, lassen sich durchs großzügige Layout des FPGA-Boards bedingt
aber auch nicht weiter reduzieren, insofern muss ich - zumindest für den
Prototypen - wohl damit leben. Bei (2) und (3) habe ich herausgefunden,
dass meine Implementierung ein Timing-Problem hatte, so dass manche
Lese- und Schreibvorgänge nicht korrekt ausgeführt wurden. So ist das
TXRST-Bit (welches ich selbst gesetzt hatte) fälschlicherweise als
RXRST-Bit gelesen worden...
Und richtige Pakete wurden dann draus, als ich ERDPT und EWRPT (welche
im Datenblatt eigentlich nie so richtig erwähnt werden) mal auf die
Werte meines Schreib- bzw. Lesepufferanfangs gesetzt habe...