Страница 1 из 16 12311 ... Последняя
Показано с 1 по 20 из 309

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

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

    По умолчанию 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. #2
    Завсегдатай Аватар для Ломатель
    Регистрация
    23.01.2006
    Адрес
    г.Орел
    Возраст
    34
    Сообщений
    1,125

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

    спасибо, что делитесь
    Денис.

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

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

    Аплодисменты! Ток потребления после XMOS впечатляет.
    Сергей.

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

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

    Скрины для иллюстрации.

    Отображение режимов вывода в звуковых устройствах:
    Нажмите на изображение для увеличения. 

Название:	usb_audio_control.png 
Просмотров:	436 
Размер:	22.4 Кб 
ID:	428122

    Скрины настройки foobar плеера с wasapi драйвером (asio драйвер uac2 в win10 формально не поддерживает) для вывода DSD бит-стрима:
    Нажмите на изображение для увеличения. 

Название:	foo_output.png 
Просмотров:	323 
Размер:	24.9 Кб 
ID:	428121
    Нажмите на изображение для увеличения. 

Название:	foo_sacd.png 
Просмотров:	233 
Размер:	21.4 Кб 
ID:	428123
    Нажмите на изображение для увеличения. 

Название:	foo_dsd_processor.png 
Просмотров:	236 
Размер:	26.9 Кб 
ID:	428120

  5. #5
    Завсегдатай Аватар для Михаил45
    Регистрация
    09.03.2007
    Адрес
    Санкт-Петербург
    Возраст
    63
    Сообщений
    2,126

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

    Алексей спасибо за труд и что поделился наработками! Очень интересно. Не то , что некоторые "знатоки" тут на сайте.

  6. #6
    Завсегдатай Аватар для l3VGV
    Регистрация
    02.05.2009
    Адрес
    Псков
    Возраст
    43
    Сообщений
    1,020

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

    А чем автора не устроил внешний phy вроде usb3300, который описан широко и нормально подключается к хорошо описанным Stm32f4? Также иногда можно найти stm32f7. В целом под St с их кривым железом описания и бесплатные библиотеки обычно в наличии.

    Я свой шедевор планировал на f7 делать. Но потом всё сломала лень

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

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

    l3VGV, разве не очевидна простота решения на PIC32MZ?
    1. Это один компактный чип (64 пина корпус), вместо пары STM32 и 3300.
    2. Низкое потребление. Один 3300 потребляет пол сотни мА.
    3. Это удобная распиновка. Вы видели распиновку стм-а с внешним phy? Я ориентировался на компактное, удобно трассируемое и с низким потреблением решение, а не просто абы работало.
    4. STM32 может и лучше описан, но по хорошему все равно надо разбираться с ЮСБ стеком. Т.е. чтобы сделать быстрый код все равно пришлось бы прилично поработать. К тому же у пика достаточно мощный аппаратный низкоуровневый USB стек. 3300 я не изучал, но не уверен, что с ним получилось бы сильно проще.

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

    Вообще, вариант на STM32 я тоже рассматривал, и даже прикупил F407 + 3300. Но когда посмотрел описание периферии пика, то понял что надо делать на нем, и не жалею.
    Конечно отсутствие описания USB моста пика стало неприятным сюрпризом, но к счастью все обошлось.

  8. #8
    Старый знакомый Аватар для Analog
    Регистрация
    20.12.2009
    Адрес
    СПб
    Сообщений
    745

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

    dortonyan, очень круто!
    Можно увидеть трассировку ПП, или рендер?
    Коннектор I2S именно PLD-10 установлен? На такой девайс просится что-то более компактное, с шагом меньшим, чем 2.54мм. Как пример, https://www.platan.ru/cgi-bin/qwery.pl/id=2011903791
    Интересно, что в цепях питания есть конденсаторы такой малой емкости в 560 пФ (блокировка шума?).
    Последний раз редактировалось Analog; 22.12.2022 в 09:12.
    "Широкая сцена и направленный провод – горе в семье"

  9. #9
    Завсегдатай Аватар для maxssau
    Регистрация
    15.08.2015
    Адрес
    Самара
    Возраст
    40
    Сообщений
    2,624

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

    _________________
    Евгений

  10. #10
    Завсегдатай Аватар для Nikkov
    Регистрация
    01.11.2005
    Адрес
    Омск, Сибирь
    Возраст
    51
    Сообщений
    1,372

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

    dortonyan, крутой проект!
    А как у этих PIC-ов доступность? В свое время не стал доделывать подобный проект на LPC18|43, так как несмотря на то, что пару штук я их купил за очень недорого, в свободной продаже их практически не было и нет до сих пор. А так тоже, чипы удобные, не требующие внешнего phy для HS.
    Электроника наука слабоизученная (c)
    Неизвестный специалист антенного хозяйства по поводу периодического пропадания сигнала в коллективной антенне

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

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

    Цитата Сообщение от Analog Посмотреть сообщение
    Можно увидеть трассировку ПП, или рендер?
    Коннектор I2S именно PLD-10 установлен? На такой девайс просится что-то более компактное, с шагом меньшим, чем 2.54мм. Как пример, https://www.platan.ru/cgi-bin/qwery.pl/id=2011903791
    Интересно, что в цепях питания есть конденсаторы такой малой емкости в 560 пФ (блокировка шума?).
    Нижняя часть схемы (OEM_board) к транспорту отношения не имеет, это я на плате зарезервировал футпринт под болгарский OEM транспорт на кмосе. У транспорта на пике только разъем PLS программирования.
    В трассировке ничего хитрого нет, разве что диф. шина USB аккуратно разтрассирована с подгонкой по длине диф. пары. Я плату уже выкладывал в других ветках.
    Емкость 560пик используется в степдауне для плавного запуска (иначе из-за пускового тока внутренняя триггерная защита выключает стаб), и для унификации такая же на пине ресета для фильтрации помех. Номинал не критичен, ставил емкость какая была. На ресет можно 1..100нан ставить.

    Есть правда у пика один существенный нюанс - косячный встроенный генератор для кварца.
    У меня кварц запустился не сразу, пришлось точно подбирать нагрузочные емкости, пока не заработал, и то с небольшой амплитудой, где-то на грани.
    В еррате микрочипа пишут что чип тестировался только с конкрнетным кварцем абракон, с другими кварцами работа не гарантируется. Поэтому для надежности лучше вместо кварца использовать внешний ген 12 или 24МГц.
    Видимо по этой причине на микрочиповских эвал-бордах на всех (или почти на всех) тактирование сделано внешними генераторами.

    Цитата Сообщение от Nikkov Посмотреть сообщение
    А как у этих PIC-ов доступность?
    Наверное не очень, как и со всем остальным. Но конкретно в моем случае как всегда помог камрад dee-jan, за что ему отдельный респект! Пользуясь случаем, я закупил себе жменю 064EFH процев через его знакомого на маузере.
    На счет доступности у нас ничего хорошего сказать не могу, надо искать.

  12. #12
    Частый гость Аватар для eclipsevl
    Регистрация
    31.01.2009
    Адрес
    Гаага
    Возраст
    30
    Сообщений
    452

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

    Отличный проект, спасибо что делитесь!
    Я под свои нужды допилил Audio 2.0 с UART на основе проекта от maxssau, но не стал применять из-за недоступности нужных XMOS камней.
    Так и остался вариант аж на трех чипах.

  13. #13
    Завсегдатай Аватар для maxssau
    Регистрация
    15.08.2015
    Адрес
    Самара
    Возраст
    40
    Сообщений
    2,624

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


    Offтопик:

    не так давно начались проблемы с транспортом на UAC 1.0 на процессоре STM32F446, что то переделали с драйверами и моделью поведения USB в Win10, после того как компьютер проснулся не происходит начальная инициализация USB, из-за чего транспорт "думает" что она и не нужна, поэтому звук не выводится до перезапуска процессора. На XMOS и ComTrue таких проблем не замечено. Алексей, как в твоём проекте с запуском после сна хоста?

    _________________
    Евгений

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

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

    У меня такая же проблема на транспорте Bolero, на любых осях (win8.1 и win10).
    На пике на win10 такой проблемы нету (как на uac1, так и на uac2). Причем специально для этого никаких мер я не предпринимал, после сна все само нормально запускается. Наверное usb модуль пика на аппаратном уровне по умолчанию сам разруливает все как надо.

  15. #15
    Завсегдатай Аватар для Михаил45
    Регистрация
    09.03.2007
    Адрес
    Санкт-Петербург
    Возраст
    63
    Сообщений
    2,126

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

    На убунте и прочих дебианах таких проблем не замечал.

  16. #16
    Завсегдатай Аватар для maxssau
    Регистрация
    15.08.2015
    Адрес
    Самара
    Возраст
    40
    Сообщений
    2,624

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

    у меня еще не обрабатывается VBUS, а питание SELF POWER, подозреваю что именно в этом проблема. началось с месяц назад после очередного обновления
    _________________
    Евгений

  17. #17
    Старый знакомый Аватар для Злой
    Регистрация
    30.10.2009
    Сообщений
    500

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

    Цитата Сообщение от dortonyan Посмотреть сообщение
    такая же проблема на транспорте Bolero
    Windows 10 Домашняя, нет проблем ни с Болеро, ни с Фламенко.

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

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

    Там видимо какая-то зависимость от "железа" хоста. На разных компах по разному.

  19. #19
    Старый знакомый Аватар для tomtit
    Регистрация
    23.06.2009
    Адрес
    пгт.Торонтовка
    Возраст
    66
    Сообщений
    992

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

    На mouser.com эти микроконтроллеры уже NRND. Есть ли аналоги?

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

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

    ECH как у меня на схеме использовать необязательно, я сам докупал EFH, под них править немного. Я в коде сделал условную компиляцию для совместимости с EFH, т.ч. править возможно вообще не придется.
    Т.е. использовать можно любые процы из линейки PIC32MZ. Главное компилятор XC32 выбирать той же версии, что у меня.
    Последний раз редактировалось dortonyan; 23.12.2022 в 00:09.

Страница 1 из 16 12311 ... Последняя

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

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

Ваши права

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