2012-12-07 09:47 AM
Hi all,
I'm working on an application for the STM32F4 where I need a USB MIDI device class. I've started with the STM USB library and, looking at the CDC and Audio class examples, have come up with a MIDI device that runs on the OTG FS core. It successfully goes through enumeration and is recognized by the connected computer as a MIDI device.The problem comes in when I try to send data (an IN transaction). I have traced this through all the way to the USB_OTG_WritePacket routine, where it writes data to the endpoint's transmit FIFO. I am writing a valid MIDI packet to the FIFO (0x0b 0xb0 0x3f 0x7f), but the moment the FIFO is written, the output on the bus (monitored with a USB analyzer) is something completely different (0x4a 0x4a). I've checked how the registers to make sure it has the correct transmit size, FIFO number, etc. but can't for the life of me figure out how the outgoing data is so different than what's being placed in the FIFO. Does anyone have any experience with this? Any tips on what to look at would be most appreciated. #stm32f4-usb-midi2012-12-09 12:32 PM
Found it! It turns out that my FIFO configuration was incorrect. The FIFO size definitions in usb_conf.h were too large, pushing EP2's TX FIFO outside the valid range of addresses. It would be a good idea to add some preprocessor error checking of these values in the USB library.
When setting FIFO sizes, remember that sizes are in words, not bytes, and you have only 320 words of FIFO. The RX FIFO and TX FIFO sizes for each active endpoint need to add up to 320 or less.2013-06-27 11:02 AM
Thank you! Saved me few days of hairs pulling
BR2013-07-15 02:12 AM
Hello,
I am a bachelor student who is trying to use the STM32F4-Discovery as a midi console controler as a fun project :-). I was wondering how you were able to make the usb-midi interface code. I have found no usefull sites for this, most people use the midi box from st which has almost everything you need for this kind of application, but I wanted to learn hoz to use this board for another project i want to do (yes I am a geek :p). If you have some tips on how to do it or where to find it, I would be very gratefull.Thank you in advance,2013-07-16 03:18 PM
Hi benjamin,
USB-MIDI is a good start point to learn class implementation on a USB device stack, because its USB protocol is simple. Also, many host applications/utilities are available, without writing any test code on PC. If you would like to make one, I'll help you.A. Overview of USB-MIDI spec Here is the USB-MIDI spec, USB MIDI Device spec 1.0http://www.usb.org/developers/devclass_docs/midi10.pdf
In general, USB class implementation consists of these three steps, 1) Descriptors Like usual audio device, MIDI device has two interfaces, - Audio control interface (AC) - Audio streaming interface (AS) On the AC interface, input/output MIDI jacks are declared. You may define 16-IN/16-OUT MIDI jacks In this post, we discussed implementation of multiple IN/OUT jacks.http://www.microchip.com/forums/fb.ashx?m=493422
AS interface declares bulk endpoint(s) to exchange USB-MIDI packets. In this section of the USB-MIDI spec, you'll find typical descriptors. Appendix B. Example: Simple MIDI Adapter (p37, midi10.pdf) 2) Class-specific requests As Windows don't support control of MIDI elements over USB protocol, implementation of class-specific requests is not required. 3) Protocol over endpoint(s) MIDI device exchanges USB-MIDI packets over bulk endpoints - Bulk IN endpoint sends USB-MIDI packets to host - Bulk OUT endpoint receives USB-MIDI packets from host MIDI device may have either one or both endpoints, by its purpose. USB-MIDI packet consists of 4 bytes, one byte prefix + usual 3 bytes MIDI packet. The prefix byte contains channel (jack) number, so that single bulk endpoint can exchange MIDI packets of multiple jacks. Single (64 bytes) USB bulk packet can hold 16 USB-MIDI packets. The details of USB-MIDI packet is described in this section of MIDI spec, 4 USB-MIDI Event Packets (p16, midi10.pdf)B. Implementation on ST's stack As the starting example, any device example will do. We pick up VCP (CDC) one. STM32_USB-Host-Device_Lib_V2.1.0 (STSW-STM32046) http://www.st.com/web/catalog/tools/FM147/CL1794/SC961/SS1743/PF257882 Copy this file to your project, STM32_USB-Host-Device_Lib_V2.1.0\Libraries\STM32_USB_Device_Library\Class\cdc\src\usbd_cdc_core.c To be continued.. Tsuneo2013-09-06 11:28 PM
Hello,
I've been working with the Discovery board for a few weeks now. I have implemented the bulk transfers successfully. But recently, accidentally I ran into a small issue. It's that if I call 'dcd_ep_tx' multiple times without sending an IN token from the host, I can store up to 320 bytes. But my TxFIFO size is set to 128. I can't understand how the device store 320 bytes without considering the FIFO size. If you have any idea please shed some light.Thank you.2013-10-16 09:03 AM
Hello,
I'm also trying to configure the MIDI USB class implementation on STM32F4.I experienced some problems with this driver...derouineau.benjamin are you still on it ?Thanks !Jean2014-11-28 06:04 AM
I'm experiencing the same problem with the Write_Packet and with the new STM32Cube F4 library. I haven't checked the FIFO sizes yet. I'm using an audio isochronous out endpoint besides my MIDI in and MIDI out endpoints.
I'm calling the USB_LL_Transmit, but it stucks in an interrupt somewhere. I cannot even generate an external push button interrupt after I invoked the low level transfer function.2014-11-29 11:29 AM
Sound like you are mixing up STM32F2/4 FIFO with double buffers of STM32F103 or other USB SIE.
> It's that if I call 'dcd_ep_tx' multiple times without sending an IN token from the host> I'm experiencing the same problem with the Write_Packet
You can't use dcd_ep_tx / Write_Packet in this way. These routines put the ''transfer'' data to the FIFO, and register a ''transfer'' to the endpoint. STM32F2/4 endpoint can't hold multiple ''transfers'' at a time. Just single one. Usual ''double buffers'' may hold up to two transactions. Tsuneo
2014-12-05 05:34 AM
I solved my problem. I only forgot to set the TX FIFO for the specific endpoint. My fault.
----http://turntablecontrol.wordpress.com/