hallo zusammen, ich hoffe mir kann einer helfen. Habe folgende Fragen: 1.) - habe 3 IN-endpoints,mit EPxCFG = E2 konfig. - schreibe abwechselnd mit 256 takten daten in die fifos - kann die Daten in der CyConsole mittels button "transfer Data" auch abholen. Frage: die fifos sind alle 512B groß, schreibe 256 * 16Bit breit daten in jede Fifo = fifo voll. kann in der CyConsole aber nur 4 pakete a 64B abholen.Müßten es doch aber 8 sein Weiterhin wechselt die Menge der Pakete die ich pro fifo abholen kann: ungefähr so: ep2 4Pakete ,ep6 4Pakete , ep4 6Pakete ,ep2 dann 6Pakete,ep6 6Pakete, ep4 4Pakete ??? woran liegt das? Wie kann ich alle 8 64Byte Pakete aus jeder fifo abholen? 2.) wie kann ich die Firmware dazu bringen in den highspeed-Mode zu wechseln? Benutze zu testzwecken noch ein abgewandeltes Beispiel von Cypress 3.) Wie schon gesagt die Daten kommen in der CyConsole mehr oder weniger an. Versuche mich nun an einem Programm (in c#) zum regelmäßigen auslesen der EP´s -> klappt aber nicht so richtig, auch die beispiele in der "programmer´s reference" sind eher spärlich. Wie kann ich die daten regelmäßig abfragen? Brauche bitte nen kleinen Ansatz? Danke im voraus
Zu 1): Hab jetzt nicht zur Gänze deine Konfiguration durchdacht, mir schoss aber gleich das Register, welches die FIFO's ab einem bestimmten Füllstand an die USB-Engine 'asserted', in den Kopf. Diese liegen - wenn ich mich recht entsinne - über Kreuz mit der Größeneinstellung. Die Konfigurationsmöglichkeiten der FIFO's sind teilweise beängstigend vielfältig - du solltest alles nocheinmal haarklein im Datenblatt nachvollziehen...bei mir passte es dann.
hab mal die init funktion in die datei gepackt. in Poll() passiert nix1 ist die config richtig? meinst du vielleicht das Register: EPxFIFOPFH:L ?
16 Bit mit 256 Takten sind aber nur 256 Byte, da das Slave FIFO Interface nur bei jeder 2. Taktflanke Daten aufnimmt. Siehe Datenblatt und Technical Reference Manual. HighSpeed macht der doch mit den Beispielen automatisch....du musst halt für die Endpunkte in dem Assembler File auch 512Byte Paketgröße angeben....
aha ??? kannst du mir bitte auch was zu 2. und 3. sagen? weiß echt nicht weiter
Zu 1. Sagte ich doch. Wenn du 256 Flanken am Slave-FIFO Interface machst, hast du 128 Worte reingeschrieben. Deswegen kannst du auch nur 256 Byte abholen. Schau dir die Timings im Datenblatt an. Zu 3. Wie "regelmäßig" muss das denn sein? Ich hole die Daten in einem Thread ab, da es BULK Transfer ist, kümmert sich Windows "irgendwann" mal darum, wenn du eine zugesicherte Bandbreite brauchst, müsstest du ISO-Streaming machen. Unser Mess-System stellt Daten nur auf Anforderung bereit, ich sage dem FPGA über einen OUT-Endpunkt, wieviele Daten er woher bereit stellen soll und dann lese ich die ein. Das können auch viel mehr sein als ein 612 Byte Paket. Dazu setze ich die XferSize auf den Wert, den ich lesen möchte. Übrigens geht die Sache viel einfacher mit der LibUSB. Da muss man sich um die optimale XferSize nicht kümmern, man sagt einfach meinetwegen, dass man 65000 Bytes lesen will, dann kümmert sich die Lib um den Rest. Ich hatte mal das BulkLoop Demo so abgeändert, dass der 8051 immer, wenn der IN FIFO nicht voll war, ihn wieder "scharf gemacht" hat. Somit konnte ich dauerhaft in einem Thread lesen. Dazu musste ich nur das BulkLoop PC Programm minimal ändern. Das hatte ich zum Speed testen gemacht. Man muss sich die Beispiele nur etwas anschauen, sind eigentlich selbsterklärend. Die Register auf dem FX2 sind zugegebenermaßen etwas viele, da muss man sich schon etwas länger mit dem TRM beschäftigen, um da durchzuschauen. Man kann da auch viel optimieren, z.B. ist es ganz gut, die Endpunkte Quad-Buffer zu machen, aber nicht erst bei vollem FIFO an die USB Domäne zu übergeben. Da muss man das AutoIn entsprechend setzen. Dann übergibt der meinetwegen nach 512 Byte den ersten Buffer an USB, während du in die 3 weiteren fröhlich weiter schreiben kannst. Das geht dann immer im Kreis, du hast dann eine Art Ringpuffer. Wenn du das AutoIn = BufferSize hast, musst du immer warten, bis die Daten wirklich übertragen wurden, da bei FIFO full erst an USB übergeben wird, und der Buffer erst wieder zur Verfügung steht, wenn die Daten vom Host abgeholt wurden.
woher bekomme ich die libusb.dll? hat die einer schon fertig? bei sourceforge gibts ja nur code kannst du die geänderte bulkloop demo zu verfügung stellen? nicht zum nutzen - zum lernen also nochmal bitte für mich: - die buffer ändere ich auf quad, weiterhin größe = 512Byte, - AutoIN auf 512 ändern, - wenn bei jeder 2. flanke die daten übernommen werden, müssen diese jeweils 2 takte lang anliegen --> wenn ich also quad (4x) buffer mit 512Byte habe, kann ich 2048 byte in 4096 takten in die fifo schreiben, und dann ist sie voll
Marco Hartung wrote: > woher bekomme ich die libusb.dll? hat die einer schon fertig? bei > sourceforge gibts ja nur code Nein, es gibt die DLL genauso wie den Treiber dafür. Sogar ein Programm drin, was dir die passende .inf erstellt. http://sourceforge.net/project/showfiles.php?group_id=78138 > kannst du die geänderte bulkloop demo zu verfügung stellen? nicht zum > nutzen - zum lernen Nein, hab ich auf Arbeit gemacht, und darf ich natürlich nicht freigeben. > > also nochmal bitte für mich: > > - die buffer ändere ich auf quad, weiterhin größe = 512Byte, Musst du nicht, kannst du. > - AutoIN auf 512 ändern, Musst du auch nicht, kannst du aber. > - wenn bei jeder 2. flanke die daten übernommen werden, müssen diese > jeweils 2 takte lang anliegen Wann liest du das Datenblatt? Du musst zwischen den Schreibflanken das Write-Enable toggeln lassen. Ob die Daten da anliegen ist egal, aber das WE muss zwischendurch deaktiviert werden. Schau dir die Timing-Diagramme im Datenblatt und TRM an. > --> wenn ich also quad (4x) buffer mit 512Byte habe, kann ich 2048 > byte in 4096 takten in die fifo schreiben, und dann ist sie voll Wenn du die daten nicht durch den host abholst, ist er nach 2048 erfolgreichen und dem kranken Timing entsprechenden Schreibzyklen voll.
Hallo Christian, welches Timingdiagramm meinst Du genau? Es gibt da ja mehrere. Sind es die Timingdiagramme 9-12 bis 9-14 im TRM und Diagramm 9.8 im Datenblatt? Würde mich freuen, wenn das jemand weiss. Gruß Markus
Das kommt doch drauf an, ob du das Slave-FIFO oder das GPIF verwendest. Und dann noch ob synchron oder asynchron. Im Datenblatt ist das Timing, im TRM das generelle Signalspiel, ohne Timing-Angaben. Man muss beides dann kombinieren.
Ich möchte das synchrone Slave-FIFO benutzen. Welche Vorteile hätte der asynchrone Slave-FIFO Mode? Vielleicht wenn die Datenmengen nicht so groß sind... Bei den synchronen Modes muss man ja mindestens 5MHz anlegen. Bei mir sind es höchstwahrscheinlich so um die 10MHz. Kann aber auch vorkommen, daß ich bloß 1MHz brauche - dann muß ich den Rest verwerfen oder vielleicht doch den asynchronen Mode verwenden. Gruß Markus
Du solltest dich wirklich mal intensiver damit beschäftigen. Die übertragene Datenrate hat nix mit dem anliegenden Interface Takt zu tun. Der ist freilaufend immer da. Je nachdem, wie oft du das WE auf Low ziehst, werden Daten in den Slave FIFO geschrieben. Das allein entscheidet über die Datenrate. Vorteil des synchronen ist, dass es synchron ist, und man die ganze Logik im FPGA synchron gestalten kann.
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.