Любимая музыка может поднять настроение, сделать пасмурный день не таким мрачным, развеять тяжелые мысли. Наверное, поэтому мы так часто видим на улице, в метро или в автобусе, в очереди в магазине людей в наушниках. Можно с уверенностью сказать, глядя на них, что они редко расстаются со своим увлечением, где бы они ни были. Предосторожение врачей о возможной глухоте тоже мало кого пугают. Больше беспокоит: на сколько хватит батареек, какое максимальное количество песен можно взять с собой (в дорогу); важен и размер плеера или приемника. С появлением портативных цифровых устройств воспроизведения звука многие беспокойства сошли на нет. Габариты и масса современных плееров практически незаметны и не стесняют движений, без лентопротяжного механизма энергии батарей хватает надолго, а совершенствование технологий аудиосжатия сделало возможным хранение музыки без потери качества в меньшем объеме памяти. Разработке собственного МР3-плеера и посвящена эта статья.
Проектирование такого устройства, как плеер, объединившего в себе дюжину «ноу-хау», на первый взгляд, может показаться просто невозможным. Но если воспользоваться опытом и репутацией специалистов в этом вопросе, то все окажется намного проще и яснее в достижении поставленной цели.
Разработчики компании VLSI (www.vlsi.fi) предлагают однокристальное решение для создания МР3-плеера — микросхему VS1001k.
VS1001k понимает все известные и наиболее популярные алгоритмы аудиосжатия MPEG — 1, 2 Layers I, II, III, а также так называемые MPEG 2.5 Layer III файлы с любой типовой скоростью и частотой дискретизации, поддерживается также и переменная скорость VBR (Variable Bitrate).
Микросхема состоит из быстродействующего сигнального процессора VS_DSP с низким потреблением мощности (см. рис. 1), 4 кбайт памяти для служебных программ и 0,5 кбайт — для пользовательских, двух последовательных интерфейсов типа SPI (разработана и впервые применена фирмой Motorola). Управление схемой декодирования реализовано через SCI-интерфейс, прием цифровых данных через SDI. Кроме того, микросхема содержит быстродействующий сигма-дельта стерео-ЦАП и стереоусилитель для подключения наушников.
Для корректной работы микросхемы необходим управляющий микроконтроллер. VLSI рекомендует AT90S4414 фирмы Atmel, хотя можно использовать и любой другой. В функции микроконтроллера входит выдача последовательных цифровых данных по запросу VS1001K, их синхронизация, выдача управляющих сигналов, также синхронизированных.
VS1001k производится в корпусах SOIC-28 и BGA-49 (рис 2). Первый тип корпуса удобен для макетирования и ручной сборки, второй — для серийного производства.
Для того чтобы разобраться, как в действительности работает это устройство, рассмотрим схему (рис. 3). На ней наглядно представлены этапы прохождения исходных данных через структурные блоки микросхемы. Направление движения звуковых данных может изменяться в зависимости от более точных настроек, которые доступны для управления через систему регистров. Механизм настройки мы рассмотрим немного позже.
Данные могут поступать в микросхему через шину данных SDI (предназначенную для этого) и шину управления. Второй способ исключает прохождение потока данных через декодер MP1/2/3, при этом поток данных представляет собой 16-разрядный линейный (оцифрованный) код, SM_DAC = 1. Если мы подаем на вход SDI полноценный mp3-файл, то SM_DAC необходимо выставить в 0. Затем звук проходит через простенький эквалайзер. На этом этапе можно либо увеличить уровень низких частот (SM_BASS = 1), либо уменьшить его (SM_BASS = 0). SM_DAC и SM_BASS — это 5 и 7 биты регистра MODE (см. п. Интерфейс SCI).
Специалистами VLSI была предусмотрена возможность вносить изменения в звуковой поток при помощи пользовательской программы, для которой выделено 0,5 кбайт в памяти микросхемы. Такое дополнение к функциональности позволяет реализовывать собственные фильтры, накладывать различные эффекты (например, эхо или реверберацию). При A1ADDR, установленном в ноль, данные не попадают в блок User Application, а попадают сразу на вход блока контроля громкости. В том случае, когда разработчик использует собственную программу, этот регистр должен быть равен адресу начала программы.
Буфер FIFO предназначен для того, чтобы своевременно выдавать данные на ЦАП с частотой, равной частоте дискретизации.
Интерфейс SCI
SCI — последовательный двусторонний интерфейс, обмен информации осуществляется 16-разрядными словами. Каждый сеанс чтения-записи позволяет обратиться только к одному из регистров микросхемы.
Код чтения-записи | Адрес регистра | Чтение-запись значения |
На рис. 4, а изображены диаграммы уровней сигналов на выводах SCI-интерфейса при чтении и записи соответственно. Операции чтения и записи определяются 8-битным кодом, за которым следует адрес регистра, и, если мы говорим о чтении, то на выводе SO снимаем с побитовой синхронизацией SCK значение данного регистра. При записи в регистр после его адреса следует его новое значение (рис. 4, б). Для чтения код равен 0000 0011 (0x3h), для записи 0000 0010 (0x2h). После каждого приема-передачи должна следовать пауза в 500 микросекунд.
Как уже было сказано ранее, настройка микросхемы осуществляется через регистры. Все они перечислены в таблице 1.
Таблица 1
Регистры располагаются в X-памяти (см. структурную схему) начиная с адреса 0x4000…0x40FF. При сбросе все регистры устанавливаются в нули.
Макет
Прежде чем переходить к коду, есть смысл собрать макет устройства (я вообще поклонник отладки программ на реальном железе). Берем плату Blue Pill и подпаиваем к ней модуль дисплея с картодержателем. Пайка позволяет нам не сталкиваться с проблемой дребезга соединений, которая может доставить много неприятностей на этапе отладки.
Тестовый модуль для VS1011 я собрал на макетке, использовав переходник с QNF48 на DIP, схему которого я посмотрел в даташите. На самом деле так заморачиваться необязательно — можно взять готовый модуль. Но у меня его не было, а ждать не хотелось.
В итоге я все это собрал за несколько часов и был готов переходить к коду.
Схема плеера
Макет устройства
Макетная плата кодека VS1011
Макетная плата кодека VS1011
Дисплей макета с ранним вариантом интерфейса
Установка частоты дискретизации
VS1001k позволяет проигрывать звуковые файлы с максимальной возможной частотой дискретизации 48000 Гц. При этом задающий генератор (речь идет о кварцевом или диэлектрическом резонаторе) должен работать на частоте не менее 24,576 МГц, именно эта частота рекомендована для микросхемы. Если частота генератора меньше, уменьшается и частота дискретизации. Для ее расчета можно воспользоваться формулой:
Как видно из выражения, при рекомендуемой частоте результат равен 48000. От частоты генератора напрямую зависит производительность DSP-процессора. В таблице представлена зависимость качества звука (скорость звукового потока и частоты дискретизации) и задающей частоты:
Эти значения соответствуют алгоритму декомпрессии, при котором частота дискретизации остается постоянной. В случае декомпрессии с переменной частотой скорость потока может увеличиваться.
При использовании нестандартной частоты генератора до начала проигрывания необходимо записать в параметр CLOCKF значение, рассчитанное по формуле:
При низких задающих частотах (ниже 15 МГц) микросхема позволяет удвоить ее. Для этого необходимо установить самый старший бит регистра в единицу, то есть для 14 МГц справедливы следующие вычисления:
Наверное собрать все вместе и запустить это очень сложно? Linux учить надо, да?
Во-первых, когда из разных комплектующих своими руками собирается что-то работающее — это невероятно увлекательно. Во-вторых, это экономично, да, уже сейчас за 399$, 999$ или 9000$ можно купить неплохие стримеры, но это неспортивно.
В третьих, вы создаете гибкий конструктор, в нем можно улучшить тактовый генератор, или поставить другой плеер, или по-другому организовать хранение файлов или подключить новый стимминговый сервис (например, Spotify) — в фирменных источниках все зависит от производителя, со своими источником можно делать всё что угодно. Ну и наконец, это несложно — сложность варьируется от простого прищелкивания платы расширения до небольшой пайки. Ну и сам Linux не так страшен. Установить на него специальную аудифильскую ОС Linux тоже просто. Дальнейшая настройки и использование не потребуют от вас знания секретных команд. Потребуется время, чуть внимания, но вы это сможете!
Подача тона на выход
Последовательность 0x53 0xEF 0x6E n генерирует синусоиду, поступающую на выход устройства. Параметр n может принимать значения от 48 до 119. Параметры тестового сигнала определяются по формулам:
И таблицам:
Авторы надеются, что в этой статье достаточно внимания было уделено знакомству с особенностями проектирования MP3.
Несколько слов о непосредственном включении VS1001k. Как показано на рис. 5, для управления VS1001k требуется 8 входов-выходов микроконтроллера.
При некоторых ограничениях это количество можно снизить до 6, как показано на рис. 6.
Чтобы такая схема работала, необходимо выполнение трех условий:
- MISO и GIO2 должны быть запрограммированы как входы, остальные — как выходы;
- когда SPI находится в неактивном состоянии, синхронизация SPI должна быть такой, как показано на осциллограмме (рис. 7);
- Если шина SPI недоступна, но микроконтроллер достаточно быстр, для организации сигналов MISO, MOSI и SCK могут быть использованы общие входы-выходы микроконтроллера.
В этой схеме GIO1 осуществляет выбор шины. Если он установлен в 1, XCS не активен, и тактовый сигнал SCK поступает через логический элемент «И» на вход DCLK. Таким образом, данные посланы шине SDI. Когда GIO1 установлен в 0, XCS активизируется, и синхронизация DCLK прекращается. Теперь данные поступают на шину SCI.
Например, требуется установить уровень громкости –2 дБ для левого канала и –3,5 дБ для правого канала. Для этого мы должны записать 0x0407 в регистр VOL [1, стр. 50]:
- активизируем интерфейс SCI, устанавливая GIO1 в 0;
- записываем четыре байта (0x2, 0xb, 0x4, 0x7) в SCI;
- заканчиваем передачу данных по шине SCI, устанавливая GIO1 в 1.
Для приема данных по шине SCI, в частности, для чтения содержимого регистра VOL необходимо:
- активизировать интерфейс SCI, GIO1 — в 0;
- записать два байта (0x3, 0xb) в SCI;
- записать один байт с любым содержимым в SCI. Прочитать содержимое регистра MISO микроконтроллера, который содержит теперь восемь старших битов результата;
- записать один байт с любым содержимым в SCI. Прочитать содержимое регистра MISO микроконтроллера, который содержит теперь восемь младших битов результата;
- объединить старшие и младшие биты для получения 16-разрядного слова;
- закончить обмен данных по шине SCI, GIO1 — в 1.
Чтобы отправить MP3-данные к VS1001k, нужно воспользоваться следующим алгоритмом:
- ждем, когда активизируется DREQ (1);
- активизируем DCLK, GIO — в 1.
- для каждого байта делаем следующее: устанавливаем BSYNC в 1;
- активизируем передачу по SPI;
- ждем, пока по крайней мере первый бит данных будет отправлен, а последний бит данных — нет;
- устанавливаем BSYNC в 0;
- ждем окончания SPI-цикла микроконтроллера для завершения процедуры.
Три сигнала (сверху вниз) изображены на рис. 7: DCLK (желтый), SDATA (голубой) и BSYNC (розовый). BSYNC сначала активен. Данные посланы и прочитаны VS1001k по фронту тактового сигнала DCLK. Переданное число, показанное на осциллограмме, — 0b01000101 или 0x45. Используемая тактовая частота — 1 МГц, потому что это максимально возможное значение, которое может предложить используемый микроконтроллер.
На осциллограмме рис. 8. продемонстрирована посылка тестовой команды SDI. Здесь переданы восемь байтов: 0x45 0x78, 0x69, 0x74, 0x0, 0x0, 0x0, 0x0. Эта последовательность тестирует синусоидальный выход VS1001k [1, стр. 35]. Обратите внимание, что задержка между последовательными байтами обусловлена низкой производительностью управляющего микроконтроллера и для самого VS1001k не нужна.
В заключение хочется отметить, что использование VS1001k не ограничивается созданием МР3-плейера. VS1001k может быть также полезен для создания любых бытовых устройств и высокотехнологичных игрушек с функциями воспроизведения речи.
Платы для вывода цифры/аналога (Шляпы 2018)
Качество результат очень сильно зависит от используемой платы вывода. На рынке есть десятки производителей, но уже сформировались лидеры
- Pi2Design 502DAC 100$ — обсуждаем тут
- Allo Digione — обсуждаем тут
- HiFiBerry Pro Digi Пробуем и другие!
Комплект отладки
В комплекте отладки VS1001 KIT, изображенном на рис. 9, для решения этой задачи использован контроллер USB PDIUSB12 фирмы Philips, хотя в отечественных условиях для этого проще использовать микросхемы FT245BM фирмы FTDI или USBN9603 от National Semiconductor. На печатной плате комплекта отладки размещена также ПЛИС XCR3064XL фирмы Xilinx, основная задача которой состоит в генерации сигнала BSYNC — синхронизация байтов для VS1001k. Но эту задачу, как указано в технической документации, может успешно выполнять и управляющий микроконтроллер.
Дополнительно к уже описанным компонентам комплект отладки содержит разъем USB-B для подключения к ПК, разъем для подключения ММС-карты на 8 или 16 Мбайт (куда записываются MP3-файлы), 5 кнопок управления (увеличение-уменьшение громкости, перемотка, пауза), разъем для подключения наушников. Плата может работать как MP3-плеер через USB либо автономно (при этом требуется обеспечение внешнего питания +5… +7 В). К VS1001 KIT прилагается также дискета с программным обеспечением, которое включает в себя полную техническую документацию на микросхему, драйверы под Windows 98/2000 и инструкции по программированию USB-драйвера.
Шаблон будущей программы
Прежде чем писать основные функции, полезно инициализировать дисплей и клавиатуру. Про дисплей я уже говорил выше, а клавиатура четыре на четыре кнопки у меня осталась от макета телефона.
В исходнике ниже — стандартные заголовочные файлы, функции инициализации периферии, функции инициализации дисплея и клавиатуры и в конце вывод строчки Hello world.
Продолжение доступно только участникам
Вариант 1. Присоединись к сообществу «Xakep.ru», чтобы читать все материалы на сайте
Членство в сообществе в течение указанного срока откроет тебе доступ ко ВСЕМ материалам «Хакера», позволит скачивать выпуски в PDF, отключит рекламу на сайте и увеличит личную накопительную скидку! Подробнее
Подготовка к работе
Перед тем, как приступать к действиям, следует продумать, во сколько это может вам обойтись. Если вы в этом деле любитель, не нужно даже начинать, чтобы не испортить магнитолу окончательно. Самым простым способом считается применение FM-модулятора. Данное устройство позволяет апгрейдить магнитолу быстро.
Сейчас реально приобрести любую удобную модель, поскольку большинство из них оборудованы разъемом под флешку. Помимо разъема для USB, имеются слоты SD и microSD. Так, через другой прибор можно будет прослушивать музыку со своей флешки. Конечно, этот вариант считается самым примитивным и не очень эстетичным, поэтому мы рассмотрим другой способ. Он предполагает применение паяльника.
Тренды
Я вам легко назову четыре основных тренда в компьютерном аудио прошлого и этого года:
- использование ARM-плат для создания сетевых источников и сетевых плееров
- запуск большого количества вспомогательных плат для высококачественного вывода цифры или аналогового сигнала с ARM-платы
- появления и развитие специальных дистрибутивов ОС Linux (+плееров), заточенных под «аудиофильское» проигрывание файлов
- Интеграция этих специальных дистрибутивов и сервисов потокового аудио (Spotify, Tidal, Deezer, Qobuz)
Если вы не чувствуете в себе сил, то можно приобрести уже готовое изделие на ARM-платах — Auralic Aries, Audio 359 Player, Sonore μRendu, Bluesound Node 2i.
Приступим!
Зачем подключать USB
Еще с 70-х годов прошлого столетия из автомобилей доносится музыка. Поначалу такая роскошь, как радио в машине, была доступна далеко не всем. Ею похвастать могли лишь представительские марки, например Волги. Промышленность не стояла на месте, и вскоре радиоприемник был оснащен кассетным магнитофоном, а потом стал поддерживать диски и даже флеш-карты.
Автомобилистам, в чьем железном коне нет приемника, отвечающего всем современным требованиям, расстраиваться не стоит. Установка USB в штатную магнитолу легко проводится и не требует особых навыков. Справиться с такой задачей сможет практически каждый.
Интересующий нас вход позволяет слушать музыку с подключенной к аудиотехнике флешки (стандарта 2.0), если в машине магнитола без USB и аукс. Это удобно и востребовано. Не отвлекает водителя от управления, в отличие от ситуации, когда к магнитоле подключен телефон.
Ты водитель автомобиля?! Тогда ты сможешь пройти этот простейший тест и узнать . Перейти к тесту »