ВходНаше всё Теги codebook 无线电组件 Поиск Опросы Закон Среда
13 мая
1586628 Топик полностью
@COKPOWEHEU (Сегодня, 09:08, просмотров: 110)
ch32v303, usb-otg и изохронные точки. 

Разбираюсь с реализациями USB в различных контроллерах ch32v. Как ни странно, наиболее вменяемой оказалась самая "сложная", USB-HS в ch32v307.

А вот с USB-OTG (это которое в v103 - v307 с точками фиксированного размера по 64 байта, оно же иногда называется в документации USB-FS) до конца разобраться не получается до сих пор. Вопросы вызывает работа с изохронными точками, реализация микрофон + колонка.

Отдельно OUT точка вроде бы работает: возникают прерывания, передаются данные, все в порядке.

Отдельно IN точка работает, но криво: прерывания не возникают, но если привязаться к SOF или просто отсчитывать время, передавать данные можно. Это первый вопрос: возможно ли получать прерывания от изохронной IN-точки? В принципе, не критично, всегда можно воткнуть костыль.

А вот если попытаться задействовать одновременно IN и OUT точки, даже с разными номерами, все ломается. Перестают приходить OUT прерывания. Причем если не запущено программ, работающих с микрофоном, то есть не генерируются IN запросы, то OUT снова начинают работать. В смысле без перепрошивки, отключил запись звука, пошло воспроизведение. И наоборот, если сначала запустить воспроизведение, то перестает реагировать на UEPx_TX_LEN: что один раз было записано в DMA, то и передается. А иногда вместо данных отправляется какой-то мусор. То ли точки друг на друга влияют, то ли сам модуль USB сходит с ума. По памяти пересекаться не могут: там отдельные буферы по 2кБ каждый, адрес DMA после инициализации не меняю. По регистрам тоже: я разные номера точек тестировал. Да и с не-изохронными вроде не конфликтуют. И это основной вопрос: как заставить работать Isochronous-OUT + Isochronous-IN вместе?

Остальные режимы вроде бы работают нормально: энумерация проходит, дескрипторы передаются, MSD и CDC ведут себя как надо. Аудиодескрипторы тоже правильные - на USB-DEV и USB-HS проверял. Со стороны компа wireshark тоже ничего вразумительного не говорит. Существующие примеры вроде вот этого тоже смотрел. Но там либо IN, либо OUT, а по отдельности-то они и у меня работают.