Страница 29 из 29 Первая ... 19272829
Показано с 561 по 569 из 569

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

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

    По умолчанию 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. #561
    Завсегдатай
    Автор темы
    Аватар для dortonyan
    Регистрация
    03.06.2009
    Адрес
    BLR
    Возраст
    39
    Сообщений
    3,981

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

    Максим, пока нет. Допиливаю еще стерео DSP версию. Да и с временем не очень.
    Асио тоже пробовал, но это для нативного uac2 нештатный режим, поэтому само-собой работает криво.

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

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

    Залил на гит обещанный 8-канальный проект с поддержкой 16 и 24 бит разрядностей и доработанной схемой DMA.
    Но тестировать все это некогда, возможно найдутся какие-то баги.
    Кто использовал до этого многоканальный проект Сергея, можете стянуть новый проект с гита и заменить в нем файлы портов (ports) на свои.
    Ну и кроме портов нужно еще задать пользовательские параметры в файле system.h.

  4. #563
    Завсегдатай Аватар для antecom
    Регистрация
    10.02.2005
    Адрес
    Королев
    Возраст
    51
    Сообщений
    2,996

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

    dortonyan, Алексей, большое спасибо!
    Залил у себя - Adobe Audition теперь не ругается на монопольный режим, но многоканал в Exclusive в Foobar выдает ту же ошибку Unrecoverable playback error: "Unsupported stream format: 44100 Hz / 32-bit / 8 channels (0x63F)"
    Завтра ещё поковыряю, может с портами что то напутал, т.к. на I2S шину ничего не выдается даже в двухканальном режиме (хотя воспроизведение в плеере идет).
    Максим vmaudio@mail.ru

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

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

    Цитата Сообщение от antecom Посмотреть сообщение
    Завтра ещё поковыряю, может с портами что то напутал, т.к. на I2S шину ничего не выдается даже в двухканальном режиме (хотя воспроизведение в плеере идет).
    Там теперь в system.h хедере нужно выбирать какие I2S выходы на какие каналы включаются. Надо обязательно задать под свою плату.

    Проверил у себя - то же самое. Увы, дело оказалось не в разрядностях. У меня предположений больше нет, возможно что виндовский драйвер так работает, либо с васапи некорректно работает микшер фубара.
    Или спрашивать у Владислава (eclipsevl), что у него получилось.
    Последний раз редактировалось dortonyan; 20.08.2025 в 20:13.

  6. #565
    Завсегдатай Аватар для antecom
    Регистрация
    10.02.2005
    Адрес
    Королев
    Возраст
    51
    Сообщений
    2,996

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

    Цитата Сообщение от dortonyan Посмотреть сообщение
    Там теперь в system.h хедере нужно выбирать какие I2S выходы на какие каналы включаются. Надо обязательно задать под свою плату.
    Здесь?
    Код:
    // Set I2S output modules
    #define I2SBUF_CH12                     SPI1BUF
    #define I2SBUF_CH34                     SPI2BUF
    #define I2SBUF_CH56                     SPI3BUF
    #define I2SBUF_CH78                     SPI4BUF
    У меня разведены все 4 линии данных I2S, а L/RCK и SCK беру с SPI2.
    Данные на одной из линий присутствуют, а L/RCK и SCK молчат (висят единичном состоянии).
    В system.h выбрал 1024fs
    В port.h выход OSCSEL_SET задал под свою плату.
    port.c перенес с рабочего проекта (под свою плату) целиком.
    Попробовал внести те же изменения в проект Сергея - работает.
    Цитата Сообщение от dortonyan Посмотреть сообщение
    Проверил у себя - то же самое. Увы, дело оказалось не в разрядностях. У меня предположений больше нет, возможно что виндовский драйвер так работает, либо с васапи некорректно работает микшер фубара.
    Жаль конечно. Дело не только в Фубаре. В HQP и Roon многоканальный вывод через WASAPI не работает вообще.
    Последний раз редактировалось antecom; 21.08.2025 в 08:47.
    Максим vmaudio@mail.ru

  7. #566
    Старый знакомый Аватар для eclipsevl
    Регистрация
    31.01.2009
    Адрес
    Гаага
    Возраст
    31
    Сообщений
    512

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

    Проверил в AA - вывод аудио есть, но та же самая проблема в WASAPI Exclusive что и во вводе, данные как-будто идут пакетами и между ними гэп, примерно каждые 10мс.
    На запись это выглядит так:
    Нажмите на изображение для увеличения. 

