STM32F4 USB CDC/VCP mit DMA?

OP #4321358
Lesenswert?

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...
Gast #4322005
Lesenswert?

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.
#4322223
Lesenswert?

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.

Antwort schreiben

Bitte melde dich an, um einen Beitrag zu schreiben.

oder

Mit Google-Account einloggen

Die Registrierung ist kostenlos und dauert nur eine Minute.

Jetzt registrieren