Страница 16 из 16 Первая ... 6141516
Показано с 301 по 305 из 305

Тема: Open-Source USB транспорт на PIC32MZ

  1. #1 Показать/скрыть первое сообщение.
    Завсегдатай
    Автор темы
    Аватар для dortonyan
    Регистрация
    03.06.2009
    Адрес
    BLR
    Возраст
    38
    Сообщений
    3,446

    По умолчанию Open-Source USB транспорт на PIC32MZ

    Проект делался для личных нужд, поэтому публикуется как есть, в том виде как сейчас зашит в моем транспорте.

    Причина разработки своего транспорта - отсутствие в продаже USB транспортов с I2S входом для использования АЦП. Кроме того, те транспорты что есть в продаже не устраивали по тем или иным причинам (либо плохо сделана плата, либо большое потребление).
    Раньше сдерживающим фактором было отсутствие uac2 драйверов. Однако с переходом на win10 с нативным драйвером данная проблема была решена.
    Ну и вообще, т.к. на дворе 21-ый век, то для меня не понятно - почему uac2 еще не перекочевал в открытый доступ. Данная публикация призвана исправить такое досадное упущение.

    Почему PIC32MZ: Преимущество перед ARM процессорами - встроенный USB HS мост и одновременно удобный компактный корпус с удобной распиновкой. А по сравнению с кмосом - низкое потребление: порядка 70..80мА максимум.

    Изначально планировал использовать фреймворк (harmony configurator), однако по ходу выяснилось, что данный фреймворк генерирует только USB AUDIO приложение для формата Class 1.
    Кроме того по форумам полно отзывов по касякам в фреймворке. Дорабатывать фреймворк оказалось крайне контр-продуктивно из-за жесточайшей инкапсуляции, громоздкого стека и отсутствия его описания.

    Намаявшись с фреймворком принял решение писать свой код с нуля. Но очень скоро обломался, т.к. выяснилось что для PIC32 процессоров описание USB моста полностью отсутствует! Т.е. микрочип предлагает только пользоваться их кривыми фреймворками.
    Однако на форуме микрочипа нашлись добрые люди, которые поделились исходниками своих проектов USB девайсов на PIC32MZ: https://www.microchip.com/forums/m1083508.aspx
    Пользуясь данными примерами, а так же методом тыка, удалось написать свой достаточно эффективный код (итоговый размер с оптимизацией gcc компилятора уровня 2 - менее 16кБт).
    Конечно код не такой красивый как в фреймворках, слабовата инкапсуляция. Зато, разобраться в нем и доработать под свои нужды гораздо проще. А главное проще обходить касяки периферии, которые как оказалось имеют место быть.
    В частности есть не описанные в эррате проблемы с DMA модулями.

    Что в итоге удалось реализовать на самом чипе, без обвеса дополнительными микросхемами:
    1. Вывод стандартного стерео: 32bit 768kHz (Правда драйвер не отображает частоты выше 384к, но по факту 768к выводит). И сам модуль I2S пика позволяет выводить данные с частотой не выше 384к. 768к вывести тоже можно, но каким-то нестандартным интерфейсом, типа QSPI или параллельным портом.
    2. Вывод многоканала: 8-каналов 32bit 192kHz (опробовал только в отладочном режиме, подробнее ниже).
    3. Стерео вход: 32bit 768kHz (опробовал по факту только 192, т.к. мой АЦП больше не выдает).
    4. Распознавание DoP формата и вывод из него стерео DSD-битстрима частотой до DSD256 включительно.
    5. До кучи - добавлено CDC устройство (виртуальный COM-порт) для обмена данными с транспортом (в проекте используется в отладочном виде, на любые принятые данные отвечает строкой "CDC is works").

    Вывод многоканала физически не реализован, т.к. изначально в транспорте он не предусматривался. Работу проверял в отладочном режиме, переключая на выход пары каналов по очереди (остальные каналы выводили данные в отладочные буферы).
    Весь описанный выше функционал реализован на DMA модулях, благодаря чему хватает небольшой тактовой частоты процессора (160МГц для работы многоканала + стерео-входа).
    Причем изначально вывод данных в I2S модули выполнялся на DMA с прерываниями. Однако, выяснилось, что прерывания DMA работаю криво, из-за чего модуль может самопроизвольно вырубаться.
    Описал проблему на форуме микрочипа (в конце ветки), но - глухо как в танке: https://www.microchip.com/forums/FindPost/1219136

    Пришлось выкручиваться по другому. В результате получилось даже лучше, т.к. передача данных между I2S буферами и FIFO данных получилась полностью аппаратной (DMA модули перегружаются автоматически в цикле).
    Кроме того, для дополнительного снижения потребления добавлено 3 режима с разной тактовой частотой, в зав-ти от кол-ва каналов и выбранной ЧД.
    В результате потребление от USB шины (контроллер + развязка) с питанием через step-down получилось от 40мА (стерео-вывод), до 55мА (8-каналов + стерео вход).
    Отмечу, что в режиме FS (uac1) потребление можно опустить еще ниже: до 20..30мА, что может быть актуально для портативного девайса.

    Проект сделан в IDE MPLabX 6.05, с компилятором CX32 v4.1. Проверялся только на win10. Актуальная схема транспорта ниже во вложении.
    Конечно, нативный uac2 драйвер в win10 достаточно корявый, легко ломается сам и еще легче ложит винду (хватает ошибки в дескрипторе). Но готовый проект значительно облегчает отладку USB девайса, достаточно выпилить лишний функционал из дескриптора и обработчика команд.
    Особенности конфигурации USB моста или DMA модуля я постарался подробно описать комментариями, но если у кого-то найдутся другие проблемы - можно обсудить в ветке ниже.
    Вложения Вложения
    Последний раз редактировалось dortonyan; 24.12.2022 в 14:13.

  2. #301
    Зарегистрировался Аватар для DrShteyn
    Регистрация
    19.09.2024
    Сообщений
    11

    По умолчанию Re: Open-Source USB транспорт на PIC32MZ

    Цитата Сообщение от dortonyan Посмотреть сообщение
    Не пробовали просто взять проект под АЦП и ничего не меняя использовать его? Просто данные подавать в один канал, второй не использовать.
    Просто проект под АЦП у меня не заработал, смотрел все, не понял почему.
    Цитата Сообщение от dortonyan Посмотреть сообщение
    Вот прямо сейчас попробовал для проекта из шапки вывести звук на ЦАП, потом принять через АЦП. Включил в звуковых устройствах прослушку АЦП: нормальный звук, никаких проблем.
    По спектру тоже артефактов не замечено.
    У меня артефакты начинаются через пару минут, видимо когда буферы пересекаются.
    Попробую проект из шапки заполнять на выход синусом, и посмотрю. Где-то я что-то упускаю.

  3. #302
    Завсегдатай
    Автор темы
    Аватар для dortonyan
    Регистрация
    03.06.2009
    Адрес
    BLR
    Возраст
    38
    Сообщений
    3,446

    По умолчанию Re: Open-Source USB транспорт на PIC32MZ

    Цитата Сообщение от DrShteyn Посмотреть сообщение
    У меня артефакты начинаются через пару минут, видимо когда буферы пересекаются.
    Ну я уже минут 10 слушаю, все нормально.
    Где-то что-то в коде поломали. Может объем буфера задали неправильный, или что-то еще.

  4. #303
    Зарегистрировался Аватар для DrShteyn
    Регистрация
    19.09.2024
    Сообщений
    11

    По умолчанию Re: Open-Source USB транспорт на PIC32MZ

    Разобрался. Мои аудио параметры 24bit 96кГц. Битрейд выбрал этот, потому что простые аудиокарты не воспроизводят 32 бита на такой частоте. В дескрипторе соответственно прописал 24bit / 3 bytes, что и было ошибкой. DMA буферы выравниваются по 2 байта и мои значения сэмплов по 3 байта рано или поздно приводили к искажениям в переданном звуке. Исправил в дескрипторе на 4 байта, а 24bit оставил. Заполняю буфер 3 байтами значений, причем выравнивать нужно по левому краю.
    Что заметил: Асинхронный режим имеет неявную feedback, т.е. хост считает и принимает все данные, засовывая их в свою частоту как есть, что приводит к редким акустическим артефактам (в USB specification об этом говориться). Для простых вещей это прокатывает. В идеале на стороне device (микрофона) необходимо или корректировать свою внутреннюю частоту (не мой случай) или производить ресэмплинг, опираясь на четкие 125мкс между прерываниями USB.
    Будет время - выложу готовый тестовый код с рэсемплингом, а то листинг для микрофона на pic32 не найти в просторах инета. Все почему-то делают только аудио ЦАПы и кодеки.
    Автору темы большое спасибо!

  5. #304
    Не хочу! Аватар для Alex
    Регистрация
    20.03.2003
    Адрес
    Worldwide
    Возраст
    61
    Сообщений
    37,250

    По умолчанию Re: Open-Source USB транспорт на PIC32MZ

    Цитата Сообщение от DrShteyn Посмотреть сообщение
    Битрейд выбрал этот, потому что простые аудиокарты не воспроизводят 32 бита на такой частоте.
    Да никакие реальных 32 бит не воспроизводят, на любой частоте.

    Цитата Сообщение от DrShteyn Посмотреть сообщение
    Что заметил: Асинхронный режим имеет неявную feedback, т.е. хост считает и принимает все данные, засовывая их в свою частоту как есть, что приводит к редким акустическим артефактам
    В смысле? Во 1-х, "асинхронный режим" - таког нет, есть изохронный режим с асинхронной синхронизацией. Во 2-х - в нем никогда небыло замечено никаких артефактов. Даже когда сутками оставлял работать - иногда попадалось несколко сбоев в передаче данных (битых пакетов). Было давно, больше 10 лет назад. так что точных цифр не помню. И с тех пор подобными проверками не занимался.

    P.S. Feedback еще есть implicit и explicit.
    "Замполит, чайку?"(с)"Охота за Красным Октябрем".
    "Да мне-то что, меняйтесь!"(с)анек.
    <-- http://altor1.narod.ru --> Вопросы - в личку, е-мейл, скайп.

  6. #305
    Завсегдатай
    Автор темы
    Аватар для dortonyan
    Регистрация
    03.06.2009
    Адрес
    BLR
    Возраст
    38
    Сообщений
    3,446

    По умолчанию Re: Open-Source USB транспорт на PIC32MZ

    Цитата Сообщение от DrShteyn Посмотреть сообщение
    Мои аудио параметры 24bit 96кГц. Битрейд выбрал этот, потому что простые аудиокарты не воспроизводят 32 бита на такой частоте. В дескрипторе соответственно прописал 24bit / 3 bytes, что и было ошибкой.
    Семен Семеныч...
    32 бита это просто размер слова для передачи данных. Какая при этом фактическая разрядность АЦП - без разницы (хоть 8 бит). Главное выход АЦП не конфигурировать в формат RJ. А для I2S или LJ неиспользуемый младшие биты просто заполняются нулями.
    В этом плане 32 бита формат получается универсальным, т.к. не нужно выбирать разрядность данных.
    Поэтому я и не стал добавлять в проект другие разрядности, т.к. много возни и дополнительные неудобства. Мне например не нравится длиннющая "партянка" с перечнем частот и разрядностей в св-вах звукового устройства.
    Драйвер без проблем приводит любую разрядность к 32-битам и обратно.

    Цитата Сообщение от DrShteyn Посмотреть сообщение
    Что заметил: Асинхронный режим имеет неявную feedback, т.е. хост считает и принимает все данные, засовывая их в свою частоту как есть, что приводит к редким акустическим артефактам (в USB specification об этом говориться). Для простых вещей это прокатывает. В идеале на стороне device (микрофона) необходимо или корректировать свою внутреннюю частоту (не мой случай) или производить ресэмплинг, опираясь на четкие 125мкс между прерываниями USB.
    Нету там никакой неявной ОС. И не нужен никакой ресеплинг. В изохронном синхронном режиме хост настраивает свою частоту точно под частоту данных от транспорта.
    Частота кадров USB с частотой семплирования вообще никак не связана. Хост рассчитывает частоту не по кол-ву принятых пакетов, а по скорости заполнения/опорожнения своего FIFO буфера.
    Точнее даже не так. На приеме данных хост вообще ничего не измеряет и не подстраивает, а тупо складирует принятые данные в память. Ему по барабану какая фактическая частота семплирования.
    Можно вместо 96кГц подсунуть 100кГц. Хост примет пакеты и так, без рассинхронов и сбоев.
    Поэтому никаких артефактов (редких и нередких) быть не должно. Я во всяком случае не встречал, даже делая замеры на АЦП с очень длинными выборками усреднения.
    Последний раз редактировалось dortonyan; 04.10.2024 в 14:46.

Страница 16 из 16 Первая ... 6141516

Социальные закладки

Социальные закладки

Ваши права

  • Вы не можете создавать новые темы
  • Вы не можете отвечать в темах
  • Вы не можете прикреплять вложения
  • Вы не можете редактировать свои сообщения
  •