Страница 18 из 19 Первая ... 816171819 Последняя
Показано с 341 по 360 из 363

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

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

    По умолчанию 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. #341
    Старый знакомый Аватар для Analog
    Регистрация
    20.12.2009
    Адрес
    СПб
    Сообщений
    751

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

    Цитата Сообщение от Alex Посмотреть сообщение
    90 ом чего?
    Синфазного импеданса на 100 МГц. Это для DLW21HN900.
    "Широкая сцена и направленный провод – горе в семье"

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

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

    Так в каком смысле "не очень много"?
    USB2 HS работает на 240МГц.
    "Замполит, чайку?"(с)"Охота за Красным Октябрем".
    "Да мне-то что, меняйтесь!"(с)анек.
    <-- http://altor1.narod.ru --> Вопросы - в личку, е-мейл, скайп.

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

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

    Alex, в том смысле, что импеданс такого дросселя сопоставим с импедансом юсб кабеля. Ну и в приведённом документе от Интелл тоже говориться, что 90 Ом ещё приемлимо.
    Как я понимаю, все это затевается, что снизить помехи на линии питания юсб. Имхо
    "Широкая сцена и направленный провод – горе в семье"

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

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

    Цитата Сообщение от Analog Посмотреть сообщение
    я, что 90 Ом ещё приемлимо.
    Приемлимо, но качество сигнала ухудшает.

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

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

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

    Alex, опечатка, конечно. От линии данных
    "Широкая сцена и направленный провод – горе в семье"

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

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

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

  8. #347
    Завсегдатай Аватар для antecom
    Регистрация
    10.02.2005
    Адрес
    Королев
    Возраст
    51
    Сообщений
    3,003

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

    Тоже запустил транспорт (для ЦАП на CS43198).
    Прошивку залил Сергея:
    https://forum.vegalab.ru/showthread....=1#post3220552
    без измениений, только переназначил I2S выходы под свою трассировку. Двухканальный вывод работает стабильно, многоканал пока не проверял.

    dortonyan, dee-jan, спасибо что поделились проектом!

    В Фубаре есть небольшой баг - при постановке воспроизведения на паузу или стоп, транспорт прерывает выдачу на линию SDA и примерно через 1мс выдает ещё пачку данных длительностью 0.5-1мс, что слышно как щелчок. На осциллограмме фиолетовым SDA, желтым UART выход транспорта.
    Миниатюры Миниатюры Нажмите на изображение для увеличения. 

Название:	PXL_20250509_103015356~2.jpg 
Просмотров:	45 
Размер:	649.4 Кб 
ID:	473294   Нажмите на изображение для увеличения. 

