Gast
#2860658
Hallo allerseits, als erstes die Frage, dann ein wenig Erläuterung zum Problem: Ist es möglich CBW-, Daten- und CSW-Phase innerhalb eines USB-Frames zu übertragen? Ich beschäftige mich gerade mit dem USB Stack von Microchip, den ich auf einem PIC32 uC verwende. Für ein aktuelles Projekt benötige ich unter anderem ein Datenlogging mit max. 150kB/s auf einen USB-Stick. Klingt für USB Full-Speed ( 1.5MB/s) erstmal nicht problematisch. Doch leider ist das eben nur die theoretische Datenrate. Der USB Stack von Microchip ist dermaßen langsam, dass ich gerade mal auf 50-60kB/s komme. Genutzt wird dabei die Mass-Storage-Class und folglich der Bulk-Transfer. Ein solcher Transfer besteht aus 3 Phasen: CBW, Daten, CSW. Nach ein wenig Codeanalyse habe ich die vermeintliche Schwachstelle ausgemacht. Jede der drei Phasen wird in genau einem USB-Frame abgearbeitet. Daher benötigt ein einzelner Bulk-Transfer von 512 Byte Daten 3ms - dabei ist der Bus über 80% IDLE. Ohne den Overhead eines FAT-Systems würde das reichen, sind "immerhin" 170kB/s. Mit FAT kommt man eher auf ein drittel, da hier noch zusätzlich Transfers anfallen. Wenn ich die USB Spez. und diverse andere Quellen richtig interpretiere, sollte der mehrfache Zugriff, also die Bündelung mehrerer Transaktionen, auf einen Endpunkt innerhalb eines Frames zulässig sein. Zeitlich sollte es auch keine Probleme geben, da der Massenspeicher der einzige USB-Device am Host ist und der Bulk-Transfer nur etwas über 50% des Frames verwendet. Im Microchip-Forum gibt es diverse Threads, die das Problem des geringen Durchsatzen ansprechen, allerdings scheint von den Entwicklern kaum einer darauf einzugehen. Ich überlege daher den Stack zu modifizieren, würde aber vorher gern wissen ob mein Vorhaben (Frage siehe oben) überhaupt von der Spezifikation abgedeckt wird. Hinweis: Es kommt nur USB in Frage. Daher verzichte ich gern auf Ratschläge, ein anderes Interface zu verwenden :) Viele Grüße!