реклама на сайте
подробности

 
 
 
Reply to this topicStart new topic
> STM32F4 и изохронные IN endpoint
iliasam
сообщение Oct 17 2014, 18:55
Сообщение #1





Группа: Участник
Сообщений: 10
Регистрация: 30-11-08
Пользователь №: 42 101



Пытаюсь сделать USB-микрофон на базе платы STM32F4-Discovery.
Написал соответствующие дескрипторы, в Windows плата нормально видится как микрофон.
Хорошо обнаруживается команда SET_INTERFECE при запуске и остановке записи с компьютера.

А вот с изохронной конечной точкой проблемы.
Не совсем понятно, когда нужно передавать данные (вызывать функцию DCD_EP_Tx()).
Во всех виденных примерах такую функцию вызывают из обработчика прерывания изохронной конечной точки.

Вот только у меня этот обработчик (usbd_audio_DataIn) не вызывается.
Приходилось встречать информацию, что для того, чтобы он начал вызываться, нужно однократно запустить передачу DCD_EP_Tx() из обработчика прерывания SOF.
Пробовал сделать так - в результате usbd_audio_DataIn так и не вызывается, но возникают прерывания isochronous IN incomplete (usbd_audio_IN_Incplt). usbd_audio_IN_Incplt начинает вызываться только после вызова DCD_EP_Tx() из обработчика SOF. Частота этих прерываний - 500 Гц, и отключить их не удается.
В самом обработчике usbd_audio_IN_Incplt я выполняю очистку FIFO буфера - DCD_EP_Flush() и все. Сброс флагов прерывания, насколько я понял, происходит в самой библиотеке USB.

При этом, если установить breakpoint на вызов DCD_EP_Tx, то после остановки программы на нем и ее запуска видно, что прерывание usbd_audio_DataIn несколько раз все же вызывается, но потом происходит прерывание usbd_audio_IN_Incplt.

Пробовал предавать данные в обработчике прерывания SOF (только когда пришла команда на выбор "рабочего" интерфейса). В данном случае прерывания usbd_audio_IN_Incplt появляются только после остановки записи (когда обработчик SOF перестает вызывать передачу DCD_EP_Tx()).
После последующем запуске записи прерывания usbd_audio_IN_Incplt исчезают, и при остановке вновь появляются.
Несмотря на то, что функция передачи DCD_EP_Tx() вызывается с частотой SOF, никакие данные на компьютер не приходят - это видно в анализаторе.

Возникают следующие вопросы:
Почему не вызывается прерывание конечной точки usbd_audio_DataIn?
Из-за чего возникают прерывания isochronous IN incomplete - usbd_audio_IN_Incplt, почему они присутствуют даже после того, как компьютер прекратил запись?
Почему на компьютер не приходят никакие данные, хотя DCD_EP_Tx() вызывается как минимум один раз при запуске записи?
Go to the top of the page
 
+Quote Post
Golikov A.
сообщение Oct 17 2014, 19:55
Сообщение #2


Гуру
******

Группа: Свой
Сообщений: 4 256
Регистрация: 17-02-06
Пользователь №: 14 454



тут кто-то недавно бился с инкомплитами на СТМ, пришел к выводу что криво что-то в СТМе...

http://electronix.ru/forum/index.php?showtopic=112562
вот вроде получилось у него в итоге

и вот
http://electronix.ru/forum/index.php?showtopic=123341
где чего то там на FS работало, а на HS не стало...
Go to the top of the page
 
+Quote Post
iliasam
сообщение Oct 17 2014, 20:18
Сообщение #3





Группа: Участник
Сообщений: 10
Регистрация: 30-11-08
Пользователь №: 42 101



Уже видел эти темы, в первой BaN не упоминал никаких проблем с прерыванием конечной точки, а во второй речь идет о EP OUT, которая работает несколько по другому.
Go to the top of the page
 
+Quote Post
BaN
сообщение Oct 19 2014, 10:09
Сообщение #4


Частый гость
**

Группа: Участник
Сообщений: 144
Регистрация: 28-08-07
Пользователь №: 30 111



Уже смутно помню, что и как я делал, но вроде бы usbd_audio_DataIn() вызывается, когда буфер пуст и можно загрузить данные для следующей отправки. Таким образом, в usbd_audio_DataIn() можно непосредственно вызывать DCD_EP_Tx() с данными для отправки, либо ставить флаг, что можно отправить данные, если дынные еще не готовы и отправить эти данные из другого места тем же вызовом DCD_EP_Tx(), когда данные будут готовы. Так же при вызове usbd_audio_Init() можно сразу же загрузить данные в буфер для отправки через DCD_EP_Tx(), если они уже готовы или установить флаг, что буфер отправки пуст и данные можно загрузить для отправки через DCD_EP_Tx() из другого места, когда они будут готовы.
Я выложил исходники своего проекта, можете посмотреть там, если это вам поможет.
Go to the top of the page
 
+Quote Post

Reply to this topicStart new topic
1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0

 


RSS Текстовая версия Сейчас: 19th July 2025 - 08:04
Рейтинг@Mail.ru


Страница сгенерированна за 0.01386 секунд с 7
ELECTRONIX ©2004-2016