Тема: USB I2S input
Показать сообщение отдельно
Старый 05.07.2013, 01:00   #1
zyxel812
Старший Пользователь
 
Регистрация: 18.02.2013
Возраст: 41
Город: Санкт-Петербург
Регион: 78, 98
Машина: e46
Сообщений: 163
zyxel812 is a name known to allzyxel812 is a name known to allzyxel812 is a name known to allzyxel812 is a name known to allzyxel812 is a name known to allzyxel812 is a name known to all
По умолчанию USB I2S input

И так, очередная разработка, с которой мне пришлось изрядно повозиться.
Устройство для подключения к компьютеру аудиоисточников с цифровым I2S выходом.
Стандарт I2S предназначен в первую очередь для передачи цифровых аудио данных между микросхемами в пределах одного устройства. Данный стандарт часто используется в различных микросхемах ЦАП и АЦП, предназначенных именно для работы со звуком.
Думаю, что на данном форуме это мало кому нужно. Однако, именно подготовка к постройке pccar сподвигла меня его разработать, так как мне будет необходим ввод звука в компьютер с цифрового радио минуя всевозможные аналоговые тракты. Поэтому, пусть будет она тут, может кому и пригодится.

Подробней о i2s читайте в Википедии, представлю тут только диаграмму, чтоб понимать с чем работаем:

Задача №1: дешифровать сигнал в микроконтроллере. С помощью микроконтроллера avr из серии Xmega, мне удалось это сделать без помощи дополнительных микросхем (не считая одной ячейки стандартной логики "И"), используя два интерфейса SPI, которые в обилии наличиствуют в указанном микроконтроллере. Однако, есть еще задача №2, решить которую на xmega пока не удалось, об этом позже. В итоге, был выбран микроконтроллер из серии mega (не путать с xmega), а именно ATmega32u4. Только вот с i2s потоком он в одиночку не справился, поэтому ему на помощь пришла микросхема EPM3032A -это микросхема программируемой логики стоимостью 100руб, одна из самых маленьких в своем роде. Ее задача превратить последовательные данные шины i2s в параллельные и сообщить микроконтроллеру о получении первых 16 бит в каждом канале. Микросхема запрограммирована на выдачу данных по 8 бит, один из входов переключает между старшими и младшими восемью битами. Так сложно (имею ввиду переключение) сделано намеренно, чтобы микроконтроллер прерывался на прием данных только один раз за сэмпл каждого канала. Прошивку для данной микросхемы делал не я, а один мой хороший товарищ, поэтому подробней как в ней что рассказать не могу.

Схема получилась такой:

На схеме два варианта: А и Б.
В варианте А, напряжение питания микроконтроллера 3.3в. При таком напряжении по даташиту контроллер может стабильно работать только на 8МГц. Этого ему еле еле хватает, чтобы принять и передать аудиопоток частотой дискретизации 32кГц.
В варианте Б, напряжение питания микроконтроллера примерно 4.6в. Напряжение намеренно занижено диодом, чтобы микроконтроллер мог стабильно принимать 3.3-вольтовые сигналы с EPM3032. Сама же EPM3032 толерантна к 5-ти вольтовым входным сигналам. При таком напряжении контроллер может работать на частоте 16МГц, этого должно хватить для обработки аудиопотока с частотой дискретизации вплоть до 48кГц. Однако, на максимальной частоте я не проверял, у меня не нашлось такого источника.

Задача №2: Передать полученные данные в компьютер. Для этого используется библиотека LUFA. За основу взят AudioInput пример из состава библиотеки. Используется Audio Class Device 1.0, т.е. микроконтроллер прикидывается usb звуковой картой. Точнее звуковой картой с одним цифровым входом. Дело в том, что данная библиотека пока что не в полной мере поддерживает относительно новые микроконтроллеры серии xmega, на них мне не хватило пропускной способности передать в компьютер два канала одновременно из-за того, что в библиотеке пока не реализован функционал двойного буфера (так называемый pin-pong режим). Поэтому использую обычную mega с дополнительной микросхемой.

Печатная плата может выглядеть так:



В Винде, начиная с ХРюши, драйвера не требуются. После подключения, устройство будет видно так:


Итого, на данный момент характеристики следующие:
Частота дискретизации входного сигнала: 32кГц точно, в варианте Б в теории до 48кГц.
Разрешение входного сигнала: до 16 бит (на вход подавать можно и больше, лишние просто игнорируются)

Устройство автоматически не определяет частоту входного сигнала, поэтому в винде в свойствах устройства на вкладке "дополнительно" нужно указать частоту, соответствующую входной.

Вот записи, сделанные с помощью данного устройства: Запись1, Запись2, Запись3.
В качестве аудиоисточника используется цифровой выход вот этого радиомодуля.

Архив с прошивкой и исходниками прилагаю. Условие использования - рассказать здесь о всех модификациях, если таковые будут, а так же ссылка на данную тему в описании вашего проекта.
Вложения
Тип файла: rar I2Sinput.rar (1.07 Мб, 1202 просмотров)

Последний раз редактировалось zyxel812; 05.07.2013 в 10:53. Причина: Исправил некоторые опечатки
zyxel812 вне форума   Ответить с цитированием