Gast
#2722433
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