Gibt es eine Möglichkeit, den USB Stack im CDC Modus mit DMA zu verwenden? Momentan nutze ich UART und eine USB-UART-Bridge, um Daten zu übertragen. Nach 512 Bytes wird dann ein Interrupt aufgerufen, der die Daten verarbeitet und den Buffer wechselt. Ich möchte dies nun mit USB CDC machen, habe online aber nur libs gesehen, die bei jedem empfangenen Byte einen Interrupt auslösen...
Leon L. schrieb: > USB > CDC machen, habe online aber nur libs gesehen, die bei jedem empfangenen > Byte einen Interrupt auslösen... USB arbeitet mit Paketen und nicht mit Bytes. Die Pakete können von 0 (Null) bis 64 Byte groß sein (Annahme: USB Full Speed), auch bei CDC. Interrupts gibts nur für Pakete.
Gut zu wissen! Kann ich diese Pakete zum DMA führen? oder muss ich da die einzelnen interrupts nutzen?
Clemens L. schrieb: > Was genau soll der DMA-Controller dort machen? die idee war die 512byte im hintergrund aus dem usb rauszuschaufeln (in nen array) und das ganze halt ohne die cpu zu belasten
Das empfangene Paket ist eh' schon in einem Puffer im RAM gespeichert. Es woanders hin zu kopieren, bringt nichts.
Kann ich diese Zieladresse andern? Dann könnte ich ja einfach bei jedem interrupt die Adresse um 64 erhöhen
Leon L. schrieb: > Gibt es eine Möglichkeit, den USB Stack im CDC Modus mit DMA zu > verwenden? Es ist ein Widersinn - denk doch mal nach: CDC ist von hause aus asynchroner serieller Verkehr. Das Programm, was einen UART oder eben einen USB im CDC Mode benutzt, sollte sich folglich übrhaupt nicht um die Details der tatsächlichen und ggf. blockweisen Übertragung kümmern müssen. Was soll da eine Verwendung von DMA bewirken und an welcher Stelle soll diese greifen? Per DMA geht es immer blockweise, schließlich muß man den DMA-Controller ja zuvor aufsetzen. Also: erstens: DMA an dieser Stelle ist verkehrt. zweitens: dein CDC-Treiber muß die Umsetzung von asynchroner Zufuhr von Zeichen zum blockweisen Transfer via USB organisieren - und das OHNE das aufrufende Programm mit Innereien zu belästigen. Der korrespondierende CDC-Treiber auf dem PC macht das ja ebenfalls, so daß man von der Applikation aus ein oder mehrere Zeichen lesen kann - ebenfalls völlig asynchron. drittens: ganz simpel im Treiber solange Zeichen auflaufen zu lassen, bis ein Block voll ist, ist voll daneben, wenn man nicht in Kauf nehmen will, die letzten 0..63 Zeichen zu verlieren. Ich rate dir deshalb, den 1 ms Tick vom Host zu benutzen, um bis dato aufgelaufene Zeichen zum Abholen durch den Host einzuordnen. Ich hatte hier vor einiger Zeit schon mal eine meiner USB-CDC-Treiber Quellen gepostet, also such mal, sofern du magst. W.S.
W.S. schrieb: > Das Programm, was einen UART oder eben > einen USB im CDC Mode benutzt, sollte sich folglich übrhaupt nicht um > die Details der tatsächlichen und ggf. blockweisen Übertragung kümmern > müssen. Die Übertragung von USB ist aber immer blockweise, 1 Byte Blöcke sind auch bei USB arschlahm. Und da wir hier nicht von UART, sondern von einem µC Programm sprechen ist die Blockgröße auch jeweils bekannt bzw. vom Protokoll vorgegeben. Die HW-Entwickler von Energy Micro (jetzt Silabs) gingen sogar soweit, bei deren USB HW im EFM32 µC nur DMA für die EP Daten vorzusehen. Allerdings kenne ich die STM32 Implementation(en?) überhaupt nicht. W.S. schrieb: > zweitens: dein CDC-Treiber muß die Umsetzung von asynchroner Zufuhr von > Zeichen zum blockweisen Transfer via USB organisieren Nein, das muss er nicht unbedingt. Dem µC Programm ist normalerweise bekannt, wieviel Daten versendet oder empfangen werden sollen. Das hier ist IMHO grade nicht der Fall der dummen USB-UART Bridge.
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.