Проект “PCM в каждый дом” – Часть 4. Дополнение к кодеру

Проработка идеи

Рассказывает mihail2501

– Почему в кодере есть разъем USB, но используется он только для питания?
– Почему кодер нельзя подключить к компьютеру как аудиоустройство?
– Почему в кодер нельзя подать аналоговый аудиосигнал, ведь как бы это было удобно?..

Если кратко, то ответ на эти вопросы один, и он заложен в слогане проекта: “РСМ в каждый дом”. При разработке кодера была поставлена цель сделать его максимально дешевым, поэтому мы убрали часть функций, которые могут выполнять другие внешние устройства. И скорее всего они либо уже имеются у тех, кто интересуется тематикой РСМ, либо их можно купить готовые за относительно адекватные деньги и приемлемого качества.

А, впрочем, почему бы и да?! Нет ничего невозможного! Любой каприз за ваши деньги. Я решил подумать о том, можно ли включить в уже имеющийся в кодере дополнительный функционал в виде АЦП с аналоговым стерео-входом и вход USB. Что-то такое мы с Мишаней подозревали и при разработке второй ревизии платы заложили два дополнительных разъема для отладки возможной будущей периферии, выведя туда с дюжину свободных выводов ПЛИС. Я поставил себе ограничения: по возможности не менять основную плату, не менять корпус, не менять органы управления. Максимум, что можно было бы менять – прошивку, назначение органов управления и, возможно, разъемы на задней панели, но так, чтобы родная задняя панель могла быть установлена без изменений.

Внутреннее устройство корпуса позволяет дополнительно установить вторую плату, причем зазор между ней и основной платой получается равным 12 мм. Первое препятствие заключается в том, что на основной плате есть элементы, которые превышают эту высоту, а также есть разъем программирования AS, к которому нужно было сохранить доступ. Но это решается довольно просто – форма платы делается такой, чтобы обогнуть все «препятствия». Хоть плата и получилась довольно фигуристая, она на некотором своем протяжении имеет параллельные грани, входящие в пазы в корпус, что должно предотвратить неверные попытки сборки «бутерброда» из двух плат в корпус.

Форма верхней платы

Другая проблема касалась USB-разъема, случайное решение которой и вдохновило меня довести этот add-on хотя бы до полноценного «proof of concept». Суть проблемы в том, что для реализации полноценного USB-входа, внезапно, нужен полноценный USB-порт с линиями данных. Причем, очень желательно иметь его на том же месте, где уже стоит существующий разъем, чтобы не менять заднюю панель. В нашем же случае был применен разъем USB Type C, в котором нет линий данных – на момент разработки он был дешевле, и кроме питания от него ничего другого не требовалось. Конструктивно он имеет небольшой пьедестал, который поднимает его почти на 3 мм над платой, что более выигрышно определяло дизайн задней панели. По фантастическому стечению обстоятельств, точно такой же разъем, но с контактами для линий данных и без пьедестала, при монтаже в будущую верхнюю плату оказывался практически идеально на том же месте в отверстии задней панели. Разница нивелировалась погрешностями изготовления и монтажа панели. Совпадение? Возможно…

Таким образом, с заменой USB-разъема проблем нет – нужно просто выпаять имеющийся разъем из нижней основной платы и установить новый в дополнительную верхнюю плату. В новом разъеме уже будут линии данных стандарта 2.0, и пропускной способности интерфейса для наших целей будет более чем достаточно, т.к. кодер в любом случае не сможет работать ни с какой другой частотой дискретизации, кроме 44,1 кГц.

