Страница 23 из 31 Первая ... 132122232425 ... Последняя
Показано с 441 по 460 из 617

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

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

    По умолчанию 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. #441
    Завсегдатай Аватар для antecom
    Регистрация
    10.02.2005
    Адрес
    Королев
    Возраст
    52
    Сообщений
    3,031

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

    Влезу с приземленным вопросом.
    Вывод в WASAPI push работает нормально на всех частотах дискретизации. В WASAPI event тоже нормально, но только 44.1 и 88.2кГц. При выводе 176.4 слышны сильные искажения, как будто пропадает часть семплов.

    У всех так или event должен работать полноценно?

    (Сетку 48 не проверял - пока распаян один генератор).
    Максим vmaudio@mail.ru

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

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

    antecom, я пробовал вроде только васапи push, вывод DoP работал только на нем.

    eclipsevl, вы оказались правы, возня с DMA не имеет смысла.
    Переделал код первого каскад 5842 интерполятора без DMA по аналогичной схеме, как с DMA. Только копируемый заголовок уменьшил до 8 семплов и копирую процессором.
    Теперь первый проход x2 5847 на 200МГц частоте длится 4,5мкс, а следующие пять проходов по 2,1мкс (видимо за счет кеширования). Выигрыш по производительности порядка 2,8 раз!
    Конечно на остальных каскадах прирост будет поменьше, т.к. там у меня кол-во операций чтения из RAM меньше, но тем не менее.
    Получается, что на пике можно сделать полноценный х16 апсемплер, как и на плисине, причем вместе с соневским модулятором.
    Последний раз редактировалось dortonyan; 26.05.2025 в 08:58.

  4. #443
    Завсегдатай Аватар для Turbo_man
    Регистрация
    06.04.2010
    Адрес
    Moscow
    Сообщений
    5,759

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

    Браво!!!
    Так выходит х16 и потом х8 = х128?

    ---------- Сообщение добавлено 02:49 ---------- Предыдущее сообщение было 02:46 ----------

    А в начале ветки думали, что на Пике32 максимум можно х2 апсемплер сделать.

    ---------- Сообщение добавлено 02:50 ---------- Предыдущее сообщение было 02:49 ----------

    Может теперь и серия PIC32MX тоже прокатит?

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

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


    Offтопик:
    DMA во всех процах штука хитрая, она не всегда ускоряет, иногда даже наоборот. Плюс бывают пляски с бубном, когда память кешируется.
    "Замполит, чайку?"(с)"Охота за Красным Октябрем".
    "Да мне-то что, меняйтесь!"(с)анек.
    <-- http://altor1.narod.ru --> Вопросы - в личку, е-мейл, скайп.

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

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

    Нельзя кодить так поздно. Это я замерил на частоте 300МГц. И первый проход дольше из-за того, что попадает на прерывание.
    В общем на 200МГц без DMA все первые проходы по 3,27мкс.
    Все равно выигрыш существенный, более чем вдвое.

    Цитата Сообщение от Turbo_man Посмотреть сообщение
    Может теперь и серия PIC32MX тоже прокатит?
    Теперь новый челлэнж - запустить ЦФ на STM8.
    А вообще проц нужен хотя M4 кортекс. В МХ вроде нет 64-бит аккумулятора, а главное - нет USBHS моста.
    Глянул ДШ МХ - не, не прокатит. Умножение с накоплением вдвое медленнее и системная частота низкая. А MZ получается навороченный проц, настоящий DSP.

    Цитата Сообщение от Alex Посмотреть сообщение
    DMA во всех процах штука хитрая, она не всегда ускоряет, иногда даже наоборот. Плюс бывают пляски с бубном, когда память кешируется.
    Ну вот это как раз тот случай и есть.
    Владиславу (eclipsevl) спасибо за подсказку. А то я думал что уже все, оптимизировать дальше некуда.
    Последний раз редактировалось dortonyan; 26.05.2025 в 10:02.

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

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

    Цитата Сообщение от dortonyan Посмотреть сообщение
    Теперь новый челлэнж - запустить ЦФ на STM8.
    На Z80. Простите, не удержался
    "Теория — это когда все известно, но ничего не работает. Практика — это когда все работает, но никто не знает почему. Мы же объединяем теорию и практику: ничего не работает... и никто не знает почему"
    Альберт Эйншейн.

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

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

    Модулятор ускорить не получится, т.к. он и так работает в кэше, но ЦФ на его входе теперь можно сделать получше (с х32 оверсемплингом).

  9. #448
    Не хочу! Аватар для Alex
    Регистрация
    20.03.2003
    Адрес
    Worldwide
    Возраст
    63
    Сообщений
    39,056

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


    Offтопик:
    Цитата Сообщение от dee-jan Посмотреть сообщение
    На Z80.
    Да нет проблем, если запихнуть ядро Z80 в FPGA какую нибудь...
    "Замполит, чайку?"(с)"Охота за Красным Октябрем".
    "Да мне-то что, меняйтесь!"(с)анек.
    <-- http://altor1.narod.ru --> Вопросы - в личку, е-мейл, скайп.

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

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

    Цитата Сообщение от dortonyan Посмотреть сообщение
    В общем на 200МГц без DMA все первые проходы по 3,27мкс.
    Все равно выигрыш существенный, более чем вдвое.
    Это уже больше похоже на то что должно быть
    Только я теперь запутался Сколько времени уходит на обсчет 6 стерео семплов (один фрейм) на 200МГц?

    Цитата Сообщение от dortonyan Посмотреть сообщение
    Владиславу (eclipsevl) спасибо за подсказку. А то я думал что уже все, оптимизировать дальше некуда.

    Я вот тоже в своей реализации смог убрать еще одну инструкцию, теперь 8/один тап. Еще оказалось что я использовал одну псевдо инструкцию, которая выполняется два такта.
    Тоже думал уже все, а нет, минус целых два такта.

    Цитата Сообщение от dortonyan Посмотреть сообщение
    Теперь новый челлэнж
    Сделать ASRC. Я в пятницу поковырял пару моделей, можно попробовать с квадратичной аппроксимацией уместить.

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

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

    Цитата Сообщение от eclipsevl Посмотреть сообщение
    Только я теперь запутался Сколько времени уходит на обсчет 6 стерео семплов (один фрейм) на 200МГц?
    На 6 семплов соот-но в 6 раз больше - 19,6мкс.

    Цитата Сообщение от eclipsevl Посмотреть сообщение
    Я в пятницу поковырял пару моделей, можно попробовать с квадратичной аппроксимацией уместить.
    Где-то читал, что интерполируют полиномом Лагранжа 3-й степени.
    По моему каким методом интерполировать - не принципиально. Все равно эта операция выполняется не так часто, ресурсов много не сожрет. Можно сделать расчет и поточнее.
    Последний раз редактировалось dortonyan; 26.05.2025 в 12:30.

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

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

    Я думал первый проход дольше, остальные - быстрее.
    Да, Лагранжем, 2 или 3 степени

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

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

    Цитата Сообщение от eclipsevl Посмотреть сообщение
    Я думал первый проход дольше, остальные - быстрее.
    Не, я выше уже писал, что ошибся. Просто первый семпл попадал на прерывание от USB.
    А так между семплами какие-то колебания времени есть, но незначительные.

    ---------- Сообщение добавлено 15:03 ---------- Предыдущее сообщение было 13:37 ----------

    Доработал код всего х8 интерполятора 5842. Вместо дма написал отдельную ф-ю, которая копирует 8 семплов из конца фифо в начало.
    На частоте 200МГц первая ступень считается за 2,72мкс на семпл. Иногда первый семпл из 6-ти считается вдвое дольше. Может в самом деле из-за загрузки в кэш, но я не уверен.
    Весь х8 ЦФ с аттенюатором на входе и округлением на выходе обсчитывает 6 семплов за 45,5мкс.
    По сути это уже можно называть не 5842, а 5847. Т.к. пик успеет обсчитать его и на более высокой частоте семплирования по входу.

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

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

    Алексей, никак не даете мне шанс обогнать Ваш фильтр по скорости

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

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

    Я стараюсь.

    Получается, что пик может обсчитать даже 8 каналов 5842. А в стерео 5842 обсчитывает с запасом даже на 100МГц частоте.

    ---------- Сообщение добавлено 21:15 ---------- Предыдущее сообщение было 17:04 ----------

    Цитата Сообщение от tomtit Посмотреть сообщение
    Я заметил эффект кликов даже не на аудио сигнале а на очень длинных FFT 16М, когда на очередном усреднении спектр разваливается. Используя цифровой осциллограф отловил всплеск на выходном сигнале. Явление случайное и очень редкое. До сих пор есть подозрение на софт в ПК.
    Послушал модулятор на х16 оверсемплинге, все равно редкие пуки есть. Хотя Сергей Агеев писал, что на х16 работает без проблем.
    Не пойму где накосячил, может где-то лишняя задержка в ООС....

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

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

    Так может просимулировать код на пк? так проще отловить.

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

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

    Нашел касяк в квантователе.
    Для квантования использовал инструкцию сдвига в лево на 31 бит с отработкой переполнения "SHLL_S.W". Тогда автоматом получается однобитный квантованный сигнал: либо 0x8000000, либо 0x7fffffff.
    Но не учел, что при нулевом значении такая схема не сработает и в ООС модулятора попадет нуль, со всеми вытекающими.
    Добавил перед квантованием принудительную установку младшего бита в единицу, теперь вроде все ок. Но надо слушать.

    P.S.
    Да, артефакты попали. Правда в округлении стало на инструкцию больше.
    Т.к. модулятор работает на высокой частоте, то каждая инструкция на счету. Меньше чем в три инструкции квантование придумать не получается.
    Ну и выход с модулятора получается инверсный, чтобы не тратить еще инструкцию на инверсию бита. Если нужно - инверсию всегда можно добавить во входном аттенюаторе.
    Последний раз редактировалось dortonyan; 26.05.2025 в 23:21.

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

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

    А что и как именно Вы пытаетесь сделать? Я нашел сдвиг влево на 31, потом сдвиг вправо. Оно?

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

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

    Цитата Сообщение от eclipsevl Посмотреть сообщение
    А что и как именно Вы пытаетесь сделать?
    Однобитное квантование: преобразование любого знакового числа в максимальное по модулю (с сохранением знака).

    Цитата Сообщение от eclipsevl Посмотреть сообщение
    Я нашел сдвиг влево на 31, потом сдвиг вправо. Оно?
    Там не просто сдвиг влево, а с сатурацией (чтобы сработала отработка переполнения). Сатурация и делает квантование, но для корректной работы перед ней нужно установить младший бит в единицу (OR $t6, $t6, 1).
    А сдвиг вправо - это уже восстановление гейна.
    Ладно, похоже еще экономичнее сделать не получится.
    Возможно если убрать округление в расчетах модулятора, то сэкономится еще несколько тактов. Но не понятно - за сколько тактов считается та или иная инструкция.

    Цитата Сообщение от eclipsevl Посмотреть сообщение
    Еще оказалось что я использовал одну псевдо инструкцию, которая выполняется два такта.
    Тоже думал уже все, а нет, минус целых два такта.
    Как вы определяете сколько тактов уходит на инструкцию (где единичная, а где псевдо)?

  20. #459
    Завсегдатай Аватар для Turbo_man
    Регистрация
    06.04.2010
    Адрес
    Moscow
    Сообщений
    5,759

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

    MPLAB ICD2 программирует PIC32MX, а MZ тоже?

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

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

    Цитата Сообщение от dortonyan Посмотреть сообщение
    Однобитное квантование: преобразование любого знакового числа в максимальное по модулю (с сохранением знака).
    Там не просто сдвиг влево, а с сатурацией (чтобы сработала отработка переполнения). Сатурация и делает квантование, но для корректной работы перед ней нужно установить младший бит в единицу (OR $t6, $t6, 1).
    А сдвиг вправо - это уже восстановление гейна.
    Ладно, похоже еще экономичнее сделать не получится.
    Возможно если убрать округление в расчетах модулятора, то сэкономится еще несколько тактов. Но не понятно - за сколько тактов считается та или иная инструкция.
    Попробуйте так:
    sra $t6, $t6, 31
    xori $t6, $t6, 0x00ffffff

    Маска 0x00ffffff задает гейн, поправьте на тот что нужен.
    Первая интсрукция:
    a >= 0 -> a = 0x00000000
    a < 0 -> a = 0xffffffff

    Вторая:
    0x00000000 -> 0x00ffffff
    0xffffffff -> 0xff000000

    В одну инструкцию не придумал как, нужно вникать в алгоритм модулятора.

    Цитата Сообщение от dortonyan Посмотреть сообщение
    Как вы определяете сколько тактов уходит на инструкцию (где единичная, а где псевдо)?
    В документации на набор инструкция процессора. Есть такая шпаргалка еще:
    https://s3-eu-west-1.amazonaws.com/d...-QRC-01.01.pdf

Страница 23 из 31 Первая ... 132122232425 ... Последняя

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

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

Ваши права

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