Hallo, Ich würde gerne von meinem Nexys2 aus Daten per USB an den PC senden. Leider ist die Dokumentation sehr dürftig oder ich habe das entsprechende PDF bisher nicht gefunden. Es gibt den Schaltplan zu dem Board und ein ausführliches Testprojekt. Dieses ist allerdings in VHDL geschrieben (bisher habe ich nur mit Verilog gearbeitet). Herausgefunden habe ich dass die Kommunikation wohl in einem EPP ähnlichen Protokoll abläuft. Das Problem beginnt eigentlich schon damit, dass ich nicht weiß welche Pins an der FPGA für das Kommunikationsprotokoll mit dem CYC68013 vorgesehen sind. Die Pins für Die 8 Bit Daten konnte ich vermutlich identifizieren. Irgendwo habe ich gelesen das das Protokoll dazu noch 6 weitere Leitungen benötigt, aber da weiß ich jetzt nicht wo die an der FPGA liegen, bzw welcher Pin welche Leitung ist (Meiner Meinung nach kommen 11 Pins in Frage, die Namen im Schaltplan haben jedoch nichts mit den Namen die man auf Internetseiten über das EPP-Protokoll findet gemeinsam.) War hiermit jemand schon mal erfolgreicher als ich, oder kann mir sonst jemand Tips geben, wo ich was zu lesen finde? Das Beispielprojekt enthält zwar viele Kommentare, allerdings nur stichpunktartig, was nicht grade die Lesbarkeit verbessert. Viele Grüße, Christian
Hi! EPP ?! Ne eher nicht... Such dir im inet das manual vom Cypress FX2 chip. Die Verbindungen aufm Board bekommst du raus wenn du im Schaltplan beim FX2 guckst und vergleichst wo sie zum FPGA gehen. Auf den ersten Blick wirkt der FX2 sehr kompliziert. Wenn man das mit der Firmware schreiben und den Endpoints erstmal verstanden hat ist er aber schlichtweg genial :)
Hi, Vielen Dank für die Antwort! Eigentlich wollte ich nicht unbedingt eine neue Firmware für den FX2 schreiben. Mit der Firmware die von Digilent aus drauf ist kann man nämlich auch den FPGA über USB programmieren. Ich hatte es jetzt so verstanden als ob Digilent eine Firmware Programmiert hat, sodass sich der FX2 nach außen verhält als ob er einen EPP port hat. Im Schaltplan heißen manche Leitungen zwischen FPGA und FX2 explizit "EPP_..." Oder ist das falsch? Oder meinen die, dass das VHDL Modul, das im Beispielprojekt vorhanden ist, die EPP Schnittstelle emuliert und man dann mit diesem Modul über die EPP Schnittstelle kommunizieren kann? Es gibt ja von Digilent sogar einen speziellen Treiber für den USB Datentransfer. Das legt für mich eigentlich wieder ehr die Vermutung nahe, dass das EPP Protokoll um FX2 implementiert ist. Wenn ich jetzt doch eine eigene Firmware schreibe geht sicher die Möglichkeit verloren den FPGA zu programmieren, oder ist das irgendwie Hardwaremäßig im FX2 vorhanden? Viele Grüße, Christian
Also ne eigene firmware fürs fx2 ist mit ein bisschen literatur recherche schnell zusammengehackt. Die von digilent hab ich mir nicht angeguckt, wenn wollte ich das board mal für sehr große Datenmengen (>20 MByte/s) verwenden und da brauch ich eh zugriff auf die endpoints und meine eigene fifostruktur im fpga. Die FX2 Firmware kann man übrigends sehr schön per C Programm und usb lib jedesmal ins fx2 laden. funzt echt super. EPP: wie gesagt, kenn die digilent fw nicht... Für meine Anwendung wär das eh zu langsam da noch irgendein Protokoll drüber zu fahren. Außerdem brauchst du dann auf der PC Seite wieder Treiber für den FX2 die deinem Programm irgendwie die EPP Schnittstelle vorgaukeln. Da schreib ich lieber nen eigenes Protokoll über die endpoints direkt, da gibts ne nette lib für (linux) und das erreicht dann auch usb2 Geschwindigkeit. Wenn du nur <=800kByte/s brauchst ist nen FT245 für dich evtl besser. Der ist noch viel einfacher anzusteuern. Programmieren des fpgas: ja, digilent hat da was eigenes in der fx2 firmware. Das kann man aber auch selber nachbauen denk ich mal. Bzw was eigenes basteln. Das xilinx Protokoll zum laden der Fpga config ist relativ einfach ;)
Hier gibt es ein paar Informationen zur Firmware des Nexys 1: http://www.hackdaworld.org/cgi-bin/awki.cgi/NexysFPGA
gast wrote: > Also ne eigene firmware fürs fx2 ist mit ein bisschen literatur > recherche schnell zusammengehackt. Gut. Über kurz oder lang wollte ich mich sowieso mit dem Thema beschäftigen. > Die von digilent hab ich mir nicht angeguckt, wenn wollte ich das board > mal für sehr > große Datenmengen (>20 MByte/s) verwenden und da brauch ich eh zugriff > auf die endpoints > und meine eigene fifostruktur im fpga. > Die FX2 Firmware kann man übrigends sehr schön per C Programm und usb > lib jedesmal ins fx2 laden. funzt echt super. > Habe ich das richtig verstanden: - Digilent Code im externen EEPROM, wird beim Einschalten in den FX2 geladen. - Anschließend kann ich meinen eigenen Code in den internen Programmspeicher des FX2 laden, beim neustart ist der aber wieder verschwunden. Das wäre eine gute Alternative. Zwar vermutlich im Endeffekt beim Entwickeln etwas aufwändig, aber sicher der bessere Weg. Vor allem da ich mich so direkt in den FX2 einarbeiten kann. > EPP: > wie gesagt, kenn die digilent fw nicht... > Für meine Anwendung wär das eh zu langsam da noch irgendein Protokoll > drüber zu fahren. Ich habe gelesen, das Externe USB-Board geht bis 5,7MB/s > Außerdem brauchst du dann auf der PC Seite wieder Treiber für den FX2 > die deinem Programm irgendwie die EPP Schnittstelle vorgaukeln. > Da schreib ich lieber nen eigenes Protokoll über die endpoints direkt, > da gibts ne nette lib für (linux) und das erreicht dann auch usb2 > Geschwindigkeit. hast du einen Link dazu? > Wenn du nur <=800kByte/s brauchst ist nen FT245 für dich evtl besser. > Der ist noch viel einfacher anzusteuern. Ja, den habe ich bisher genutzt. Den Chip würde ich jederzeit wiederverwenden, allerdings wollte ich auch mal über die Datenrate hinaus. Mit dem EPP-Modus wäre man schon mal deutlich drüber, aber wenn ich um das Protokoll drum herum komme wäre das natürlich besser. > Programmieren des fpgas: > ja, digilent hat da was eigenes in der fx2 firmware. Das kann man aber > auch selber nachbauen > denk ich mal. Bzw was eigenes basteln. Das xilinx Protokoll zum laden > der > Fpga config ist relativ einfach ;) Ok, ich will nur nicht zu viele Sachen gleichzeitig machen. Wenn ich das oben richtig verstanden habe wäre das schon mal genug. Hast du vielleicht ein paar Beispiele? Oder Links wo es etwas zu lesen gibt? Gibt es ein Programm mit dem man den FX2 konfiguriert wie beim FT245? So eins konnte ich jedenfalls nicht auf der Cypress Homepage finden. Viele Grüße, Christian
Andreas Schwarz wrote: > Hier gibt es ein paar Informationen zur Firmware des Nexys 1: > http://www.hackdaworld.org/cgi-bin/awki.cgi/NexysFPGA Oh, ich habe irgendwie im Irrglauben gelebt, dass der Nexys1 kein USB drauf hatte. Die Seite kann ich mir mal ansehen. Danke! Allerdings bin ich im Moment doch ehr überzeugt die Möglichkeit mit eigener Firmware zu nehmen. Vorausgesetzt das funktioniert wie ich es verstanden habe.
code im fx2: Ich bin mir grad nicht sicher, aber ich glaub in der nähe vom fx2 ist ein nicht eingelöteter jumper. Der jumper ist unten aufm pcb kurzgeschlossen, dort die leiterbahn durchtrennen und einen jumper einlöten. Jumper gesteckt -> fx2 bottet ausm eeprom Jumper ab -> fx2 lädt keine firmware (nur die standardfirmware) und man kann ihn über usb bespielen (weiss nimmer obs nötig war mit dem durchtrennen, ist aber schnell gemacht und dank jjumper reversibel) fx2 infos: uff ist schon 2 monate her dass ich rumgespielt hab und ich hab die links nicht alle bei mir. hier eine quelle: http://www.cip.physik.uni-muenchen.de/~wwieser/elec/periph/USB-FX2/ da vorallem die software sektion: http://www.cip.physik.uni-muenchen.de/~wwieser/elec/periph/USB-FX2/software/
gast wrote: > code im fx2: > Ich bin mir grad nicht sicher, aber ich glaub in der nähe vom fx2 > ist ein nicht eingelöteter jumper. > Der jumper ist unten aufm pcb kurzgeschlossen, dort die leiterbahn > durchtrennen und einen jumper einlöten. > Jumper gesteckt -> fx2 bottet ausm eeprom > Jumper ab -> fx2 lädt keine firmware (nur die standardfirmware) und man > kann ihn über usb bespielen > (weiss nimmer obs nötig war mit dem durchtrennen, ist aber schnell > gemacht und dank jjumper reversibel) http://www.digilentinc.com/Data/Products/NEXYS2/Nexys2_sch.pdf Seite 2 JP6. Meinst du den? Ich habe mal sehr schlechte Erfahrungen gemacht, als ich von I2C Hardware einfach die Pull-UP Widerstände entfrernt habe: Es war ein Temperatursensor. Plötzlich roch es nach frisch gelötet. Am Temperatursensor habe ich mir die Finger verbrannt, als ich ihn dann angefasst habe. Er hat um die 150mA gezogen, wie ich später herausgefunden habe(im SOT Gehäuse). Ich könnte mir vorstellen, dass das der Grund ist warum der Jumper aus dem Design wieder entfernt wurde. In einem Datenblatt zu dem EEPROM konnte ich nicht finden ob man ihn mit Floating SDA betreiben darf. Ich würde es lieber lassen. Kann man nicht nachträglich, also wenn das Programm aus dem EEPROM geladen wurde ein anderes in den FX2 schreiben? Dann müsste ich mich auch nicht drum kümmern ein eigenes Programm zu schreiben um den FPGA zu Programmieren. > fx2 infos: > uff ist schon 2 monate her dass ich rumgespielt hab und ich hab die > links nicht alle bei mir. > So lange ist das nu auch wieder nicht ;-) > hier eine quelle: > http://www.cip.physik.uni-muenchen.de/~wwieser/elec/periph/USB-FX2/ > > da vorallem die software sektion: > >http://www.cip.physik.uni-muenchen.de/~wwieser/elec/periph/USB-FX2/software/ Danke! Ich werde es mir mal durchlesen. Vielleicht baue ich auch besser ein separates Board mit einem FX2. Viele Grüße und Danke für eure Hilfe, Christian
Also die I2C eeproms sind sehr robust... Ich glaube nicht dass da was passiert. Das weglassen wird eher andere Gründe haben, evtl vor DAUs die den support nerven weil nix geht. Ich habs bei mir durchtrennt und das Board lief so schon einige Stunden. Oder löte einfach nen 10k pullup hinter den Jumper auf die eeprom seite wenn du sicher gehen willst ;) Oder nen 100k pulldown falls gnd in der nähe ist :)
Also am Board wirklich was ändern würde ich ehr ungern. Aber mal sehen, vielleicht ist es die beste Lösung. Trotzdem ist es mir mulmig bei dem Gedanken an einem Multilayerboard herumzuschnitzen. Ein mal zu tief oder dumm abgerutscht und nix geht mehr. Das mit den DAUs glaube ich ehr nicht. Ich finde die Dokumentation zu dem Board ja dermaßen miserabel. Bzw eigentlich ist sie ja nicht mal vorhanden. DAUs schmeißen das Board entweder direkt in die Ecke, oder stehen in Dauerkontakt mit dem Support. ;-) Falls es ihn gibt. Wenn ich mich erinnere wie lange ich gesucht habe bis ich den Schalter on/off gefunden habe... Naja ein kleiner DAU steckt wohl in jedem von uns ;-) Trotzdem finde ich es könnte ein klein wenig mehr Dokumentation zu dem Board geben. Ich habe eigentlich keine Lust die Funktion der einzelnen Jumper aus dem Schaltplan und Datenblätter der Bauteile zu erschließen. Apropos, konntest Du ein Datenblatt zu dem "PSDRAM" finden? Zu wissen wie man den ansteuert, oder ehr was man bei den Timings beachten muss wäre auch nicht schlecht zu wissen. Vielleicht nehme ich auch zuerst mein altes FT245 Board und lege mir irgendwann ein FX2 Board zu. Das würde zumindest direkt Funktionieren. Schon ärgerlich. Als ich mir das FPGA Board gekauft habe war Grundvoraussetzung, dass es eine USB Schnittstelle hat. Aber dass es so ein Akt ist die zu nutzen hätte ich nicht gedacht. Ich habe kein Problem damit Zeit zu investieren und mich in ein Thema einzuarbeiten. Aber wenn wie bei dieser Digilent EPP Schnitstelle jeglicher Startpunkt fehlt vergeht die Arbeitslust sehr schnell. Noch mal die Frage: Eine eigene Firmware in den FX2 laden, wenn die aus dem EEPROM geladen wurde geht nicht? Oder muss ich mich dafür mal genau auf der Cypress Seite umschauen? Das wäre für mich die eleganteste Lösung. Angepasste Firmware ohne was an der Hardware rum zu basteln. Und gibt es Windowssoftware um die Firmware in den FX2 zu laden? Auf Andreas Seite konnte ich nur was für Linux finden. Viele Grüße, Christian
>Trotzdem ist es mir mulmig bei dem Gedanken an einem Multilayerboard >herumzuschnitzen. Ein mal zu tief oder dumm abgerutscht und nix geht >mehr. keine sorge, um bis in die mittleren lagen durchzudringen musst du sehr grobmotorisch sein oder sehr sehr hartnäckig ;) Die leiterbahn auf der oberfläche kannst du ganz leicht mit nem Schraubenzieher oä durchtrennen. >Noch mal die Frage: Eine eigene Firmware in den FX2 laden, wenn die aus >dem EEPROM geladen wurde geht nicht? Oder muss ich mich dafür mal genau >auf der Cypress Seite umschauen? Das wäre für mich die eleganteste >Lösung. Angepasste Firmware ohne was an der Hardware rum zu basteln. ich weiß nicht mehr warum ich das gemacht hab. Ich weiss nicht mehr ob man auch während das eeprom lief die firmware laden konnte. Evtl hab ich es auch nur durchgekrazt um zu sehen ob meine fw wirklich geladen wird oder so (glaub ich eher nicht) >Und gibt es Windowssoftware um die Firmware in den FX2 zu laden? Auf >Andreas Seite konnte ich nur was für Linux finden. keine ahnung.. ich hab nur linux kisten hier ;) ausserdem hab ich die software zum firmware laden aber selber in C geschrieben. Mit der usb lib geht das ganz fix und braucht nur wenige Zeilen code. Wie es unter win geht: ka :-\ sorry
> keine sorge, um bis in die mittleren lagen durchzudringen musst du sehr > grobmotorisch sein > oder sehr sehr hartnäckig ;) > Die leiterbahn auf der oberfläche kannst du ganz leicht mit nem > Schraubenzieher oä durchtrennen. Auf der Uni habe ich mal eine Leiterbahn unter einem 3D Mikroskop durchtrennt. Das sah echt gruselig aus. Aber grobmotorisch bin ich eigentlich nicht. > ich weiß nicht mehr warum ich das gemacht hab. > Ich weiss nicht mehr ob man auch während das eeprom lief die firmware > laden konnte. > Evtl hab ich es auch nur durchgekrazt um zu sehen ob meine fw wirklich > geladen wird oder so (glaub ich eher nicht) Bin mittlerweile auch ehr pessimistisch. > keine ahnung.. ich hab nur linux kisten hier ;) > ausserdem hab ich die software zum firmware laden aber selber in C > geschrieben. > Mit der usb lib geht das ganz fix und braucht nur wenige Zeilen code. > Wie es unter win geht: ka :-\ sorry Linux versuche ich momentan ein wenig auszuweichen, da da die Lüftersteuerung von meinem Notebook nicht richtig Funktioniert. Und das nervt auf dauer. Mehr als Windows. Läuft Modelsim eigentlich unter Linux? Das war für mich auch immer ein wichtiger Windows-Grund. Ich bin mir überhaupt nicht mehr sicher ob ich nicht lieber eine separate Platine für den FX2 bastele. Aber vielleicht sollte ich auch einfach ein bisschen mutiger sein und die Leiterbahn durchkratzen. ;-) Viele Grüße, Christian
Hallo FX2'ler also ich auch auch eine Nexys Board mit durchgekratzter EEPROM Brücke. Ohne EEPROM Zugriff startet der FX2 mit einer anderen VID / PID wodurch unter Windows ein anderer Treiber geladen wird. Mit EEPROM wird ja der Digilent Treiber geladen. Mit dem Digilent Treiber hab ich mich nicht weiter beschäftigt. Aber ich denke das es nicht möglich ist eine eigene Firmware über diesen Treiber in den FX2 zu laden. Ohne EEPROM kann man die Entwicklungsumgebung von Cypress nutzen. um deren Beispiel FW zu testen. Da die FW-Quelltexte dabei liegen kann man die auch modifizieren. Geht soweit ganz gut. über den FX2/68013/68013A gibt es hier im Forum noch ein paar Fäden (Thread) Vor allem für Leute die mit C# arbeiten wollen gibt es wohl einfachen zugriff auf den FX2 Ich nehme lieber Delphi und bin dabei einen Treiber für die CyUsb.sys zu schreiben. Viele Dinge funktionieren schon. Bei mir scheitert es im Moment daran, ein FPGA Design zu haben, welches Daten über den Slave Fifo Mode in den FX2 pumpt. Demnächst werde ich wohl mal ein Delphi Program haben welches den "bulkloop" (Cypress) verwendet. mfg DerDan
Hi > Ich nehme lieber Delphi und bin dabei einen Treiber für die CyUsb.sys zu > schreiben. Warum willst du einen Treiber selbst schreiben? Kann man nicht auch den fertigen von Cypress nehmen? Ich habe mir ein Board gebastelt auf dem ein eigener FX2 drauf ist. Ich habe mich dafür entschieden, da die Prozedur, wenn ich mal das Design des FPGAs verändern will, deutlich kürzer ist. Ist auch sicher mal eine gute Erfahrung so eine Platine mal selbst von Grund auf aufzubauen. Viele Grüße, Christian
hi *, unter: http://www.hackdaworld.org/~hunz/open_nexys.tar.bz2 gibt's ne fx2 fw fuer das nexys board inklusive gepatchtem xilprg. programmierung ueber das beiliegende gepatchte xilprg (-- bisher nur unter linux getestet) moeglich u. auch rudimentaerer usb transfer implementiert.. ganz nett als ausgangsbasis. -- beachte: * die bruecke zum eeprom muss beim fx2 unterbrochen werden, damit der nicht gleich seine interne fw laedt. dann alles wie in der enthaltenen readme.txt.. * das usbtest modul darf unter linux nicht geladen sein, sonst kommt der fx2/fxload durcheinander (rmmod usbtest). gruss, k.
Hallo, Ich hab mich vielleicht falsch ausgedrückt. Ich möchte nicht CyUsb.sys ersetzen sondern auf CyUsb.sys mit Delphi Pascal zugreifen. Es funktioniert ja auch schon einiges. Im Moment hab ich nur einen seltsamen Effekt, dass ich die Deskriptoren nicht mehr einwandfrei lesen kann, nachdem ich den FPGA konfiguriert habe. und fertig ist auch noch nicht alles. mfg DerDan
DerDan wrote: > Hallo, > > Ich hab mich vielleicht falsch ausgedrückt. Ich möchte nicht CyUsb.sys > ersetzen sondern auf CyUsb.sys mit Delphi Pascal zugreifen. Aso. > Es funktioniert ja auch schon einiges. > Was denn z.B.? Ich habe mich bisher nur mit der Firmware Programmierung beschäftigt und die Daten dann mit dem Cypress Tool abgerufen. > Im Moment hab ich nur einen seltsamen Effekt, dass ich die Deskriptoren > nicht mehr einwandfrei lesen kann, nachdem ich den FPGA konfiguriert > habe. > Hm. Was ist denn im FPGA drin? Bei mir bisher nur ein Design, dass mir die Ports B oder D an die LEDs gibt. Der nächste Schritt wird bei mir sein den FX2 als Slave Fifo zu konfigurieren und mit dem FPGA Daten rein zu schreiben. Verwendest du noch den Standard Descriptor oder hast du da schon mal was angepasst? Ich habe den Descriptor schon mal verändert, würde aber gerne etwas genauer über das Thema bescheid wissen... > und fertig ist auch noch nicht alles. klar. bei mir auch nicht. Das wird auch noch sicher etwas dauern ;-) Viele Grüße, Christian
Hallo Christian, ins FPGA wird im Moment die Demo App von Digilent geladen. Einfach nur um zu sehen, ob das FPGA Konfigurieren geht. ein spezielles FPGA Design hab ich noch nicht. Nach allem was ich gelesen habe ist es sehr sinnvoll den Slave Fifo Mode zu verwenden. Bevor ich mich damit befasse, wollte ich meine eigene PC SW Haben um auch den Bulkloop im FX2 zu testen. dazu habe ich die Bulkloop Demo und mein FX2 Programm zur JTAG Konfiguration zusammengebastelt. damit lade ich nur noch eine Hex File und kann sowohl den FPGA Konfigurieren als auch den Bulkloop testen. Um den Bulkloop zu testen habe ich meine Delphi Interface zur CyUSB.sys ausgebaut und dann festgestellt, dass die Abfrage der Deskriptoren nicht richtig funktioniert. Mit welcher PC Entwicklungsumgebung willst du denn auf der PC Seite die SW generieren? mfg und schöne Grüße aus BaWü DerDan
Hi, > Nach allem was ich gelesen habe ist es sehr sinnvoll den Slave Fifo Mode > zu verwenden. Auf jeden Fall. Oder das GPIF. Das ist aber erst mal uninteressant für mich, weil auf jeden Fall ein FPGA am FX2 hängt. Daher werde ich mich erst mal nur mit dem Fifo beschäftigen. > Bevor ich mich damit befasse, wollte ich meine eigene PC SW Haben um > auch den Bulkloop im FX2 zu testen. Steht bei mir an, wenn das Fifo läuft. > dazu habe ich die Bulkloop Demo und mein FX2 Programm zur JTAG > Konfiguration zusammengebastelt. damit lade ich nur noch eine Hex File > und kann sowohl den FPGA Konfigurieren als auch den Bulkloop testen. > > Um den Bulkloop zu testen habe ich meine Delphi Interface zur CyUSB.sys > ausgebaut und dann festgestellt, dass die Abfrage der Deskriptoren nicht > richtig funktioniert. > Hast du das nur mit deiner Software getestet oder auch mal mit dem EZ Control Panel? > Mit welcher PC Entwicklungsumgebung willst du denn auf der PC Seite die > SW generieren? Vermutlich irgendwas C. Auf dem PC habe ich diese abgespeckte Version von Visual C++. Lange Zeit habe ich in Visual Basic programmiert, daher schließe ich das auch nicht ganz aus. Hätte halt den Vorteil, dass ich mich mit der Umgebung gut auskenne. Nur wird es wenige Beispiele dafür geben. Außerdem könnte ich mir vorstellen, dass C einfach besser geeignet ist als VB. Aber wie man die CyUSB.sys nutzt sollte ja von der Programmiersprache ehr unabhängig sein. Mich würde interessieren wie dein Code dazu aussieht und was du raus gefunden hast worauf man achten muss. Ich kann dir auch ein paar Firmware Code schnipsel schicken, falls es dich interessiert. Ist aber wirklich nicht viel bisher... Viele Grüße aus Bonn, Christian
Hallo Christian, FW Schnipsel wären schon ganz nett, am besten mit einer FPGA Konfiguration, welches Daten für den FX2 generiert, irgend ein spezielles Pattern (zur not auch einfach hochzählen). Verwendest du auch das Nexys oder Nexys2 Board von Digilent? Visual Basic: da kann man sich bei Cypress den "SuiteUSB.NET" laden und dann unter "Visual Basic.net" damit arbeiten. Ansonsten hast du das gleiche Problem wie ich, ein Interface zu CyUsb.sys zu basteln. Cypress unterstützt wohl nur Microsoft Programmier-Umgebungen. Irgendwie will ich mir das nicht auch noch antun. Viel von meinem Delphi Code habe ich aus der Dokumentation und der Datei "CyUsb.pdf" abgeleitet. Meine Unit für das Interface ist mittlerweile über 1300 Zeilen lang. mfg DerDan
> Visual Basic: da kann man sich bei Cypress den "SuiteUSB.NET" laden und > dann unter "Visual Basic.net" damit arbeiten. Ansonsten hast du das > gleiche Problem wie ich, ein Interface zu CyUsb.sys zu basteln. > So weit ich weiß ist VB.Net doch schon ne Ecke anders als VB. Ich wollte eh mal früher oder später ordentlich anfangen was in C zu schreiben. Wäre ein guter Vorwand. > Cypress unterstützt wohl nur Microsoft Programmier-Umgebungen. > Irgendwie will ich mir das nicht auch noch antun. Aus Überzeugung oder aus Gewohnheit? > FW Schnipsel wären schon ganz nett, am besten mit einer FPGA > Konfiguration, welches Daten für den FX2 generiert, irgend ein > spezielles Pattern (zur not auch einfach hochzählen). Verwendest du auch > das Nexys oder Nexys2 Board von Digilent? Ich habe das Nexys2 (Daher ja überhaupt dieser Thread...) Meine FPGA Konfigurationen nutzen dir wahrscheinlich nicht so viel, da ich ja ein externes FX2 Board nutze. Aber mal zum Code: Zuerst möchte ich sagen, dass ich keineswegs sicher bin, dass das was ich hier schreibe richtig ist. Es basiert auf meinen spärlichen Erfahrungen. Für Ergänzungen bin ich immer Dankbar. Ich habe mit dem Bulkloop Beispiel angefangen. Bulksrc ist aber glaube ich genau so gut. Im Projekt gibt es - so weit ich bisher weis - 3 wichtige Dateien. 1) fw.c hier steht das hauptprogramm drin. Behandlung von Anfragen auf endpoint 0 und sowas. Die Datei habe ich erst mal gelassen wie sie ist. 2) descr.a51 hier steht die Endpoint-Konfiguration drin. Kann man anfangs so lassen, aber sobald man die Endpunkte anders verwenden möchte muss man hier Änderungen vornehmen. Später dazu mehr. 3) bulkloop.src hier stehen 2 wichtige Funktionen drin I)void TD_Init(void) wird einmal am anfang aufgerufen. II)void TD_Poll(void) wird permanent aufgerufen, außer der chip ist im suspend mode. Das erste was ich gemacht habe, war in de TD_init reinzuschreiben, dass etwas an den ports ausgegeben werden soll: Zuerst muss man die Ports auf Output stellen. Das geht bitweise mit: OEB=255; OED=255; In einem anderen Register kann man einstellen ob die Pins als Port, Slave-Fifo oder GPIF genutzt werden. Da die standarteinstellung Port ist muss man hier erst mal nichts machen. Dann stellt man die Werte ein die ausgegeben werden: IOB=170; IOD=85; Das kann man per FPGA mal auf die LEDs ausgeben und sehen, dass das erste Hello World Programm funktioniert. ---------------------------------------------------------- Der meiner Meinung nach nächste sinnvolle Schritt ist die Nutzung von Endpoint 1. Der FX2 hat 6 Endpunkte. Wie ich es verstanden habe ist EP0 nur für Konfiguration bzw. USB Protokoll. Auf EP0 gehe ich nicht weiter ein, schon alleine weil ich da nicht viel weiß. EP2,4,6,8 sind Hauptsächlich gedacht um über Slave FIFO oder GPIF Daten mit hoher Rate über USB zu schaufeln. Das geht ohne Tätigkeit des Prozessors und daher so schnell. Wenn man will kann man aber auch mit dem Prozessor auf die Register des FIFOs zugreifen. Die Richtung (IN oder OUT) ist konfigurierbar, aber fest. Dann gibt es noch EP1. Auf den kann man nicht von außen direkt schreiben. Das geht nur vom Prozessor aus. Die Fifos von EP1 sin 64 Byte groß. Es gibt 2. Einen für IN einen für OUT. Die Fifos sind einfach gebuffert. d.h., wenn ein Buffer vom SIE verwendet wird kann/sollte man nicht daraus lesen/darein schreiben. Will man EP1 verwenden muss man zuerst den descriptor anpassen. Mit der Struktur der Datei muss ich mich noch auseinander setzen, aber hier mal ein Anfang der funktioniert. Es gibt mehrere Konfigurationen, da mein Notebook Highspeed USB Ports hat passe ich erst mal nur den Highspeed Teil an. Es gibt einen Teil, drüber steht: ;; Interface Descriptor hier muss man ;; Number of end points anpassen. Ich ändere den Wert von 4 auf 6, da ich EP1 In und OUT nutzen will. Darunter muss man 2 neue ;; Endpoint Descriptor einfügen. Natürlich samt den 7 Zeilen die direkt drunter stehen. anpassen muss man: db 01H ;; Endpoint number, and direction beim 2. steht da 81H, die 8 steht scheinbar für die Richtung optional kann man die transferart ändern: Erlaubt sind Interrupt und Bulk, Isochronous hingegen nicht. db ET_INT ;; Endpoint type Die Werte habe ich auf die größe des Fifos gestellt. Also 64 Byte. db 40H ;; Maximun packet size (LSB) db 00H ;; Max packect size (MSB) Das kann man jetzt speichern und erst mal neu compilieren. Wenn man das auf den FX2 spielt und ihn dann im EZ Control-Panel öffnet sollten nun 6 Pipes erscheinen. ----------------- Jetzt muss man sich noch darum kümmern die endpunkte in der Firmware zu verwenden. Ich habe die Endpunkte als interrupt konfiguriert. Wenn man das macht muss man die Konfiguration in der Firmware anpassen, da die Standarteinstellung Bulk ist. Das geht in der void TD_Init(void). Angepasst werden müssen: EP1OUTCFG und EP1INCFG (siehe TRM Seite 346 (Ich spreche immer von der Seitenzahl die im Reader angezeigt wird. Nicht die die auf der Seite steht.) Beide werte müssen auf 0xB0 gestellt werden für: EP ist aktiviert und transfermode=interrupt. Jetzt muss man EP1OUT scharf machen. D.h. freischalten, dass vom PC aus was reingeschrieben werden kann. Das geht mit: EP1OUTBC=64; Man kann auch jeden anderen Wert reinschreiben (auch 0 oder den aktuellen Wert.) Scharf machen geht alleine durch den Schribzugriff. Hier muss man aufpassen! Es gibt register zwischen deren schreib lese zugriffen man ein Syncronisationdelay einbauen muss. Das geht einfach mit: SYNCDELAY; welche register das genau sind guckt man im TRM auf seite 425 nach. das EP1OUTBC gehört denke ich dazu. Zum Glück sind die Buffer nicht Alphabetisch sortiert. Dann hat man mehr Spaß beim suchen. Sonst braucht man dieses Byte noch: Es gibt an wie viele Bytes im Buffer sind die der PC gesendet hat. Wenn der PC etwas gesendet hat ist folgende Aussage wahr: !(EP1OUTCS&2) m.a.W. das Bit Nr. 2 in EP1OUTCS ist 0. Ist das Bit=1 sollte man keinesfalls aus in das fifo schreiben oder draus lesen, da die SIE das FIFO grade nutzt. Sind also Daten vom PC angekommen (Das überprüfte Bit oben ist 0) so kann man die Lesen. z.B. auf Port B wird der Inhalt des ersten Bytes ausgegeben, auf PORTD die anzahl der übertragenen Bytes. Das geht mit: if (!(EP1OUTCS&2)){ IOB=EP1OUTBUF[0]; IOD=EP1OUTBC; SYNCDELAY; EP1OUTBC=0; //wieder scharf machen } Hier würde ich nochmal compilieren und testen. Als nächstes kann man versuchen Daten an den PC zu schicken. Ich habe mal einfach die Daten die der PC gesendet hat an den PC zurück geschickt. das geht mit: int j,cnt; cnt=EP1OUTBC; //abfragen wie viele bytes vom pc zum fx2 gesendet wurden for (j=0;j<cnt;j++){ EP1INBUF[j]=EP1OUTBUF[j]; //Daten vom einen in den anderen Buffer kopieren } SYNCDELAY; EP1OUTBC=0; //neu scharf machen SYNCDELAY; EP1INBC=cnt; //bekannt geben wie viele bytes man in den EP1 geschrieben hat. jetzt können sie vom pc abgerufen werden. Ich glaube das erste Syncdelay ist überflüssig. Auch damit muss ich mich noch genauer beschäftigen. So ich hoffe das macht dir den Start in die Firmware Programmierung etwas leichter als mir. War doch recht mühsehlig, da man nirgends eine VOLLSTÄNDIGE Anleitung findet die wirklich NUR das enthält was man am Anfang braucht. Viele Sachen muss man sich natürlich noch genauer angucken. Aber immerhin ist ein Anfang geschafft. Ich denke auch, dass der schwierigste Teil hinter mir liegt. Falls dieses kleine Tutorial noch jemandem mal hilfreich ist würde ich mich sehr über eine kleine Nachricht in diesem Thread freuen! > Viel von meinem Delphi Code habe ich aus der Dokumentation und der Datei > "CyUsb.pdf" abgeleitet. Meine Unit für das Interface ist mittlerweile > über 1300 Zeilen lang. Habe ich eben gesagt das Schwierigste liegt hinter mir? Die PC Seite hatte ich ja ganz vergessen... Naja wird auch irgendwie klappen. So jetzt muss ich endlich noch was für meine Prüfung lernen. Viele Grüße, Christian
Hi, @DerDan: Arbeitest du noch am Projekt? Daten vom FPGA per FIFO in den FX2 funktioniert bei mir jetzt. Kommt auch alles richtig an. Jetzt sitze ich vor der Aufgabe die Software auf dem PC zu schreiben... Wie weit bist du dabei gekommen? Viele Grüße, Christian
Hallo, Delphi - SW funktioniert soweit, das im Bulkloop Mode Daten verschoben werden. Ich erreiche damit zwar "nur" ca 10MByte pro Sekunde, aber immerhin. Ich bin dabei eine Design fürs FPGA zu basteln um Daten zu generieren und in den FX2 zu füttern. Wenn ich dann wieder auf 10MByte/sec komme bin ich schon mal happy. den IFCLK hab ich schon benutzt um eine LED blinken zu lassen... MFG DerDan
DerDan wrote: > Hallo, > > > Delphi - SW funktioniert soweit, das im Bulkloop Mode Daten verschoben > werden. Ich erreiche damit zwar "nur" ca 10MByte pro Sekunde, aber > immerhin. > Klingt nicht schlecht. Kannst du mir den Source Code schicken? Würde mich sehr freuen. Das Beispiel das von Cypress in C dabei ist lässt sich bei mir nicht Compilieren. > Ich bin dabei eine Design fürs FPGA zu basteln um Daten zu generieren > und in den FX2 zu füttern. Wenn ich dann wieder auf 10MByte/sec komme > bin ich schon mal happy. den IFCLK hab ich schon benutzt um eine LED > blinken zu lassen... In Verilog oder VHDL? In Verilog könnte ich dir meinen Code schicken, wenn es dich interessiert. Ist aber auch nix großartiges... Flags werden an die LEDs gegeben, am Port wird hochgezählt sofern das FIFO nicht voll ist, der Wert des Fifos wird zusätzlich an der 7 Segement Anzeige ausgegeben. Viele Grüße, Christian
Hallo Christian, wir können gerne drüber reden Quelltexte zu tauschen. Aber was nutzen dir meine Delphi Quellen, wenn du in C programmieren möchtest. Das was ich über die aktuelle Entwicklungsumgebung für C# unter .Net gelesen habe hört sich doch ganz gut an. Ich mach halt das was ich kann, und das ist Delphi. mfg derDan
DerDan wrote: > Hallo Christian, > > > wir können gerne drüber reden Quelltexte zu tauschen. Aber was nutzen > dir meine Delphi Quellen, wenn du in C programmieren möchtest. > Dann weiß ich immerhin mit welchen Befehlen ich die Lib initialisiere... Die Beschreibung der CyAPI im PDF ist zwar gut, aber ich denke mit einem einfachen Beispiel könnte der Einstieg einfacher sein. Viele Grüße Christian
Hallo, ich habe es hinbekommen: FX2 läuft als Slave Fifo mit EP6 512Byte double buffered. CyUsb Treiber wird unter Delphi angesteuert. FPGA füttert den FX2 mit Daten. Receive im Bulk Mode liegt bei bis zu 37 MByte / sec. Der Turbo Knopf ist echt die CyUsb Funktion "IOCTL_ADAPT_SET_TRANSFER_SIZE" mit 128kByte kommen die o.g Werte raus. ----- Leider gibt es im Datenstrom immer wieder mal größere Lücken (bis zu 3ms) in denen keine Daten übertragen werden. 3ms * 48MByte / sek = 144 kByte. So groß müsste ein Fifo sein um Datenverluste zu vermeiden, wenn in dieser Zeit Daten mit 48MHz anfallen. ganz schön viel. Ist mit dem interen Blockram des Spartan leider nicht zu schultern. Ist mir ein Rätsel, wie man einen kontinuierlichen Datentransfer hin bekommt bei denen das interne Fifo des FX2 ausreicht. Ich bin mir fast sicher, dass sie Lücken auftreten, wenn der USB Treiber seine Daten an den Thread übergibt. mfg DerDan
Hi, > Receive im Bulk Mode liegt bei bis zu 37 MByte / sec. Klint ja super. Wenn ich das auch hinbekomme bin ich zufrieden. > Der Turbo Knopf ist echt die CyUsb Funktion > "IOCTL_ADAPT_SET_TRANSFER_SIZE" > mit 128kByte kommen die o.g Werte raus. Gut zu wissn. > Leider gibt es im Datenstrom immer wieder mal größere Lücken (bis zu > 3ms) in denen keine Daten übertragen werden. > > 3ms * 48MByte / sek = 144 kByte. > nicht ehr 3ms*37MB/s? Wenn die Daten mit 48MB/s kommen bekommt man ja eh nicht alles übertragen. aber ok, das ist nicht bedeutend weniger. > Ist mir ein Rätsel, wie man einen kontinuierlichen Datentransfer hin > bekommt bei denen das interne Fifo des FX2 ausreicht. > Hast du mal den Isochronous Modus versucht? Mir persönlich würden die Pausen aber auch nichts ausmachen. Ich kann mir auch keine Anwendung vorstellen bei der man die hohe Datenrate wirklich permanent braucht. Leider hatte ich bisher noch keine Zeit mich mit der PC Seite zu beschäftigen. Aber das kommt als nächstes. Viele Grüße, Christian
Probier doch mal, den EP6 als quad-buffered zu konfigurieren. Vielleicht bringt es was.
Ohne dass ich jetzt nochmal den ganzen Thread durchlese und wieder weiß was ich vor 2 jahren alles getan habe: - Mit einem separaten FX2 habe ich etwas hinbekommen. Mit den Datenraten war ich ganz zufrieden. Seitdem habe ich aber nichts weiter dran gemacht. - Zum Transfer mit dem FX2 der auf dem nexys2-Board drauf ist habe ich nichts mehr probiert. Allerdings habe ich gesehen, dass das digilent interface in der doku mittlerweile ganz gut beschrieben ist.
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.