Forum: Mikrocontroller und Digitale Elektronik STM32F4 USB CDC/VCP mit DMA?


von Leon L. (leonelf)


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...

von Clemens L. (c_l)


Lesenswert?

Was genau soll der DMA-Controller dort machen?

von Jim M. (turboj)


Lesenswert?

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.

von Leon L. (leonelf)


Lesenswert?

Gut zu wissen! Kann ich diese Pakete zum DMA führen? oder muss ich da 
die einzelnen interrupts nutzen?

von Leon L. (leonelf)


Lesenswert?

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

von Clemens L. (c_l)


Lesenswert?

Das empfangene Paket ist eh' schon in einem Puffer im RAM gespeichert. 
Es woanders hin zu kopieren, bringt nichts.

von Leon L. (leonelf)


Lesenswert?

Kann ich diese Zieladresse andern? Dann könnte ich ja einfach bei jedem 
interrupt die Adresse um 64 erhöhen

von W.S. (Gast)


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.

von Jim M. (turboj)


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.

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
Noch kein Account? Hier anmelden.