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!
Ist das korrekt, dass das USB-Massenspeicher Interface benutzt wird? Das habe ich auch gerade von der Host-Seite aus in der Mache. Ja, es sind immer 3 Teile: Befehl. Daten-Anforderung und Statusabfrage zum Schluss. Aber man muss ja nicht nur einen Block lesen. Man kann gleich mehrere Blöcke auf einmal anfordern. Bei meinen Test lese ich z.B. 512 KBytes auf einen Schlag. Es sind ja normale SCSI Befehle. Und der READ-Befehl hat ein Feld mit der Anzahl der Sektoren. Bei USB-2.0 komme ich so auf 48Mbytes/sek.
Ok, mehrere Sektoren zu lesen ist klar. Fürs schreiben stellt SCSI so was nicht zu Verfügung. Mehrere Sektoren zu lesen macht aber auch nur bis zur Clustergröße Sinn. Mit was arbeitest du gerade? Hast du dir mal die Eingeweide deines Host Stacks angeschaut, wie er die einzelnen Transaktion zusammenfasst?
>Für ein aktuelles Projekt benötige ich unter anderem ein Datenlogging >mit max. 150kB/s auf einen USB-Stick. Wieso loggst du nicht einfach auf eine SD Karte? Dann sparst du dir das ganze USB Geraffel. >dass ich gerade mal auf 50-60kB/s komme. Das schaff ich locker mit nem 16MHz AVR und 8MHz SPI auf SD Karte. Die 150kB/s auch.
>Hinweis: Es kommt nur USB in Frage. Daher verzichte ich gern auf >Ratschläge, ein anderes Interface zu verwenden :) Upps, den hatte ich übersehen. Also vergiss meinen Tip.
Also ich schaff leicht 500-700kb/sec auf die SD-Karte, ebenfalls mit einem PIC32. Das von dir angesprochene Problem kenne ich von diversen Kingston SD-Karten, die im SPI modus bei 512 Packet-Größe unendlich langsam werden und erst bei größeren Zugriffen vernünftiges Tempo erreichen. Wenns dir aber rein um eine Live-Übertragung vom PIC zum PC geht, dann würde ich dir die libUSB oder WinUSB empfehlen, das schafft man dann auch gut 1MB+/sec.
Michael H. schrieb: > Wenns dir aber rein um eine Live-Übertragung vom PIC zum PC geht Geht es mir nicht, wie im ersten Post beschrieben wird der PIC als Host betrieben und es wird auf einen USB-Stick geschrieben. Bitte, bitte ... keine Hinweise darauf wie schnell oder gut es mit SD-Card funktionieren würde. Dessen bin ich mir bewusst, aber ich habe nicht die Möglichkeit die Schnittstelle zu ändern. Daher noch einmal die prinzipielle Frage: Ist es möglich CBW-, Daten- und CSW-Phase innerhalb eines USB-Frames an den gleichen Endpunkt zu übertragen?
>>Daher noch einmal die prinzipielle Frage: >>Ist es möglich CBW-, Daten- und CSW-Phase innerhalb eines USB-Frames an >>den gleichen Endpunkt zu übertragen? Naja bei 8 Micro-Frames kannst Du 8 x 64 Bytes übertragen (vorausgesetzt Du bekommst Deinen Endpunkt schnell genug voll). Stellt sich die Frage: Wie groß ist denn Dein CBW- und Dein CSW-Paket? Und wieviele Daten willst Du denn mitschicken? Üblicherweise werden Sektoren übertragen. Somit haben wir 512 Bytes an Daten. plus CBW und CSW. Wie soll das also gehen, wenn insgesamt 8 * 64 Bytes zur Verfügung stehen? >>Bitte, bitte ... keine Hinweise darauf wie schnell oder gut es mit >>SD-Card funktionieren würde. Dessen bin ich mir bewusst, aber ich habe >>nicht die Möglichkeit die Schnittstelle zu ändern. Auch wenn Du die Schnittstelle nicht ändern kannst, ein bischen Kopfrechnen sollte noch drinn sein :) Gruß Potter
Kannst du etwas zu dem FAT-Overhead sagen bzw. spricht etwas dagegen die Logging Dateien im voraus anzulegen, so dass man nur eine Liste von Sektoren hat die man nacheinander beschreiben muss? Das klingt grad so, als hättest du ein bisschen sehr viel Dateisystemoverhead.
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.