Ну там проблема такая...
Энумерация проходит нормально, но вот на этапе изохронной передачи девайса хватает только на два пакета по 24 байт (?), и то все с нулями и статусом -75 (-EOVERFLOW). Дальше все пакеты идут с кодом ошибки OPERATION NOT PERMITTED (-1). Всё это дело смотрел в wiresharke из под линукса (малинки). Скрины прилагаю
Что насчет внутренностей...
Гоняю звук частотой 8000 Гц, ширина сэмпла 16 бит.
КТ инициализирована как изохронная, макс. размер пакета 32 байта.
В общем, все конфиги как в
оф. спецификации по USB Audio Class, за исключением того, что я увеличил максимальный размер пакета в дескрипторе КТ.
FIFO у меня инициализирован размером 128 байт. Конкретно использую TxFIFO1.
Теперь насчет отправки данных. Использую функцию DCD_EP_Tx(), отправляю по
16 байт. И то не звук, а просто массив с синусоидой.
В принципе я куда только её не пихал, но история почти все та же - идет отправка какого-то левого пакета (если верить wireshark), а потом - практически постоянное срабатывание прерывания IsoIncomplete.
В инете находил всякие примеры, например, с инвертирование бита четности в регистре КТ в прерывании IsoIncomplete, но это всё не то, как по мне. Даже без инвертирования данные хоть какие-то данные тоже должны идти.
На данный момент вызываю DCD_EP_Tx() в двух местах:
Первое - сразу после инициализации КТ. Идея была такая, чтобы сразу начать передачу, т.к. линукс после инициализации сразу посылает SET_INTERFACE на интерфейс с изохронной КТ.
Второе - в коллбеке прерывания TransferComplete (или XFRC).
В итоге функция и вызывается всего 2 раза , первое - это в инициализации, а второе - это в прерывании. Дальше затык в виде того, что сверху написал.
Проблема осложняется тем, что я пока не понял, как правильно дебажить фифо-буффер - по адресу напрямую не заглянешь. Читал, что выделено специальное место для дебага по адресу типа 0x50020000 для фифо буфферов, но я там ничего путного не нашел.
Регистры типа DIEPTXF1 проверял (где указано смещение и размер буфера), все ок.
Смущает несоответствие отправленного и принятого на Wireshark, мол я взывал функцию два раза по 16 байт, в итоге 32 байта, а на выходе Wiresharka 48 байт.
В общем, спасибо заранее спасибо за помощь, если кто чем поможет в этом деле)