Forum: Mikrocontroller und Digitale Elektronik EZ USB Interrupt Probleme


von MarcoH (Gast)


Lesenswert?

Hallo Leute,

wer hat schon mit dem EZ-USB von Cyp... Erfahrungen.
ich habe mir EP4 als INTERUP OUT Enpoint konfiguriert mit 512 double 
Buffer. Weiter habe ich mir eine kleine Console geschrieben die mit der 
Thesycon-API arbeitet. Ich schreibe also nun Daten runter was beliebig 
oft funktioniert. Beende ich die Console und starte sie neu (Firmware 
läuft weiter) geht was beim ersten schreiben schief. Der Schreibbefehl 
klappt und die Daten gehen auch runter (laut Sniffer) nur in der 
Firmware kommt kein EP4inout Interrupt. Erst beim zweiten Schreibbefehl 
kommt der Interrupt wieder. Das kuriose ist, dass dieses Verhalten nur 
Auftritt wenn ich im ersten Consolen-lauf eine ungerade Anzahl an 
Schreibbefehlen gemacht habe. Ich Vermute, dass es irgendwie mit den 
double Buffer zu tun hat, nur der Interrupt muss doch kommen oder?

Wer hat eine Idee und kann mir helfen.

Danke im Voraus

von MarcoH (Gast)


Lesenswert?

keiner eine Idee?

von MarcoH (Gast)


Lesenswert?

Nochmal eine Ergänzung. Nicht nur der Int, kommt nicht, sondern das 
EP2468STAT Register meldet auch keine neuen Daten

MfG

von Mike J. (emjey)


Lesenswert?

Frag in dem (es gibt nur eins) PSoC Forum:
http://www.psocdeveloper.com/forums/viewforum.php?f=3

von Potter68 (Gast)


Lesenswert?

Hallo MarcoH,

Endpunkt-Größen von 512 Bytes sind für HID Full Speed Geräte laut 
Spezifikation nicht zulässig (max 64 Bytes).

Gruß Potter

von MarcoH (Gast)


Lesenswert?

Hallo Potter,

ich habe ja auch kein HID fullspeed gerät. Ich arbeite mit dem EZ USB im 
Highspeed und habe ein USB_DEVICE_CLASS_VENDOR_SPECIFIC.

Gruß Marco

von Potter68 (Gast)


Lesenswert?

Hallo MarcoH,

ich habe mich vertippt. Das muss heissen: Die Puffer-Größe bei 
Interrupt-Transfers ist auf 64 Bytes beschränkt für Full-Speed. Was 
aber, da du High-Speed nutzt, auch nicht das Problem sein kann.

Im Übrigen hatte ich dann sowieso aufgehört zu lesen^^. Mit dem EZ-USB 
habe ich auch noch nicht gearbeitet. Aber das mit dem Double-Buffer 
lässt sich testen, indem Du das Double-Buffering mal ausschaltest.

Der Interrupt kommt nur, wenn Dein Empfangspuffer mit neuen Daten 
gefüllt wurde. D.h., falls beim letzten Auslesen irgendwelche Flags 
nicht richtig zurückgesetzt wurden bzw. Du garnicht gelesen hast, dann 
kommt auch kein Interrupt. Aber: dann erhält Dein Host auch kein ACK 
sondern ein NAK als Antwort auf das Daten-Paket. Was sagt denn Dein 
Sniffer?

Gruß Potter

von Andreas S. (Firma: Schweigstill IT) (schweigstill) Benutzerseite


Lesenswert?

Die genannten Probleme hängen typischerweise damit zusammen, dass für 
den jeweiligen Endpoint die falsche DATA0/1-Phase gewählt wurde. Es ist 
wichtig, dass nach einer Enumeration und einigen anderen Requests, z.B. 
Set Configuration, der USB-Controller wieder auf DATA0 eingestellt wird. 
Nach einer ungeraden Zahl von Paketen steht er jedoch auf DATA1, wodurch 
er die Pakete des Hosts, die ja einer DATA0-Kennung besitzen, nicht 
erkennt.

von MarcoH (Gast)


Lesenswert?

Hallo, also der Interrupt wird wieder zurückgesetzt, da ich ja auch 
n-mal lesen kann pro Applikationslauf, nur eben beim zweiten 
Applikationslauf (nach unconfigure und configure Device) nicht mehr. mit 
den Data0 und Data1 könnte fast sein. Nur müsste doch mein Schreibbefehl 
fehlschlagen, oder? Was auch komisch ist, dass beim ersten schreiben 
keine Daten kommen aber beim zweiten Versuch. Auserdem dachte ich immer, 
das Data0, Data1 toggelt nur, wenn mehrer Datenpackete pro Transaktion 
kommen. Da ich aber immer nur paar Byte sende(kleiner FIFO-Size), also 
ein Paket pro Transaktion, endert sich doch Data nicht oder ? Aber ich 
schau mal nach.

 Trotzdem erstmal Danke
Marco Hempel

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.