iliasam 0 17 октября, 2014 Опубликовано 17 октября, 2014 · Жалоба Пытаюсь сделать 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() вызывается как минимум один раз при запуске записи? Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
Golikov 0 17 октября, 2014 Опубликовано 17 октября, 2014 · Жалоба тут кто-то недавно бился с инкомплитами на СТМ, пришел к выводу что криво что-то в СТМе... http://electronix.ru/forum/index.php?showtopic=112562 вот вроде получилось у него в итоге и вот http://electronix.ru/forum/index.php?showtopic=123341 где чего то там на FS работало, а на HS не стало... Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
iliasam 0 17 октября, 2014 Опубликовано 17 октября, 2014 · Жалоба Уже видел эти темы, в первой BaN не упоминал никаких проблем с прерыванием конечной точки, а во второй речь идет о EP OUT, которая работает несколько по другому. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
BaN 0 19 октября, 2014 Опубликовано 19 октября, 2014 · Жалоба Уже смутно помню, что и как я делал, но вроде бы usbd_audio_DataIn() вызывается, когда буфер пуст и можно загрузить данные для следующей отправки. Таким образом, в usbd_audio_DataIn() можно непосредственно вызывать DCD_EP_Tx() с данными для отправки, либо ставить флаг, что можно отправить данные, если дынные еще не готовы и отправить эти данные из другого места тем же вызовом DCD_EP_Tx(), когда данные будут готовы. Так же при вызове usbd_audio_Init() можно сразу же загрузить данные в буфер для отправки через DCD_EP_Tx(), если они уже готовы или установить флаг, что буфер отправки пуст и данные можно загрузить для отправки через DCD_EP_Tx() из другого места, когда они будут готовы. Я выложил исходники своего проекта, можете посмотреть там, если это вам поможет. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться