Forum: Mikrocontroller und Digitale Elektronik STM32 USB-Device mit CubeMX Bug?


von Chris (Gast)


Lesenswert?

Hallo,

ich habe mit CubeMX von ST mir ein Codegerüst erzeugt das eine USB 
Device Schnittstelle als virtuellen COM-Port enthält. Im Code sind dann 
die Funktionen CDC_Receive_FS und CDC_Transmit_FS enthalten.
Wenn ich das Programm flashe und mein Board an den PC anstecke wird der 
Port richtig erkannt und auch der Treiber automatisch erkannt (Win7).
Mit der Transmit-Funktion kann ich Daten an den PC senden, das klappt 
wunderbar.

Bei einem empfangenen Byte wird ein Interrupt ausgelöst und dieser 
landet dann irgendwann in der Funktion CDC_Receive_FS. Hier kann ich das 
Byte dann auch auslesen und verarbeiten. Das funktioniert aber leider 
nur einmal. Nachdem das erste Byte empfangen wurde stehen im 
Endpoint-Register STAT_RX die Bits nicht auf 0x3, damit empfangene 
Pakete mit ACK bestätigt werden sondern auf 0x2, wodurch das Paket nicht 
richtig empfangen wird und auch kein Interrupt ausgegeben wird.

Ich nutze einen STM32L162-Prozessor auf einem Eval-Board, IDE ist IAR.

Hat jemand schon mal mit CubeMX die USB-Schnittstelle nutzen können? 
Wird hier eine falsche/alte Lib mitausgeliefert?

Vielen Dank für eure Hilfe
Chris

von Di P. (drpepper) Benutzerseite


Lesenswert?

I.d.R. musst du in der CDC_Receive_FS einen call auf
1
USBD_CDC_ReceivePacket(&hUsbDeviceFS);

machen, sodass die Schnittstelle bereit für das nächste Paket ist.

Das kann dann so aussehen:
1
static int8_t CDC_Receive_FS (uint8_t* Buf, uint32_t *Len)
2
{
3
  /* USER CODE BEGIN 6 */
4
5
    //hier den Buf irgendwo wegschreiben
6
7
    USBD_CDC_ReceivePacket(&hUsbDeviceFS);
8
9
    return (USBD_OK);
10
11
  /* USER CODE END 6 */ 
12
}

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.