Servus, ich programmiere gerade eine USB-Anwendung mit dem Atmel AT90USB1287. Die Anwendung basiert auf dem Demo-Programm usb_hid von Atmel. Dieses Demoprogramm hat für beide Endpoints (In & Out) 8 Bytes als maximale Länge. Für meine Anwendung benötige ich aber mehr. Es ist dokumentiert, dass man in der Datei usb_descriptor.h nur zwei Defines ändern muss. Ich habe für Out 50 und für In 34 eingetragen. Beides wird im PC richtig angezeigt, wenn ich mir die Deskriptoren des Geräts ausgeben lass. Es klappt auch einwandfrei, dem Gerät 50 Bytes zu schicken, nur als Antwort bekomm ich maximal 8 Bytes. Testweise schicke ich gerade die Anzahl an Bytes in der FIFO-Schlange raus. Wenn alles gehen würde, sollte 34 1 2 3 4 ... 31 32 33 rauskommen. Die FIFO lässt aber irgendwie nur 8 Bytes zu und es kommt 8 1 2 3 4 5 6 7 raus. Der erste Wert (8) wurde beim Senden des 34. Bytes gesetzt. Da dieser Wert 8 ist und nicht 34, verstehe ich darunter, dass die FIFO nur bis 8 hochzählt und die weiteren Werte ignoriert. EP_IN_LENGTH wurde aber als 34 definiert, was auch der PC so anzeigt. Beim Out-Endpoint klappt es ohne Probleme, ich verstehe nicht, warum es beim In-Endpoint nicht klappt. Das Gerät ist im Fullspeed-Modus. Es sollten also in beide Richtungen 64 Bytes möglich sein. Hat jemand zufällig Erfahrung mit Endpoints größer als 8 Bytes? Welcher Wert könnte noch falsch gesetzt sein, so dass zwar der Deskriptor richtig ist, aber die FIFO nicht mehr zulässt. Das ist meine aktuelle Testroutine, deren Ergebnis ich oben beschrieben hab: uint8_t counter = 0; void hid_task(void) { Usb_select_endpoint(EP_HID_IN); if(Is_usb_write_enabled()) { uint8_t i; for (i=0; i < EP_IN_LENGTH; i++) { Usb_write_byte(counter); counter = Usb_byte_counter_8(); } Usb_ack_in_ready(); } }
Hallo Armin, keine Ahnung, ob Du hier noch mitließt, aber wenn ja: hat sich Dein Problem mitlerweile erledigt? Ich habe nämlich exakt das selbe und wäre über einen Tipp froh... CS Josef www.cAPELLA-OBSERVATORY:COM
Hab erst jetzt wieder reingeguckt. Das Problem, wie es hier beschrieben ist, hab ich nicht gelöst. Ich habe es aber umgangen. Die 8-Bytes sind beim In- und Out-Endpoint. Daher habe ich jetzt die Kommunikation auf 8-Bytes pro Transfer begrenzt und eine Art Protokoll draufgesetzt. Einer Methode übergeb ich einen Pointer und die Länge in Bytes. Diese Methode sendet dann einen oder mehrere Transfers. Im 1. Byte steht, ob noch mehr kommt: 0..EP_SIZE-1 = Anzahl gültiger Bytes + Info letzter Transfer EP_SIZE..255 = Paket ist voll und es kommen noch weitere Transfers Wenn du Interesse an Codebeispielen hast, kannst dich mal unter armin.feucht@web.de oder ICQ 103172172 melden. Dann kann ich dir was zuschicken. Weiß nicht, wann ich hier wieder reinguck. Das war jetzt nur wegen einem anderen Projekt.
Hallo Armin, Nach längerem Forschen habe ich das Problem selbst gelöst. Das gemeine war, dass zwei Stellen gleichzeitig zu ändern sind, um die Buffergröße für den Datentransfer über USB zu verändern. Die erste und einsichtige Stelle ist die Definition der End-Punkte (in den Demo-Sourcen von Atmel ist das im File „usb_discriptors.h“, und da das define von EP_(IN|OUT)_LENGTH[_n]. Diese Stelle war offensichtlich und sie muss ja auch zu der enstprechenden USB-Hostsoftware passen. Dass aber trotz einer dort eingestellten Länge von z.B. 32 Bytes immer nur 8-Byte-Pakete verschickt werden, liegt an der Einstellung der EPSIZE2:0-(Endpoint Size)–Bits im UECFG1X-Registers des AT90USB. Das passiert in den Demos von Atmel mit Hilfe der Funktion usb_user_endpoint_init in usb_specific_request.c. Dort steht als vierter Parameter der Funktion (besser des Makros) usb_configure_endpoint halt SIZE_8 und nicht SIZE_32. Ändern des entsprechenden Wertes und voila: Der Buffer fasst 32 Bytes und alles arbeitet so, wie gedacht… Irgendwie hätten die Jungs von Atmel da bei der Endpoint-Definition schon mal einen entsprechenden Kommentar hinschreiben können :-( Na ja, vielleicht hilft Dir das Wissen ja im Nachhinein oder außer uns beiden stolpert noch jemand über dieses Problem. CS Josef www.capella-observatory.com
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.