Forum: Mikrocontroller und Digitale Elektronik und noche-mal cypress cy7c68013a


von Marco H. (hilfesuchender)


Lesenswert?

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

von T. H. (pumpkin) Benutzerseite


Lesenswert?

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.

von Marco H. (hilfesuchender)


Angehängte Dateien:

Lesenswert?

hab mal die init funktion in die datei gepackt. in Poll() passiert nix1

ist die config richtig?

meinst du vielleicht das Register: EPxFIFOPFH:L ?

von Christian R. (supachris)


Lesenswert?

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....

von Marco H. (hilfesuchender)


Lesenswert?

aha ???

kannst du mir bitte auch was zu 2. und 3. sagen? weiß echt nicht weiter

von Marco H. (hilfesuchender)


Lesenswert?

ach quatsch nicht 2. und 3. sondern 1. und 3.) ;-)

von Christian R. (supachris)


Lesenswert?

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.

von Marco H. (hilfesuchender)


Lesenswert?

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

von Christian R. (supachris)


Lesenswert?

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.

von Markus K. (mk73)


Lesenswert?

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

von Christian R. (supachris)


Lesenswert?

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.

von Markus K. (mk73)


Lesenswert?

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

von Christian R. (supachris)


Lesenswert?

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
Noch kein Account? Hier anmelden.