Easyelectronics.ru

Электроника для всех
Текущее время: 21 янв 2019, 23:22

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




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

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

Сейчас занимаюсь созданием народного опенсорс синтезатора на базе 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 Кб]
Скачиваний: 60
Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: STM32 HAL USB-MIDI Device Driver
СообщениеДобавлено: 10 мар 2018, 02:26 
Здравствуйте!

Зарегистрирован: 10 мар 2018, 02:21
Сообщения: 1
Привет, тоже интересуюсь данной темой, только я пытаюсь просто сделать приём и обработку и все, но вот не получается понять весь код


Вернуться к началу
 Профиль  
 
Показать сообщения за:  Поле сортировки  
Начать новую тему Ответить на тему  [ Сообщений: 2 ] 

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


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

Сейчас этот форум просматривают: LonelyWolf, SystemEn


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

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

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