Hallo, Ich hab mal wieder ein Problem mit meiner USB Übertragung. Ich hab schon einige Tests gemacht um das folgende Problem einzugrenzen. Aufbau: Eigenes USB Device, bestehend aus einem EFM32GG330F1024 mit integriertem Full-Speed USB Controller, verbunden mit einem Windows 7 PC. Das Device besitzt einen IN- und einen Out-Endpoint, und die maximum data payload size ist 64Byte, ist auch so im Descriptor eingetragen. Auf PC seite gibt es 2 Alternativen, eine Testsoftware basierend auf libusb-1.0 [c] while (recLen < 65532) { try { if((len-recLen)%64!=0) templen = LibusbJava1.libusb_bulk_transfer(libusbDevice.getUsbHandle(), (byte) 0x81, buffer, len-recLen+64-((len-recLen)%64), 0); else templen = LibusbJava1.libusb_bulk_transfer(libusbDevice.getUsbHandle(), (byte) 0x81, buffer, len-recLen, 0); if(templen == -1) return templen; for(i = 0; i < templen && recLen < len; i++, recLen++) { b[recLen+off] = buffer[i]; } } catch (LibusbError e) { throw new IOException(e); } } [\c] und einer Virtual COM Port implementierung unter C#. Beiden lesen nur die daten dauerhaft aus und ermitteln die Geschwindigkeit. auf dem Controller läuft in der Mainfunktion folgende Schleife: [c] for (;;) { USBD_Write(EP_DATA_IN, (void*) &test[0], 1024, NULL); }[\c] So, nun zu meinem Problem, wenn ich auf dem controller 1024byte Pakete(Vielfaches von 64Byte) versende komm ich auf die maximal mögliche datenrate, wenn ich kein vielfaches von 64byte verwende liege ich WEIT darunter (30-50%). Gestestet mit verschiedenen Paketgrößen und sowohl mit libUSB als auch Virtual COM-Port. laut USB-Spec 2.0: "The USB does not require that data payloads transmitted be exactly the maximum size; i.e., if a data payload is less than the maximum, it does not need to be padded to the maximum size." und: "A bulk transfer is complete when the endpoint does one of the following: • Has transferred exactly the amount of data expected • Transfers a packet with a payload size less than wMaxPacketSize or transfers a zero-length packet" sende ich auf dem controller 1024Byte pakete, liefert mit die libUSB Empfangsfunktion (auch wenn ich mehr als 1024 byte anfordere) 1024Byte zurück. Dies ist für alle Paketgrößen der Fall, egal ob Vielfache von 64Byte oder nicht. So wie man dies erwarten würde. Allerdings ist über übertragung um 30-50% langsamer wenn die Paketgröße kein Vielfaches von 64Byte ist. HILFEEEE =/ Chris
> wenn ich kein vielfaches von 64byte verwende liege ich WEIT > darunter (30-50%). Dann gibt es ein "zu kurzes" Paket, was als "Ende des Transfers" angesehen wird. In diesem Falle scheint für den Rest des USB Frames (1ms) Ruhe zu sein, es werden erst im nächsten Frame neue Daten beim entsprechenden Endpoint angefragt. Wenn man also kontinuierlich viel Daten übertragen möchte, dann muss man die 64 Byte auch voll ausnutzen. Sendet man dagegen ein kurzes Paket oder ein Zero Packet (0 Byte Länge), wird ein "Ende" erkannt und die entsprechenden USB Funktionen kehren zurück - auch wenn eigentlich mehr Bytes nachgefragt wurden. Das braucht man wenn man z.B. für geringe Latenzen bei VCOM sorgen möchte oder die Größe vorher nicht bekannt ist.
ok danke Ich habe unabhängig vom oben genannten Problem, noch festgestellt das meine Full-Speed Verbindung an einem externen Hub deutlich schneller ist als direkt am PC (Hostcontroller-Hub).10-30% schneller und kommt fast an das theoretische Limit. Ich vermute mal das externe Hubs etwas anders arbeiten, wodurch geringere Latenzen bei Bestätigungen auftreten. Falls jemand dazu bessere Erklärungen hat, welche einem helfen die Effekte besser zu verstehen, immer her damit =) Grüße Chris
oder am internen hängt noch das wlan oder das mauspad etc, was die datenrate drückt. Bei meinem Laptop ist das deutlich je nach benutztem Steckplatz unterschiedlich.
Das mit dem Hub liegt am Transaction Translator im HUB. Der packt FullSpeed Pakete um in HighSpeed Microframes, da ist die Effizienz ein Stück höher. Wahrscheinlich hat der externe Hub mehrere solche Translatoren: http://en.wikipedia.org/wiki/USB_hub#Speed
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.