Страница 14 из 16 Первая ... 41213141516 Последняя
Показано с 261 по 280 из 312

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

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

    По умолчанию 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. #261
    Не хочу! Аватар для Alex
    Регистрация
    20.03.2003
    Адрес
    Worldwide
    Возраст
    62
    Сообщений
    37,842

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

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

  3. #262
    Новичок Аватар для Montix
    Регистрация
    09.01.2022
    Сообщений
    43

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

    Алексей, большое спасибо за этот отличный проект

    Посоветуйте, пожалуйста, что изменить в проекте, когда я использую внешний генератор 24 МГц для тактирования процессора.

    В этот момент я поменял:
    POSCMOD = EC
    #define PRIMARY_CRYSTAL_FREQUENCY_Hz 24000000u

    Должен ли я изменить:
    UPLLFSEL = FREQ_12MHZ
    или какое-то преобразование часов для периферийных устройств?

    Насколько я понимаю, sysclk рассчитывается из PLL_FRC. Так что это не зависит от POSC.

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

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

    Цитата Сообщение от Montix Посмотреть сообщение
    Алексей, большое спасибо за этот отличный проект

    Посоветуйте, пожалуйста, что изменить в проекте, когда я использую внешний генератор 24 МГц для тактирования процессора.

    В этот момент я поменял:
    POSCMOD = EC
    #define PRIMARY_CRYSTAL_FREQUENCY_Hz 24000000u

    Должен ли я изменить:
    UPLLFSEL = FREQ_12MHZ
    или какое-то преобразование часов для периферийных устройств?

    Насколько я понимаю, sysclk рассчитывается из PLL_FRC. Так что это не зависит от POSC.
    Да, UPLLFSEL нужно поменять, этот пареметр задает входную частоту USB PLL.

  5. #264
    Новичок Аватар для Montix
    Регистрация
    09.01.2022
    Сообщений
    43

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

    Цитата Сообщение от eclipsevl Посмотреть сообщение
    Да, UPLLFSEL нужно поменять, этот пареметр задает входную частоту USB PLL.
    Владислав, спасибо за совет Теперь USB начал определяться корректно.

  6. #265
    Новичок Аватар для Montix
    Регистрация
    09.01.2022
    Сообщений
    43

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

    Цитата Сообщение от eclipsevl Посмотреть сообщение
    Пару раз писали по поводу исправленной прошивки для UAC2, работающей под Линуксом и Андроидом.
    Выложил свою версию на гитхаб:
    https://github.com/eclipsevl/york_pic32mz_uac2_osfw/
    Я попробовал эту версию, но она не работает под Android. Хоть транспорт и определяется правильно, звук совершенно искаженный и неразборчивый - как будто промодулированный пилой. Пробовал на разных телефонах с Android 11 и 13. Везде одна и та же проблема.
    В ОС Win 10 также возникает проблема с произвольным заиканием звука и быстрым повторением одного тона, после чего наступает тишина, а затем воспроизведение возобновляется. В оригинальной версии Алексея из шапки в Win 10 этой проблемы нет, и воспроизведение все время плавное, без заторов. Но Android в нем, конечно, не работает.

    Я провел все выходные в поисках проблемы, но пока безуспешно.
    Думаю попробовать воспроизвести чистый синус на Android и посмотреть, какой будет выходной сигнал.

    Кто-нибудь пробовал эту версию на Android, чтобы проверить, правильно ли она воспроизводит звук?
    Альтернативно, знает ли кто-нибудь другую версию, которая правильно работает на Android и имеет выход 384 кГц/32 бита?

    Я использую PIC32MZ1024EFH064. Внешний тактовый генератор 24 МГц.
    0x0 << _SPI1CON2_AUDMOD_POSITION ... формат I2S установлен правильно с обеих сторон. Я также попробовал «LJ Mode», но никаких изменений в лучшую сторону.
    Последний раз редактировалось Montix; 20.08.2024 в 18:49.

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

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

    Цитата Сообщение от Montix Посмотреть сообщение
    Кто-нибудь пробовал эту версию на Android, чтобы проверить, правильно ли она воспроизводит звук?
    Проекты eclipsevl не смотрел, только если он сам пояснит.
    Этот вариант должен работать.
    dee-jan, еще выкладывал свою версию, он вроде проверял на андроите.

  8. #267
    Новичок Аватар для Montix
    Регистрация
    09.01.2022
    Сообщений
    43

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

    Цитата Сообщение от dortonyan Посмотреть сообщение
    Этот[/URL] вариант должен работать.
    Алексей, спасибо за подсказку. Сегодня еще раз перечитал всю ветку и скачал разные версии. Попробую вашу версию с исправлением FIFO и, возможно, другие.

    ---------- Сообщение добавлено 21.08.2024 в 17:07 ---------- Предыдущее сообщение было 20.08.2024 в 20:48 ----------

    Цитата Сообщение от dortonyan Посмотреть сообщение
    Этот вариант должен работать.
    Настроил, загрузил. Эта версия отлично работает на Android. Слушал музыку 4 часа без единого заикания или провала. Те же настройки, что и в версии от eclipsevl. Спасибо!

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

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

    Цитата Сообщение от Montix Посмотреть сообщение
    Настроил, загрузил. Эта версия отлично работает на Android. Слушал музыку 4 часа без единого заикания или провала. Те же настройки, что и в версии от eclipsevl. Спасибо!
    Сравните system.h, дефайны:

    // Choose I2S masterclock
    //#define I2S_MCLK_512Fs
    #define I2S_MCLK_1024Fs

  10. #269
    Частый гость Аватар для Ursula
    Регистрация
    31.03.2010
    Адрес
    Санкт-Петербург
    Сообщений
    485

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

    Цитата Сообщение от eclipsevl Посмотреть сообщение
    Сравните system.h, дефайны:

    // Choose I2S masterclock
    //#define I2S_MCLK_512Fs
    #define I2S_MCLK_1024Fs
    Владислав, загляните в личку.

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

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

    Добрый день. У кого есть готовый пример АЦП на pic32mz . По типу нужен микрофон на одной частоте, например, 96кГц. Без всяких наворотов. На uac 2 пробовал зафиксировать частоту одну, но драйвер все равно показывает в винде все возможные частоды дискретизации. Просматривал Ваши примеры, не могу разобраться как передавать "правильно" данные на хост. Постоянно идут на комп данные вперемешку. Хелп.

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

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

    DrShteyn, в этой ветке ранее уже выкладывалась версия проекта, допиленная чисто под АЦП.
    Перечень частот дискретизации задается в файле usb_PL.c
    Нажмите на изображение для увеличения. 