Название:	Stop2.png 
Просмотров:	25 
Размер:	26.7 Кб 
ID:	473293  
    Максим vmaudio@mail.ru

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

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

    antecom, Максим, с запуском.

    Цитата Сообщение от antecom Посмотреть сообщение
    В Фубаре есть небольшой баг - при постановке воспроизведения на паузу или стоп, транспорт прерывает выдачу на линию SDA и примерно через 1мс выдает ещё пачку данных длительностью 0.5-1мс, что слышно как щелчок. На осциллограмме фиолетовым SDA, желтым UART выход транспорта.
    Там надо отдельно изучать вопрос, почему так происходит. Скорее всего проблема не в фубаре, а в uac2 драйвере.
    При включении потока хост шлет команды:
    - включить
    - выключить
    - задать частоту семплирования
    - включить
    Возможно это и создает щелчки. Можно попробовать дописать автомат, который будет включать воспроизведение только после установки частоты семплирования. Но не факт, что на других ОС драйвер будет вести себя так же, может возникнуть несовместимость.
    Еще при включении бывает прямо длительный "пук", как будто где-то в буфере остались данные от предыдущего включения. В транспорте я пробовал делать полную очистку FIFO буферов - не помогает. Видимо это драйвер в виндовсе так криво работает.
    Помогает только включение фейдинга в плеере.

    Кстати, оказалось, что пик может еще и апсемплить. Попробовал запилить на MIPS32 ассемблере ф-ии для обсчета х8 фильтра-интерполятора по коэф-там 5842 от томтита - работает. При входной ЧД до 48кГц успевает обсчитать легко.
    А если заменять первую ступень фильтра более короткими, то апсемплер примет данные с частотой семплирования и до 192кГц.
    Причем пик успевает еще и обсчет округления с дизером и шейпером 1-го порядка под произвольную разрядность на выходе.
    Вот х16 оверсемплинг под вопросом, но можно попробовать заапсемплить еще х2, хотя бы каким-нибудь CIC3 фильтром.

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

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

    dortonyan, Алексей, спасибо за развернутый ответ.
    Цитата Сообщение от dortonyan Посмотреть сообщение
    Можно попробовать дописать автомат, который будет включать воспроизведение только после установки частоты семплирования.
    У меня этот щелчок происходит при вЫключении воспроизведения. При включении его нет.
    Помогла бы задержка на выдачу SDA, т.е. если поток данных на I2S выход прервался, то на 10-20мс выдаем на SDA нули независимо от того что шлет хост, а далее уже начинаем по новой вывод данных с хоста (если они есть).
    Ну или нужно будет поискать плагин для фубара который фейдит данные при pause/stop и только потом отсылает команду на останов.

    Цитата Сообщение от dortonyan Посмотреть сообщение
    Кстати, оказалось, что пик может еще и апсемплить. Попробовал запилить на MIPS32 ассемблере ф-ии для обсчета х8 фильтра-интерполятора по коэф-там 5842 от томтита - работает. При входной ЧД до 48кГц успевает обсчитать легко.
    Прикольно. Как я понимаю IIR фильтра для деления полос в трех-четырех полоске в него тоже войдут (FIR вменяемой длины вряд ли).
    Максим vmaudio@mail.ru

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

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

    Цитата Сообщение от antecom Посмотреть сообщение
    У меня этот щелчок происходит при вЫключении воспроизведения. При включении его нет.
    У меня такого вроде нету. Возможно еще зависит от ЦАП - как он себя ведет при обнулении данных по входу.

    Цитата Сообщение от antecom Посмотреть сообщение
    Помогла бы задержка на выдачу SDA, т.е. если поток данных на I2S выход прервался, то на 10-20мс выдаем на SDA нули независимо от того что шлет хост, а далее уже начинаем по новой вывод данных с хоста (если они есть).
    Может быть. Надо пробовать разные комбинации.

    Цитата Сообщение от antecom Посмотреть сообщение
    Ну или нужно будет поискать плагин для фубара который фейдит данные при pause/stop и только потом отсылает команду на останов.
    Так там фейдинг встроенный уже есть. Я им пользовался при приеме DoP данных.

    Цитата Сообщение от antecom Посмотреть сообщение
    Прикольно. Как я понимаю IIR фильтра для деления полос в трех-четырех полоске в него тоже войдут (FIR вменяемой длины вряд ли).
    На много-полоску да, только если IIR.
    А в стерео я уже и х16 режим запустил: 5842 + CIC4 х2 интерполятор + округление с дизером и шейпером.
    Для лучшего ослабления алиясинга можно еще немного удлинить первую ступень полуполосного интерполятора (сузить переходную полосу), либо сделать первую ступень минимальнофазовым фильтром с ослаблением на Найквисте в несколько десятков дБ.
    Еще придумал способ генерить пиком сигналы вордклока и клока деглитчера нужной формы: использовать свободные I2S модули и выводить ими сигналы нужной формы вместо данных.
    Получается максимально простой и добротный интерфейс для параллельных ЦАП: один пик и все.
    Прием 44к у него конечно похуже чем на FPGA (сильно удлиннить первую ступень нельзя), а вот для 96к или 192к входной частоты семплирования уже работают более пологие фильтры с полным ослаблением на частоте Найквиста.

  12. #351
    Завсегдатай Аватар для antecom
    Регистрация
    10.02.2005
    Адрес
    Королев
    Возраст
    51
    Сообщений
    3,003

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

    Цитата Сообщение от dortonyan Посмотреть сообщение
    Так там фейдинг встроенный уже есть. Я им пользовался при приеме DoP данных.
    Оказывается фейдинг появился в версии Фубара 1.6, а у меня была 1.5. Проверил с 1.6 - все отлично, проблема полностью ушла. Спасибо!
    Цитата Сообщение от dortonyan Посмотреть сообщение
    Получается максимально простой и добротный интерфейс для параллельных ЦАП: один пик и все.
    Да, классно получается.

    Offтопик:
    Нужно мне потянуть теорию цифровой фильтрации - интересная тема.
    Максим vmaudio@mail.ru

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

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


    Offтопик:
    Цитата Сообщение от antecom Посмотреть сообщение
    Нужно мне потянуть теорию цифровой фильтрации - интересная тема.
    Ну арифметика расчета свертки достаточно примитивна. А коэффициенты для свертки можно генерить матлабом.
    А так по аудио ЦОС есть неплохая книга Вологдина:

  14. #353
    Завсегдатай Аватар для antecom
    Регистрация
    10.02.2005
    Адрес
    Королев
    Возраст
    51
    Сообщений
    3,003

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

    Алексей, а PIC потянет полноценный цифровой 8-ми канальный РГ с дизерингом? (и нойзшейпингом, если в нем есть смысл).
    Рассматриваю вариант сделать комбинированный РГ - пару ступеней на реле и мелкие шаги в цифре.

    Offтопик:

    Цитата Сообщение от dortonyan Посмотреть сообщение
    Ну арифметика расчета свертки достаточно примитивна.
    Это да. По сути масштабированные на величину отсчетов импульсные характеристики фильтра накладываются друг на друга со сдвигом.
    За книжку, спасибо, почитаю.
    Максим vmaudio@mail.ru

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

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

    Цитата Сообщение от antecom Посмотреть сообщение
    Алексей, а PIC потянет полноценный цифровой 8-ми канальный РГ с дизерингом? (и нойзшейпингом, если в нем есть смысл).
    Это легко (даже на си).
    Можно еще накрутить регуляторы тембра и тон-компенасацию какую.

    Попробовал кстати разогнать проц по частоте, оказалось работает даже на 330МГц, вместо заявленных 252.
    Задал 300МГц ровно, чтобы был запас. На такой частоте обсчитывает 5842 + дополнительный х2 FIR апсемлер + дизер с шейпером. И можно еще удлинить первую ступень апсемплера.
    Но в проекте, что публиковал, конфигурация клока сделана до частот 200МГц (для транспорта больше не требуется).
    Для задания более высокой частоты надо править. Допилю проект, тогда выложу со всеми правками.

  16. #355
    Частый гость Аватар для Вергилий
    Регистрация
    28.10.2014
    Сообщений
    207

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

    Может, лучше для регулировки громкости реализовать HID либо Hardware Mixer какой, чтоб выставленную громкость по I2C отдавал на внешний РГ?
    Можно будет рулить усилителем, не ослабляя сигнал в цапе
    Последний раз редактировалось Вергилий; 12.05.2025 в 18:16.

  17. #356
    Завсегдатай Аватар для antecom
    Регистрация
    10.02.2005
    Адрес
    Королев
    Возраст
    51
    Сообщений
    3,003

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

    Цитата Сообщение от Вергилий Посмотреть сообщение
    Может, лучше для регулировки громкости реализовать HID либо Hardware Mixer какой, чтоб выставленную громкость по I2C отдавал на внешний РГ?
    Можно будет рулить усилителем, не ослабляя сигнал в цапе
    Лучше оба варианта, если это не сложно.
    Ослабление в цифре на 6-8дБ для современного ЦАП с ДД 130дБ не приведет к заметной деградации, а РГ сильно упрощается, особенно для многоканала.
    И лучше UART, а не I2C - проще гальванразвязка (одна линия, а не две).
    Максим vmaudio@mail.ru

  18. #357
    Частый гость Аватар для Вергилий
    Регистрация
    28.10.2014
    Сообщений
    207

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

    ---------- Сообщение добавлено 13.05.2025 в 00:02 ---------- Предыдущее сообщение было 12.05.2025 в 23:53 ----------

    Цитата Сообщение от antecom Посмотреть сообщение
    Лучше оба варианта, если это не сложно.
    Ослабление в цифре на 6-8дБ для современного ЦАП с ДД 130дБ не приведет к заметной деградации, а РГ сильно упрощается, особенно для многоканала.
    И лучше UART, а не I2C - проще гальванразвязка (одна линия, а не две).

    Offтопик:
    UART кстати можно довольно недорого развязать оптоволокном, связь с источником будет околонулевой
    Последний раз редактировалось Вергилий; 12.05.2025 в 23:13.

  19. #358
    Завсегдатай Аватар для Meta|_
    Регистрация
    08.03.2005
    Адрес
    Северная Голландия
    Возраст
    41
    Сообщений
    2,151

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


    Offтопик:
    Цитата Сообщение от Вергилий Посмотреть сообщение
    UART кстати можно довольно недорого развязать оптоволокном, связь с источником будет околонулевой
    Мне кажется, TOSLINK для подобных целей здесь уже не один десяток лет используют
    ∇·D = ρ
    ∇·B = 0
    ∇xE = – ∂B/∂t
    ∇xH = j + ∂D/∂t
    © J. C. Maxwell, O. Heaviside

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

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

    Цитата Сообщение от Meta|_ Посмотреть сообщение
    Мне кажется, TOSLINK для подобных целей здесь уже не один десяток лет используют
    Напрямую - не получится с совремнными приемниками.
    Я так делал когда-то, ,на старых тошибовских приемниках (TORX).
    Они конечно для аудио по современным меркам полная хрень, зато от DC работали. В отличие от.
    "Замполит, чайку?"(с)"Охота за Красным Октябрем".
    "Да мне-то что, меняйтесь!"(с)анек.
    <-- http://altor1.narod.ru --> Вопросы - в личку, е-мейл, скайп.

  21. #360
    iN GOD We TRUSt Аватар для EDDiE
    Регистрация
    13.02.2006
    Адрес
    GAZ-A-LAGO
    Сообщений
    13,823

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


    Offтопик:
    Насколько я понял, Игорь (tomtit), делал в своем ЦАП цифровую регулировку громкости без потери качества.
    https://forum.vegalab.ru/showthread....=1#post3165730
    и
    https://forum.vegalab.ru/showthread....=1#post3167610
    Последний раз редактировалось EDDiE; 13.05.2025 в 20:27.

Страница 18 из 19 Первая ... 816171819 Последняя

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

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

Ваши права

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