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