Страница 12 из 14 Первая ... 21011121314 Последняя
Показано с 221 по 240 из 261

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

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

    По умолчанию 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. #221
    Частый гость Аватар для eclipsevl
    Регистрация
    31.01.2009
    Адрес
    Гаага
    Возраст
    29
    Сообщений
    421

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

    Цитата Сообщение от nabiullin Посмотреть сообщение
    в Android OS с USB Audio Player Pro.
    Я проверил с ним - этого бага не наблюдал.

  3. #222
    Новичок Аватар для Adson
    Регистрация
    07.11.2007
    Адрес
    Москва
    Возраст
    57
    Сообщений
    44

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

    Цитата Сообщение от eclipsevl Посмотреть сообщение
    Я проверил с ним - этого бага не наблюдал.
    У меня он проявляется на этом плеере не при паузе, а при переходе на следующий-предыдущий трек (пока плеер подгружает поток из нового трека, идёт воспроизведение буфера). Устройство - LG V30+

  4. #223
    Старый знакомый Аватар для Sanny
    Регистрация
    01.07.2010
    Сообщений
    560

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

    А порт SQI1 это под SD-карту?

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

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

    Вроде починил.
    Последний раз редактировалось dortonyan; 03.04.2024 в 07:12.

  6. #225
    Новичок Аватар для Adson
    Регистрация
    07.11.2007
    Адрес
    Москва
    Возраст
    57
    Сообщений
    44

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

    Огромное спасибо! При первой же возможности проверим.

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

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

    Не, не починил.
    Удалось под отладкой сэмулировать работу буфера, оказалось что он не обнуляется. Надо разбираться с дма.

    ---------- Сообщение добавлено 07:36 ---------- Предыдущее сообщение было 07:14 ----------

    Поправил касяки DMA.
    Проверил под отладкой, что буфер очищается. Теперь проблем с "заиканием" софтового FIFO буфера быть не должно.
    Надо было конечно сразу делать нормальную очистку FIFO, иначе это не совсем FIFO, а просто циклический буфер.

    Кстати, под виндой хост помимо того, что шлет всегда команду на отключение, еще и выплевывает "пачку" нулевых семплов, которые даже без отключения потока обнуляют фифо буфер.
    Поэтому для имитации бага пришлось не только убрать выключение потока, но и увеличить размер буфера, чтобы он полностью не очищался.
    Вложения Вложения

  8. #227
    Новичок Аватар для Adson
    Регистрация
    07.11.2007
    Адрес
    Москва
    Возраст
    57
    Сообщений
    44

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

    Цитата Сообщение от dortonyan Посмотреть сообщение
    Кстати, под виндой хост помимо того, что шлет всегда команду на отключение, еще и выплевывает "пачку" нулевых семплов, которые даже без отключения потока обнуляют фифо буфер.
    Вот видимо поэтому поэтому под виндой этот баг и не проявляется.
    Спасибо большое ещё раз!

  9. #228
    Старый знакомый Аватар для Sanny
    Регистрация
    01.07.2010
    Сообщений
    560

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

    А к сабжу Sd-карточку по SDIO подключить можно?

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

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

    Цитата Сообщение от Sanny Посмотреть сообщение
    А к сабжу Sd-карточку по SDIO подключить можно?
    Только не к сабжу, а к контроллеру.
    Наверное можно. Что там надо QSPI?
    Можно даже USB-флешку подключить (может работать USB хостом), просто надо писать соотв. прошивку.

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

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

    Цитата Сообщение от dortonyan Посмотреть сообщение
    Не, не починил.
    Удалось под отладкой сэмулировать работу буфера, оказалось что он не обнуляется. Надо разбираться с дма.

    ---------- Сообщение добавлено 07:36 ---------- Предыдущее сообщение было 07:14 ----------

    Поправил касяки DMA.
    Проверил под отладкой, что буфер очищается. Теперь проблем с "заиканием" софтового FIFO буфера быть не должно.
    Надо было конечно сразу делать нормальную очистку FIFO, иначе это не совсем FIFO, а просто циклический буфер.

    Кстати, под виндой хост помимо того, что шлет всегда команду на отключение, еще и выплевывает "пачку" нулевых семплов, которые даже без отключения потока обнуляют фифо буфер.
    Поэтому для имитации бага пришлось не только убрать выключение потока, но и увеличить размер буфера, чтобы он полностью не очищался.
    Элегантное решение
    Я тоже пытался решить эту проблему, но наверное идея с очисткой буфера и честным FIFO прикольнее.
    С другой стороны, получается что у меня вышло реализовать запуск DMA0 по прерыванию от завершения предыдущей транзакции
    Цитата Сообщение от dortonyan Посмотреть сообщение
    Описал проблему на форуме микрочипа (в конце ветки), но - глухо как в танке: https://www.microchip.com/forums/FindPost/1219136
    void __ISR(_DMA0_VECTOR, ipl6SRS) DMA0_Handler(void)
    {
    // CHERIF Address error interrupt
    if (DCH0INT & _DCH0INT_CHERIF_MASK)
    {
    DCH0INTCLR = _DCH0INT_CHERIF_MASK;
    }

    // CHBCIF Block transfer completion interrupt
    if (DCH0INT & _DCH0INT_CHBCIF_MASK)
    {
    if(rb_dma0->valid)
    {
    // Buffer is not empty, set DMA source
    MUTE_SET_LOW();
    DCH1CONbits.CHEN = 1;
    DCH3CONbits.CHEN = 1;
    }else{
    MUTE_SET_HIGH();
    DCH1ECONbits.CABORT = 1;
    DCH3ECONbits.CABORT = 1;
    }

    rb_dma0->valid = 0;
    DCH0CONbits.CHEN = 1;
    DCH0INTCLR = _DCH0INT_CHBCIF_MASK;
    }

    IFS4CLR = _IFS4_DMA0IF_MASK;
    }
    Но ни до фикса, ни после эту проблему с Audio Player Pro не видел. Только если USB выдернуть, а питание оставить

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

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

    Цитата Сообщение от eclipsevl Посмотреть сообщение
    идея с очисткой буфера и честным FIFO прикольнее.
    Да, так по правильному и надо делать. Обработчики прерываний на этом процессоре использовать не желательно, там куча инструкций при вызове и возврате из обработчика.
    Тоже сразу не допер как реализовать, а потом надобность отпала, т.к. выяснилось что по факту хост всегда шлет команду отключения потока.
    А так-то ничего сложного:
    Каналы ДМА всегда работают по очереди в порядке приоритета.
    Берем два канала ДМА и настраиваем старт по одному и тому же вектору прерывания. Тогда они будут срабатывать поочередно, сразу друг за другом: сначала - канал с высоким приоритетом, потом - с низким.
    Каналом с высоким приоритетом читаем данные из фифо буфера, каналом с низким приоритетом пишем в буфер на это же место нули.

    Цитата Сообщение от eclipsevl Посмотреть сообщение
    Но ни до фикса, ни после эту проблему с Audio Player Pro не видел. Только если USB выдернуть, а питание оставить
    Там может какой-то частный случай с железом, типа подвисания хоста, из-за чего тот не успевает выдать нулевой поток.

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

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

    Цитата Сообщение от dortonyan Посмотреть сообщение
    Обработчики прерываний на этом процессоре использовать не желательно, там куча инструкций при вызове и возврате из обработчика.
    Согласен. Зависит от размера буфера конечно, у меня при оптимальном размере получилась частота прерываний ~125Гц.
    Но лучше эти вычислительные ресурсы потратить иначе.

  14. #233
    Новичок Аватар для nabiullin
    Регистрация
    08.05.2018
    Адрес
    Уфа, Башкирия
    Возраст
    40
    Сообщений
    62

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

    dortonyan, я протестировал вашу доработанную прошивку на своем софте и транспорте, и вот что выявил.
    Да, на паузе и при переключении треков зацикленный буфер исправлен, круто!

    Но на ВЧ звуках как бы эхом от них есть еле слышимые потрескивания, именно на вч и промежутках тишины.
    Я попробую записать аудио с этим артефактом, что бы продемонстрировать.

    Не знаю, связано ли это с тем, что мне пришлось использовать конфигурацию портов выводов как в проекте dee-jan так как под его распиновку у меня собран макет.

    Так же я переключал режимы мастер / слейв, это не влияет.
    И я переключил режим сетки
    #define I2S_MCLK_512Fs
    //#define I2S_MCLK_1024Fs

    так как у меня генератор 24,576 а на 1024Fs постоянный треск.

    Еще раз проверил прошивку от dee-jan где есть глюк с буфером, там звук чистый и этого потрескивания нету.

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

    напомню, у меня PIC32MZ2048ECG064

    тут запись синуса (два разных файла), сначала 44/16 потом 192/24

    https://disk.yandex.ru/d/xkHZtLBwaO5_Gw
    Последний раз редактировалось nabiullin; 04.04.2024 в 10:11. Причина: дополнение
    система в авто:
    процессор AudioBerry DSP1 -> усь Alpine MRP f900 -> ас Bewith Accurate 2 + саб Pioneer ODR TS2

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

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

    Цитата Сообщение от nabiullin Посмотреть сообщение
    Но на ВЧ звуках как бы эхом от них есть еле слышимые потрескивания, именно на вч и промежутках тишины.
    Я попробую записать аудио с этим артефактом, что бы продемонстрировать.
    Я в курсе о чем вы, сам встречал такой артефакт. Обычно он появляется из-за какого-то сбоя при отладке, либо когда не хватает быстродействия процессора.
    Проверьте в настройках проекта, чтобы для gcc компилятора была включена оптимизация уровня 2.
    И, т.к. у вас процессор EC, проверьте чтобы USB мост подключался с 3 сек. задержкой после запуска проца.

  16. #235
    Новичок Аватар для nabiullin
    Регистрация
    08.05.2018
    Адрес
    Уфа, Башкирия
    Возраст
    40
    Сообщений
    62

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

    Цитата Сообщение от dortonyan Посмотреть сообщение
    Проверьте в настройках проекта, чтобы для gcc компилятора была включена оптимизация уровня 2.
    И, т.к. у вас процессор EC, проверьте чтобы USB мост подключался с 3 сек. задержкой после запуска проца.
    да, всё так и сделано в проекте. Треск есть, выходит нужен мощнее МК ?
    система в авто:
    процессор AudioBerry DSP1 -> усь Alpine MRP f900 -> ас Bewith Accurate 2 + саб Pioneer ODR TS2

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

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

    Послушал файл.
    Не, там какой-то касяк в коде. То ли частота тактирования не та, то ли что-то еще.
    Ищите разницу, что вы правили в проекте помимо ДМА.

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

    Или попробуйте запустить последний проект что я выложил.
    Там только для вашего проца надо включить 3сек. задержку подключения ЮСБ, задать дефайн для 512Фс клока и правильный формат данных на выходе I2S.

  18. #237
    Новичок Аватар для nabiullin
    Регистрация
    08.05.2018
    Адрес
    Уфа, Башкирия
    Возраст
    40
    Сообщений
    62

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

    Цитата Сообщение от dortonyan Посмотреть сообщение
    Послушал файл.
    Ищите разницу, что вы правили в проекте помимо ДМА.

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

    Или попробуйте запустить последний проект что я выложил.
    Там только для вашего проца надо включить 3сек. задержку подключения ЮСБ, задать дефайн для 512Фс клока и правильный формат данных на выходе I2S.
    DMA я как раз таки не трогал, я менял порты вывода в ports.c файле.
    и то что выше вы перечислили: 512Фс, I2S, и 3 секунды.
    а файл ports я пробовал и полностью dee-jan ставить и только его нижнюю часть, где назначаются пины выхода.


    это его:

    Скрытый текст



    /************ Remappable pins *******************/
    REFCLKI1Rbits.REFCLKI1R = 0x07; // RPC14 REFCLKI1 input

    // I2S1 remappable outputs
    RPD11R = 0x5; // 0101 = SDO1 pin 45
    RPD9R = 0x5; // 0101 = SS1out pin 43

    // I2S2 remappable outputs
    RPD3R = 0x6; // 0110 = SDO2 pin 51

    // I2S3 remappable outputs
    RPC13R = 0x7; // 0111 = SDO3 pin 47

    // I2S4 remappable outputs
    RPD0R = 0x8; // 1000 = SDO4 pin 46

    // UART1 remappable output
    RPB3R = 0x1; // 0001 = U1TX pin13
    }
    [свернуть]



    а это ваш:

    Скрытый текст

    /************ Remappable pins *******************/
    REFCLKI1Rbits.REFCLKI1R = 0x07; // RPC14 REFCLKI1 input
    RPE5R = 0xf; // 1111 = REFCLKO1

    // I2S1 remappable outputs
    RPD3R = 0x5; // 0101 = SDO1
    RPD4R = 0x5; // 0101 = SS1out

    // I2S2 remappable inputs
    SDI2R = 0x1; // 0001 = RPG7 - SDI2
    SS2R = 0x1; // 0001 = RPG9 - SS2in

    // I2S3 remappable outputs
    RPB9R = 0x7; // 0111 = SDO3
    RPB15R = 0x7; // 0111 = SS3

    // I2S4 remappable outputs
    RPE3R = 0x8; // 1000 = SS4

    // UART1 remappable output
    RPB3R = 0x1; // 0001 = U1TX
    }
    [свернуть]
    система в авто:
    процессор AudioBerry DSP1 -> усь Alpine MRP f900 -> ас Bewith Accurate 2 + саб Pioneer ODR TS2

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

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

    берите мой обновленный проект с дма и пробуйте.
    Вложения Вложения
    Сергей.

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

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

    Цитата Сообщение от nabiullin Посмотреть сообщение
    DMA я как раз таки не трогал, я менял порты вывода в ports.c файле.
    Ну конфигурация портов артефактов точно не должна создавать. Оно либо работает, либо нет.
    Я такие вещи проверяю осциллографом: смотрю диаграммы I2S шины на выходе.

    Цитата Сообщение от nabiullin Посмотреть сообщение
    Еще раз проверил прошивку от dee-jan где есть глюк с буфером, там звук чистый и этого потрескивания нету.
    Пробуйте тогда обновленный проект Сергея. Там все то же самое, только добавлено исправление в dma для буфера.

  21. #240
    Новичок Аватар для nabiullin
    Регистрация
    08.05.2018
    Адрес
    Уфа, Башкирия
    Возраст
    40
    Сообщений
    62

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

    Цитата Сообщение от dee-jan Посмотреть сообщение
    берите мой обновленный проект с дма и пробуйте.
    странно, такое же поведение и с этой версией.
    а предыдущая ваша версия исправно работает по звуку.
    система в авто:
    процессор AudioBerry DSP1 -> усь Alpine MRP f900 -> ас Bewith Accurate 2 + саб Pioneer ODR TS2

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

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

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

Ваши права

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