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 ?
Meine Glaskugel sagt: Endpoint Deskriptor falsch. Hast Du die entsprechenden Endpoint Deskriptoren angepasst? Da steht die Endpoint Nummer drin. Ansonsten: Zeig uns den Code.
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); .... }
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
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
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
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
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.