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