Название:	изображение_2024-09-19_132308968.png 
Просмотров:	46 
Размер:	190.2 Кб 
ID:	460381
    Лишние частоты можно просто удалить. Хотя как при этом поведет себя драйвер я не проверял.
    Если все равно показывает весь перечень - значит такой нативный драйвер, ничего не поделать.

    Если нужно поменять тип терминала по умолчанию (чтобы был значок "микрофон"), то это задается в конфигурационном дескрипторе в файле usb_Descriptors.h.
    Где именно - уже не вспомню, надо "курить" спецификации (см. вложения ниже).
    Только от типа терминала зависит поведение драйвера (ограничения на перечень частот), поэтому у меня выбран универсальный цифровой девайс.

    Цитата Сообщение от DrShteyn Посмотреть сообщение
    Постоянно идут на комп данные вперемешку. Хелп.
    Что значит "вперемешку", это как?
    Вложения Вложения

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

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

    Да спс. С частотами разобрался. Вдоль и поперек изучил спецификации. Оказывается в uac 1 частоты задаются в дескрипторе, а в версии 2.0 определяются драйвером в запросах. Буду изучать пример АЦП. Наверное будут еще вопросы)

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

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

    Цитата Сообщение от DrShteyn Посмотреть сообщение
    Оказывается в uac 1 частоты задаются в дескрипторе, а в версии 2.0 определяются драйвером в запросах.
    Да, в uac2 логику дескрипторов и энумерации поменяли.
    По хорошему конечно для 96кГц лучше использовать uac1. Потребление процессора можно сильно снизить.
    Такой проект я тоже выкладывал в начале ветки, но там только на воспроизведение. Под микрофон надо допиливать.

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

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

    Спасибо за поддержку) В Вашем проекте пытаюсь исправить декскриптор для mono режима. Ставлю только nChannel на 0x01 и устройство начинает не определяться. Как перевести в моно]

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

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

    Цитата Сообщение от DrShteyn Посмотреть сообщение
    Ставлю только nChannel на 0x01 и устройство начинает не определяться. Как перевести в моно]
    Возможно это ограничение драйвера на кол-во каналов, либо ограничение конкретного типа терминала. У меня надобности передачи одного канале не было, поэтому как запустить не подскажу.
    А вообще режим "моно" не определяет кол-во каналов. В таком режиме может работать и два канала, просто данные будут передаваться только в одном, либо распараллеливаться на оба.

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

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

    Цитата Сообщение от DrShteyn Посмотреть сообщение
    Спасибо за поддержку) В Вашем проекте пытаюсь исправить декскриптор для mono режима. Ставлю только nChannel на 0x01 и устройство начинает не определяться. Как перевести в моно]
    Все оказалось банально. Из-за сохранения настроек usb устройств Winda их подгружает при каждрм втыкании и может даже не запрашивать дескрипторы заново. Выход: изменили код- удаляем устройство из диспечера Windows. Этот совет где-то тут звучал.
    В итоге микрофон заработал на 1 канале, на фиксированной частоте и 32 bit.

    ---------- Сообщение добавлено 18:16 ---------- Предыдущее сообщение было 18:12 ----------

    Уважаемый автор темы, можете на пальцах описать следующее: У вас в коде отправка данных на USB по EP5 в 3х места: в запросе дескрипторов, прерывании usb и прерывании dmausb. Опишите логику работы процедуры отправки данных (в моем случае массива).

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

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

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

    Цитата Сообщение от DrShteyn Посмотреть сообщение
    Уважаемый автор темы, можете на пальцах описать следующее: У вас в коде отправка данных на USB по EP5 в 3х места: в запросе дескрипторов, прерывании usb и прерывании dmausb. Опишите логику работы процедуры отправки данных (в моем случае массива).
    Логика простая:
    Хост инициирует обмен данными через команду начала потока данных. В этот момент инициируется передача первого пакета в обработчике запросов.
    Все последующие порции данных хост запрашивает через прерывание USB.
    В этом прерывании в буфер DMA USB модуля загружаются данные из циклического буфера "ep5buf". На этом как бы все.
    При следующем запросе инициируется загрузка след. порции данных из буфера в EP5.

    А сложность вот в чем:
    Кол-во пакетов данных в циклическом буфере может быть не целое число. Т.е. может получиться ситуация, когда часть данных нужно сначала считать с конца буфера "ep5buf", а для чтения остатка - перейти на начало этого буфера.
    USB DMA модуль автоматически так переходить не умеет.
    Поэтому в прерывании USB DMA (т.е. когда завершилась загрузка данных в EP5 из циклического буфера) выполняется проверка на наличие остатка. И при его наличии инициируется передача остатка данных в EP5 из начала циклического буфера "ep5buf".
    Последний раз редактировалось dortonyan; 25.09.2024 в 21:42.

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

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

    Цитата Сообщение от DrShteyn Посмотреть сообщение
    Из-за сохранения настроек usb устройств Winda их подгружает при каждрм втыкании и может даже не запрашивать дескрипторы заново. Выход: изменили код- удаляем устройство из диспечера Windows.
    Или другой вариант. Прописать в устройство VID=0 PID=0, тогда винда будет всё запрашивать каждый раз, возможно ещё надо удалить возврат серийного номера(не помню точно). Но не факт что другой софт не переклинит.

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

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

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

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

    Цитата Сообщение от l3VGV Посмотреть сообщение
    Потом удалять из устройств включив отображение отключенных и тоже удалять.

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

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

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

    Цитата Сообщение от dortonyan Посмотреть сообщение
    Да, это само-собой.


    Логика простая:
    Хост инициирует обмен данными через команду начала потока данных. В этот момент инициируется передача первого пакета в обработчике запросов.
    Все последующие порции данных хост запрашивает через прерывание USB.
    В этом прерывании в буфер DMA USB модуля загружаются данные из циклического буфера "ep5buf". На этом как бы все.
    При следующем запросе инициируется загрузка след. порции данных из буфера в EP5.

    А сложность вот в чем:
    Кол-во пакетов данных в циклическом буфере может быть не целое число. Т.е. может получиться ситуация, когда часть данных нужно сначала считать с конца буфера "ep5buf", а для чтения остатка - перейти на начало этого буфера.
    USB DMA модуль автоматически так переходить не умеет.
    Поэтому в прерывании USB DMA (т.е. когда завершилась загрузка данных в EP5 из циклического буфера) выполняется проверка на наличие остатка. И при его наличии инициируется передача остатка данных в EP5 из начала циклического буфера "ep5buf".
    Все теперь понятно. Спасибо. Наверное можно обойтись и без USBDMA прерываний если использовать еще один буфер, в котором подготавливаются данные для отправки.

Страница 14 из 16 Первая ... 41213141516 Последняя

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

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

Ваши права

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