Jump to content

    
Sign in to follow this  
iliasam

STM32F4 и изохронные IN endpoint

Recommended Posts

Пытаюсь сделать 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() вызывается как минимум один раз при запуске записи?

Share this post


Link to post
Share on other sites

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

 

http://electronix.ru/forum/index.php?showtopic=112562

вот вроде получилось у него в итоге

 

и вот

http://electronix.ru/forum/index.php?showtopic=123341

где чего то там на FS работало, а на HS не стало...

Share this post


Link to post
Share on other sites

Уже видел эти темы, в первой BaN не упоминал никаких проблем с прерыванием конечной точки, а во второй речь идет о EP OUT, которая работает несколько по другому.

Share this post


Link to post
Share on other sites

Уже смутно помню, что и как я делал, но вроде бы usbd_audio_DataIn() вызывается, когда буфер пуст и можно загрузить данные для следующей отправки. Таким образом, в usbd_audio_DataIn() можно непосредственно вызывать DCD_EP_Tx() с данными для отправки, либо ставить флаг, что можно отправить данные, если дынные еще не готовы и отправить эти данные из другого места тем же вызовом DCD_EP_Tx(), когда данные будут готовы. Так же при вызове usbd_audio_Init() можно сразу же загрузить данные в буфер для отправки через DCD_EP_Tx(), если они уже готовы или установить флаг, что буфер отправки пуст и данные можно загрузить для отправки через DCD_EP_Tx() из другого места, когда они будут готовы.

Я выложил исходники своего проекта, можете посмотреть там, если это вам поможет.

Share this post


Link to post
Share on other sites

Join the conversation

You can post now and register later. If you have an account, sign in now to post with your account.

Guest
Reply to this topic...

×   Pasted as rich text.   Paste as plain text instead

  Only 75 emoji are allowed.

×   Your link has been automatically embedded.   Display as a link instead

×   Your previous content has been restored.   Clear editor

×   You cannot paste images directly. Upload or insert images from URL.

Sign in to follow this