Следующая проблема – а как реализовать аналоговый вход? Да, установить на новую плату АЦП, но где разместить разъем? Дополнительного свободного места на задней панели, можно сказать, что нет от слова «совсем». Единственный разъем, которым можно «пожертвовать» без сильной утраты функционала и без масштабных переделок, — это RCA для видеовхода. Напомню, что он позволяет кодеру в выключенном состоянии передавать видеосигнал сквозь себя без изменений, что упрощает коммутацию кабелей между устройствами. Поначалу я хотел просто вместо этого разъема установить Jack 3.5 мм на верхнюю плату, но потом вспомнил, что существуют четырехконтактные Jack 3.5 мм, используемые в том числе и для передачи аналогового звука и композитного видео. Также в продаже можно легко найти готовые переходники с четырехвыводного Jack 3.5 мм на три RCA типа «мама». К тому же такие разъемы обратно совместимы с обычным трехвыводным Jack 3.5 мм на случай, если не требуется передавать видеосигнал. Покопавшись на Алиэкспрессе, я понял, что найти такой разъем нужной высоты для монтажа на плату — это довольно сложная задача. В основном такие разъемы стоят дорого, все имеют разные посадочные места и к тому же катастрофически редко встречаются даже для масштабов нашего проекта. Более того, разъем 3,5 мм чаще всего имеет наружный диаметр видимой части корпуса не больше шести миллиметров, что оставляет довольно большой зазор в отверстии уже готовой задней панели. К тому времени мне уже несколько раз попадались на глаза разъемы PJ-392A. Они очень хорошо подходят по дизайну, но имеют крепление на саму панель. Поэтому было решено разработать некий переходник, с которым бы этот разъем устанавливался и крепился в кодере аналогично уже установленным RCA. Было проработано несколько вариантов, но, забегая вперед, скажу, что было решено остановиться вот на таком варианте. Он не требовал изготовления сложных деталей и крепится довольно надежно.

 

Конструкция крепежа аудиоджека

Оставалось решить вопрос с органами управления. Добавилось два дополнительных входа и нужно было иметь возможность переключаться между всеми четырьмя. Передняя панель была полностью переосмыслена, но так, что все органы управления остались прежние и на своих местах. Работа кнопок «Power» и «REC Mute» не изменилась, а вот трехпозиционный переключатель «Emphasis» я решил задействовать под переключение цифровых входов «USB – Coaxial – Optical», перенеся «Emphasis» на нижний блок переключателей. Переключатель, который ранее выбирал цифровой вход, теперь позволяет переключиться между аналоговым входом и группой цифровых. Двухцветный диод статуса цифрового входа в режиме аналогового входа показывает уровень сигнала. Переключатель коррекции стал переключать только форматы РСМ, а управление коррекцией тоже переместилось на нижний блок переключателей.


Старая (вверху) и новая (внизу) передние панели кодера

На этом концепт с моей стороны был завершен и оставалась самая сложная часть – заинтересовать этим проектом Мишаню.

Воплощение в “железе”

Рассказывает Михаил Царёв

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

Исходно в кодере в ПЛИС заходит одна шина цифрового аудио I2S, приходящая из микросхемы SPDIF-приемника WM8805. Оттуда же приходит и мастерклок, восстановленный из SPDIF-потока. Добавляя два входа – USB-I2S мост и АЦП, мне необходимо было, во-первых, скоммутировать I2S от трех источников, а во-вторых, правильно развести мастерклок (MCLK).

Так как I2S из WM8805 у нас уже заведена в ПЛИС, то и коммутировать шины нужно было в ней, нужно только завести туда и остальные две шины. Для верхней платы были оставлены два 10-контактных разъема – ADC и PERIF. Учитывая их расположение на плате, наиболее короткий путь от USB и АЦП к ПЛИС лежит через разъем ADC. Каждая цифровая шина имеет 3 линии (LRCK, BCLK, DATA), что сразу же занимает 6 контактов из 7 свободных на разъеме ADC.

