Hi,
Ich hab mich heute auch mit genau diesem Problem geplagt.
Ursache des ganze ist, dass der Buffer ja nicht mit "USB_SIL_Read()"
geleert wird. Was auch Sin macht, da ja ein Interrupt ja bescheid gibt,
wenn etwas empfangen wurde. Dies fängt in der usb_init.c -> CTR_LP() an.
(warum der gerade dahin springt hab ich nicht gefunden) Jedenfalls geht
es von dort mittels *pEpInt_OUT[] nach usb_istr.c-> "void
(*pEpInt_OUT[7])(void)" zu den Programmadressen von b.B."void
EP3_OUT_Callback(void)" , die in usb_endp.c stehen.
Das was in diesen Funktionen steht, wird bei jeden empfangenen
Datenpaket, was nicht zur Steuerung der USB-Verbindung dient aufgerufen.
Hier ein Beispiel, basierend auf den STM32F10B_eval
es wird der empfangene Text als Antwort wieder zurück gesendet.
1 | void EP3_OUT_Callback(void)
|
2 | { /*ließt die Daten aus dem Eingangspuffer undmerkt sich die Länge*/
|
3 | uint32_t DataLength = USB_SIL_Read(EP3_OUT, USB_Rx_Buffer);
|
4 |
|
5 | /*schreibt die Daten wieder*/
|
6 | USB_SIL_Write(EP1_IN,USB_Rx_Buffer , DataLength);
|
7 |
|
8 | /*Endpunkt für Übertragung freigeben*/
|
9 | SetEPTxValid(ENDP1);
|
10 |
|
11 | #ifndef STM32F10X_CL
|
12 | /* Enable the receive of data on EP3 */
|
13 | SetEPRxValid(ENDP3);
|
14 | #endif /* STM32F10X_CL */
|
15 | }
|