Forum: Mikrocontroller und Digitale Elektronik STM32F4 Discovery, usb endpoint IN2 funktioniert nicht


von Peter (Gast)


Lesenswert?

hallo zusammen,

ich habe versucht auf dem STM32F4 Discovery Board CDC und HID zusammen 
zum laufen zu bringen, die geräte wurden erkannt und funktionierten auch 
fast!
maus gut, seriell out (pc->stm) gut, nur seriell stm32->pc funktioniert 
nicht. die daten wollen einfach nicht raus. nach langem hin und her 
mußte ich feststellen, dass es an dem endpoint IN2 liegt. alles 
zurückgebastelt und cdc einzeln betrieben, endpoint 1 für in und out 
verwendet -> alles gut.
endpoint 2 für in und out verwendet -> daten wollen nicht raus. gleiches 
mit HID einzeln versucht, genau das gleiche! alle in endpunkte (stm->pc) 
größer 1
scheinen nicht zu funktionieren. nach langem debuggen mußte ich 
feststellen dass der fifo des EP2 nicht leer wird. "diepint.b.xfercompl" 
ist immer 0 für endpunkte > 1. dies läßt sich ganz einfach mit dem 
standard DEMO nachvollziehen indem man HID_IN_EP auf 0x82 setzt. die 
maus funktioniert nicht mehr! ich geh mal davon aus, dass es sich um ein 
bug von st handelt.
oder hat da jemand ne andere idee oder sogar ne lösung ? wer hat schon 
mal in-endpunkte 2 oder 3 erfolgreich verwendet ?

von Jim M. (turboj)


Lesenswert?

Meine Glaskugel sagt: Endpoint Deskriptor falsch.

Hast Du die entsprechenden Endpoint Deskriptoren angepasst? Da steht die 
Endpoint Nummer drin.

Ansonsten: Zeig uns den Code.

von Peter (Gast)


Lesenswert?

hallo,

vielen dank für die antwort.

der code ist orginal demo vom discovery, alles hübsch von vorne bis 
hinten mit defines, schön ordentlich, so wie es sich gehört.

wer ein hid oder cdc oder sonst was mit usb auf dem STM32F4 Discovery am 
laufen hat möge doch bitte mal seinen XX_IN_EP auf 0x82 stellen und 
schauen obs noch geht.

meine glaskugel hab ich auch schon gefragt, konnte mir leider auch nid 
wirklich helfen.

hier mal etwas code, denke da sieht man deutlich, dass der endpoint 
descriptor in ordnung ist. wie gesagt, mit 0x81 gehts mit 0x82 nicht, 
egal ob cdc oder hid.


#define HID_IN_EP                    0x82 // geht nicht
//#define HID_IN_EP                    0x81 // geht
....
 /******************** Descriptor of Mouse endpoint 
********************/
  /* 27 */
  0x07,          /*bLength: Endpoint Descriptor size*/
  USB_ENDPOINT_DESCRIPTOR_TYPE, /*bDescriptorType:*/
  HID_IN_EP,     /*bEndpointAddress: Endpoint Address (IN)*/
  0x03,          /*bmAttributes: Interrupt endpoint*/
  HID_IN_PACKET, /*wMaxPacketSize: 4 Byte max */
  0x00,
  0x0A,          /*bInterval: Polling Interval (10 ms)*/

...

static uint8_t  usbd_cdc_Init (void  *pdev, uint8_t cfgidx) {

    DCD_EP_Open(pdev, HID_IN_EP, HID_IN_PACKET, USB_OTG_EP_INT);

....

}

von Potter (Gast)


Lesenswert?

Du zeigst einen HID-Endpunkt und eine CDC-Init() Funktion. Ob denn dass 
zusammen passt?

Was steht denn im Datenblatt? Gibts den EP2 überhaupt? Wird der auch auf 
dem Board verwendet? Ist der in der Firmware implementiert? Hast Du mal 
einen Link zu den Datenblättern? Kannst Du mal die Descriptoren 
anhängen, dass man damit auch etwas anfangen kann?

Gruß Potter

von Peter (Gast)


Lesenswert?

Hallo,

richtig, die CDC-Init() und HID-Endpunkt passen augenscheinlich nicht 
zusammen. Dies ist noch ein Relikt aus vorangegangenen Versuchen. Hat 
aber mit dem eigentlichen Problem nix zu tun.

Laut Datenblatt werden 4 Endpunkte unterstützt. Die Firmware ist auch 
für mehrere Endpunkte ausgelegt.


Datenblatt des STM32F407:

http://www.st.com/internet/com/TECHNICAL_RESOURCES/TECHNICAL_LITERATURE/DATASHEET/DM00037051.pdf

Beschreibung des STM32F4DISCOVERY:

http://www.st.com/internet/evalboard/product/252419.jsp

Hier gehts direkt zum Source Code:

http://www.st.com/internet/com/SOFTWARE_RESOURCES/SW_COMPONENT/FIRMWARE/stm32f4discovery_fw.zip

Grüße, Peter

von Potter (Gast)


Lesenswert?

Hallo Peter,

schön, wenn Du die Unterlagen parat hast:) Dann mach Dich mal ran.

Ich fange nicht an Dein Projekt zu debuggen, aber das kannst Du ja auch 
selber. Z.B. mit

http://www.sysnucleus.com/

Zuerst gilt es mal festzustellen, ob überhaupt irgendetwas über den Bus 
geht, und falls ja, was.

Gruß Potter

von Markus G. (grabner)


Lesenswert?

Ich hatte ein ähnliches Problem und bin auf der Suche nach einer Lösung 
u.a. hier gelandet, den entscheidenden Hinweis habe ich aber hier 
gefunden:

https://my.st.com/70dc966b

Kurz gesagt musste ich in usb_conf.h die Zeilen

#define TX1_FIFO_FS_SIZE 128
#define TX2_FIFO_FS_SIZE 0

durch

#define TX1_FIFO_FS_SIZE 64
#define TX2_FIFO_FS_SIZE 64

ersetzen, damit endpoint 0x82 funktioniert (die genauen Werte für die 
FIFO-Größe hängen wohl von einigen anderen Dingen ab, z.B. maximum 
packet size).

Schöne Grüße,
Markus

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.