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 :-)
>>Dann Bank 2 im ECON1 auswählen (da liegen MIREGADR, MIWRL und MIWRH) >>-> 010 11111 00000010 Das meinte ich mit BFC und BFS anstatt WCR Command ;)
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...
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.