Переключение сигналов MCLK также можно было бы выполнить в ПЛИС, на плате кодера даже осталось неиспользованное посадочное место для установки кварцевого генератора, сигнал с которого заведен в ПЛИС. Но в разъеме ADC оставался всего 1 свободный контакт и протащить два сигнала мастерклока (от USB и к АЦП) не представлялось возможным. Поэтому единственным выходом оставалось установить генератор MCLK для АЦП на верхней плате и там же скоммутировать сигналы мастерклока. Тогда в ПЛИС пойдет всего 1 тактовый сигнал. Это было реализовано установкой пары буферов с тремя состояниями 1G125/1G126, которые имеют инверсные по отношению друг к другу сигналы управления. Это позволило управлять ими одним сигналом, который я завел через PERIF-разъем, т.к. он является статическим, и к его длине не было особых требований.

В качестве преобразователя USB в I2S я решил применить простую и относительно доступную микросхему PCM2706C. Причем индекс «C» в конце наименования здесь неспроста – эта модель поддерживает автоматическое конфигурирование из EEPROM-памяти при запуске. Кроме настроек, связанных с режимом работы, в этой конфигурации можно записать строку USB-дескриптора, которая будет видна в диспетчере устройств при подключении интерфейса к компьютеру.

Конфигурация содержит 57 байт и должна располагаться в EEPROM начиная с нулевого адреса и в обратном порядке бит. Полный список параметров:

  • Vendor ID (2 байта)
  • Product ID (2 байта)
  • Product string (16 байт ANSI ASCII)
  • Vendor string (32 байта ANSI ASCII)
  • Power attribute (1 байт)
  • Max power (1 байт)
  • Auxiliary HID usage ID in report descriptor (3 байта)

Дополнительно на стороне I2S была установлена микросхема гальванической развязки ADuM1400 для развязки земли USB и земли кодера. Также PCM2706C имеет сигнал nSUSPEND, который устанавливается в лог. 1, когда микросхема видит подключение к компьютеру. Для отслеживания наличия хоста его я тоже завел в ПЛИС через разъем PERIF, изолировав оптопарой.

PCM2706C имеет всего один недостаток для нашего применения. Кроме частоты дискретизации 44,1 кГц, она поддерживает еще 48 кГц, которая не поддерживается кодером и самим стандартом PCM IEC 60841-1988. Переписать драйвера для исключения этой частоты дискретизации из списка доступных – невозможно. Поэтому при выборе этой частоты в настройках операционной системы кодер переходит в аварийный режим и не генерирует PCM.

Одним из решений этой проблемы могло бы стать применение схемы передискретизации, например, на основе микросхемы CS8422. К тому же, применив ее для сигнала с SPDIF-приемника, можно было бы значительно расширить список поддерживаемых частот дискретизации. Но установить аппаратный передискретизатор возможно только на верхней плате. Это потребует больше свободных контактов в разъемах и лишних петель высокочастотных сигналов по плате. Реализовать передискретизатор программно внутри ПЛИС нам не позволяли оставшиеся ресурсы по ячейкам и PLL. Поэтому, взвесив все за и против, от передискретизатора мы отказались.

Структурная схема коммутации шин I2S и тактовых сигналов MCLK приведена ниже.

Структурная схема цифровой части

К выбору микросхемы АЦП предъявлялись требования по минимальным гармоническим искажениям, компактности корпуса со всей необходимой обвязкой и доступности. Выбор пал на PCM1808, которая на момент разработки стоила менее 80р за штуку. Ее отношение сигнал/шум и динамический диапазон покрывает разрешающую способность 16-битного аудиосигнала. Аналоговые входы несимметричные, что упростило схемотехнику входной аналоговой части.

Спектр аналогового входа приведен ниже.

Спектр сигнала 1 кГц, записанного через аналоговый вход

Без изменений не обошлась и схема питания. Линии питания +5В от USB-разъема теперь стали располагаться на верхней плате, поэтому через дополнительный двухконтактный разъем мы отправили их на нижнюю основную плату. А для питания верхней был установлен дополнительный DC-DC-преобразователь B0505S.

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

Набор для апгрейда кодера до версии 2.1

 

 

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