Easyelectronics.ru

Электроника для всех
Текущее время: 23 янв 2018, 14:55

Часовой пояс: UTC + 5 часов



    • JLCPCB - Платы прототипов всего за 2$ c бесплатной доставкой (при первом заказе)
    • 10 PCBs за $2 для 2 слоев, $15 для 4 слойной, $74 для 6 слойной платы.
    • Крупнейший китайский производитель прототипных плат. 290000+ клиентов & 8000+ заказов в день!
    • LCSC - Крупнейший китайский онлайн магазин радиодеталей.

Начать новую тему Ответить на тему  [ 1 сообщение ] 
Автор Сообщение
 Заголовок сообщения: STM32 HAL USB-MIDI Device Driver
СообщениеДобавлено: 09 янв 2018, 02:01 
Здравствуйте!

Зарегистрирован: 08 янв 2018, 23:59
Сообщения: 1
Здравствуйте товарищи!

Сейчас занимаюсь созданием народного опенсорс синтезатора на базе STM32F407Discovery. Потребовалось реализовать функцию передачи Midi по USB. Разумеется, ничего подобного в стандартной комплектации CubeMX не предусмотрено. Поэтому на просторах интернетов был найден исходник проекта нашего японского комрада (к слову довольно кривоватый), оттуда выдран, перепакован и допилен USB драйвер для своих нужд.

По сути драйвер представляет из себя переделанный в Midi CDC из конструктора Cube MX. (исходники во вложении)
Работает следующим образом.

По приходу данных с компьютера, вызывается прерывание USBD_MIDI_DataOut, которая вытаскивает данные, устанавливает конечную точку на прием и дергает MIDI_DataRx, в которой уже происходит обработка данных и утрамбовка в кольцевой буфер в виде обычных midi сообщений для последующей обработки в основном цикле, как если бы их приняли по UART.

Когда требуется передать данные в компьютер, дергаем функции USBD_AddNoteOn, USBD_AddNoteOff, USBD_AddSysExMessage для подготовки буфера APP_Rx_Buffer, а потом ставим на передачу при помощи USBD_SendMidiMessages. Последняя передает пакет данных длинной максимум 64 байта. По завершению передачи вызывается прерывание USBD_MIDI_DataIn, которое ставит флаг на передачу следующего пакета, который уже передается в main.c из основного цикла if (USB_Tx_State == USB_TX_CONTINUE) USBD_MIDI_SendPacket();

Все хорошо работает, пока передаются малые объемы данных. Но когда я передаю длинное SysEx (около килобайта), а в это время приходят данные из компьютера, иногда случается так, что прерывание USBD_MIDI_DataOut не срабатывает, соответственно конечная точка не сбрасывается и драйвер перестает принимать данные. Похоже что когда одновременно срабатывают оба прерывания, USBD_MIDI_DataIn перебивает USBD_MIDI_DataOut. Я временно сделал костыль, который принудительно вызывает USBD_MIDI_DataOut из USBD_MIDI_DataIn. это помогает, но очевидно так оно работать не должно и выкладывать такой колхоз на пользу народа не хочется.

Т.к. работает драйвер, как обычный COM порт и логика у них общая, может кто сталкивался с подобным при работе с COM?

Я уже не знаю где искать. Помогайте, товарищи!

Или хотя бы расскажите, как USB дергает эти два прерывания? До этого с USB дела не имел.

Show usbd_midi.h


Show usbd_midi.c


Show usbd_midi_if.h


Show usbd_midi_if.c


Вложения:
STM_32_HAL_USB_MIDI.zip [38.45 Кб]
Скачиваний: 3
Вернуться к началу
 Профиль  
 
Показать сообщения за:  Поле сортировки  
Начать новую тему Ответить на тему  [ 1 сообщение ] 

Часовой пояс: UTC + 5 часов


Кто сейчас на конференции

Сейчас этот форум просматривают: нет зарегистрированных пользователей


Вы не можете начинать темы
Вы не можете отвечать на сообщения
Вы не можете редактировать свои сообщения
Вы не можете удалять свои сообщения
Вы не можете добавлять вложения

Найти:
Перейти:  

Powered by phpBB © 2000, 2002, 2005, 2007 phpBB Group
Русская поддержка phpBB