Название:	1747601899802.png 
Просмотров:	24 
Размер:	48.5 Кб 
ID:	477090

    На скриншоте запись сделана в Excluseve mode и с девайсом на XMOS. Галочка на скриншоте не стоит, но во время записи была.

    Причем то же самое поведение и с девайсов на XMOS с виндовыми драйверами. Так что, видимо, что-то у АА не получается ладить с виндовым драйвером. Либо и у XMOS какая-то схожая ошибка где-то. Пока не смог раскопать что происходит.
    На запись пробовал просто слать семплы синусоиды из LUT чтобы исключить underflow fifo. Не оно.

    В REW, кстати, проблем нет в Exclusive mode

  8. #567
    Старый знакомый Аватар для dee-jan
    Регистрация
    09.07.2009
    Адрес
    BLR
    Возраст
    44
    Сообщений
    953

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

    В Дефонике тоже все выводит нормально, там это подписано как Kernel Streaming, 8каналов, 192кгц.
    "Теория — это когда все известно, но ничего не работает. Практика — это когда все работает, но никто не знает почему. Мы же объединяем теорию и практику: ничего не работает... и никто не знает почему"
    Альберт Эйншейн.

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

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

    Цитата Сообщение от antecom Посмотреть сообщение
    Здесь?
    Да.

    Цитата Сообщение от antecom Посмотреть сообщение
    Данные на одной из линий присутствуют, а L/RCK и SCK молчат (висят единичном состоянии).
    Странно, SCK по любому должен быть, если I2S модуль включен. Проверю позже у себя все каналы.

    ---------- Сообщение добавлено 21:32 ---------- Предыдущее сообщение было 20:32 ----------

    Цитата Сообщение от antecom Посмотреть сообщение
    а L/RCK и SCK беру с SPI2.
    Перепроверил вывод всех каналов. Нашел и исправил касяк в конфигурации I2S 2 модуля. У вас клоки как раз берутся с него, поэтому и ничего не работало.
    Запушил исправление на гит, можно пробовать.

    Больше касяков не нашел. Попробовал менять каналы между I2S модулями. На первый модуль выводится любая пара каналов.
    Остальные модули проверил осциллографом на наличие данных. Проверить с них звук к сожалению не могу, т.к. плата сделана под вывод стерео.

  10. #569
    Завсегдатай Аватар для antecom
    Регистрация
    10.02.2005
    Адрес
    Королев
    Возраст
    51
    Сообщений
    2,996

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

    Цитата Сообщение от dortonyan Посмотреть сообщение
    Перепроверил вывод всех каналов. Нашел и исправил касяк в конфигурации I2S 2 модуля. У вас клоки как раз берутся с него, поэтому и ничего не работало.
    Запушил исправление на гит, можно пробовать.
    Алексей, спасибо! Заработало.
    Цитата Сообщение от dortonyan Посмотреть сообщение
    Больше касяков не нашел. Попробовал менять каналы между I2S модулями. На первый модуль выводится любая пара каналов.
    Остальные модули проверил осциллографом на наличие данных. Проверить с них звук к сожалению не могу, т.к. плата сделана под вывод стерео.
    На второй модуль не выводится. Какие то пички видны вместо полноценных данных. Если не менять каналы, то данные нормальные.

    Ну и к сожалению проблема с многоканальным WASAPI Exclusive выводом осталась. Фубар выдает ошибку, ROON не воспринимает транспорт как многоканальный.

    Цитата Сообщение от dee-jan Посмотреть сообщение
    В Дефонике тоже все выводит нормально, там это подписано как Kernel Streaming, 8каналов, 192кгц.
    Kernel Streaming в Win10 вроде бы убрали. Его заменил WASAPI Exclusive. У меня KS на Win7 был на десятке нет.

    Цитата Сообщение от eclipsevl Посмотреть сообщение
    В REW, кстати, проблем нет в Exclusive mode
    Нет проблем с многоканальным выводом?
    Максим vmaudio@mail.ru

Страница 29 из 29 Первая ... 19272829

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

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

Ваши права

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