Что такого сложного в I2S? Подключаешь провода к нужным контактам и все работает.
Я тоже так думал, но с миникомпьютером Омега2 оказалось не все так просто.
Именно поэтому я решил написать эту статью.
Начнем с того, чего я добился в итоге.
К микрокомпьютеру Omega 2 я подключил микросхему TDA1543 (стерео I2S ЦАП с амплитудным разрешением 16 бит).
Звук хороший, с удовольствием слушаю интернет-радиостанции (должна быть шутка про аудифилов и тёплый ламповый звук).
Однако причину перегрузки звука я так и не выяснил, а лишь научился обходить ее методом костыля.
И мне бы очень хотелось услышать ваши мысли по этому вопросу.
Возможно кто-то не знает, что такое Омега2. Это мини-компьютер под управлением Linux на базе LEDE, который по сути является форком OpenWRT. Процессор MT7688, 64 МБ ОЗУ и 16 МБ флэш-памяти.
В общем, подробнее можно прочитать на Википедия , здесь И здесь .
Также важно отметить, что все действия выполняются на оригинальной прошивке версии 0.2.0. Теперь давайте немного поговорим о боли того, как я к этому пришел.
Для начала всё прозрачно, подключаем все линии I2S TDA'шки и Omega. Это соответственно линия синхронизации CLK, линия синхронизации канала WS, линия данных DATA и земля GND. Плюс добавляем пару резисторов и конденсаторов, но главное это подстроечный резистор для 7 ноги TDA1543. К этому отрезку необходимо применить нулевое смещение; сначала я уснул на этом.
Дело в том, что уникальная для своего времени микросхема TDA1543 работает от однополярного питания.
Ну а звуковой сигнал - это колебания относительно 0 вниз и вверх, поэтому нужно сместить этот ноль в середину диапазона напряжения питания и получить колебания относительно этой точки.
В даташите все описано, но изначально я собрал схему с обычным резистором (с ваших интернет-сайтов) и получил искажения, которые долго не понимал.
Установите переменный резистор и добейтесь смещения нуля при отсутствии сигнала на входе (режим покоя) 1,3-1,5 В (при питании 3,3 В).
В результате получается следующая диаграмма.
Далее следуя шагам из официальный сайт лука Обновляемся до девелоперской версии прошивки, в которой добавлена поддержка I2S (хотел написать меньше чем через год, но нет. прошло).
Обновляем и устанавливаем необходимые пакеты для работы звука:
Переключите GPIO в режим I2S командой:opkg update opkg install alsa-utils mpg123
omega2-ctrl gpiomux set i2s i2s
Давайте скопируем тестовый wav-файл, я использовал классический Suzanne Vega — Tom's Diner. И попробуйте воспроизвести его с помощью aplay:
aplay za_sebya_i_za_sashky.wav
И мы слышим искажения.
Просто очень сильная перегрузка.
Настолько, что может показаться, что вы вернулись в 2007 год. Но в песне есть ударный мотив, так что в этом что-то есть, верно? Пробовал убавить громкость в микшере alsa - безрезультатно, так как драйвер заточен под чип MAX98090, который управляется по I2C и соответственно все настройки просто передаются на I2C, а сами данные I2S не меняются .
Хорошо, давайте откроем даташит на MAX98090. И мы начинаем курить.
Микросхема поддерживает множество форматов входных данных: I2S/LJ/RJ/TDM и способна обрабатывать высокие скорости передачи данных.
Да и сам процессор MT7688 тоже может больше и быстрее TDA. Может быть проблемы с данными в I2S? Пошел постепенно возиться с осциллографом.
16 бит? Да.
Я повесил линию WS на один канал и линию CLK на другой канал.
И убедился в длине импульсов WS - 16 циклов.
Неправильные рабочие частоты? Нет. Все частоты соответствуют рабочим требованиям.
WS – 44100 Гц, CLK – 1411200 Гц.
Формат типа числа в данных? Используется правильный знаковый формат (да, я думал, что нужен беззнаковый).
Я проверял, создавая искусственные синусы и перемещая их вверх-вниз относительно 0 в дерзости и меняя амплитуду.
Качественных изменений нет. I2S вообще есть? вероятно, да.
Во-первых, потому что тогда у меня всё работало (или мне так кажется), а во-вторых, я пробовал проверять осциллографом, хотя без логического анализатора это конечно затруднительно.
Возможно, стоит провести более точный тест и принести сюда свой Beaglebone. Вроде все правильно, и у ребят с лукового форума все работает, но правда на других чипах: MAX98357A и PCM5102. В общем, я отказываюсь от идеи проигрывать wavs и запускаю mpg123 для проигрывания mp3. Включаю его флагом -C и начинаю уменьшать громкость.
И вот я сел.
Когда ставлю уровень громкости в программе mpg123 примерно на 1 процент, то получаю отличный звук.
Микросхема раскачивается на полную амплитуду.
Я запускаю радио с флагом -f 128: mpg123 -f 128 http://us2.internet-radio.com:8443/
И меня приветствуют звуки расслабляющего американского блюза.
Кстати ссылка на радио может не рабочая, я взял отсюда .
Я запускаю пилообразный сигнал и постепенно увеличиваю амплитуду.
В результате я увидел, что искажения - это хаотичные скачки от 0 до напряжения питания и чем выше уровень, тем больше эти скачки.
Мне потребовалось несколько недель, чтобы заставить Омегу заговорить.
Я очень устал и поэтому решил остановиться на этом пункте – это работает! Однако я понимаю, что это невозможно, поэтому буду рад услышать ваши идеи и предложения.
Ну а тем, кто изо всех сил пытается заставить омегу говорить, надеюсь, я вам помог! Спасибо всем! Теги: #linux #Сделай сам или Сделай сам #Электроника для начинающих #аудио #omega2 #omega #i2s #tda1543
-
Кисточка Стоит Хлопот — Аспиранту
19 Oct, 24 -
История Винила В Автомобилях
19 Oct, 24 -
Несколько Простых Вопросов О Javascript
19 Oct, 24 -
Изучайте Haskell Ради... Haskell
19 Oct, 24 -
Взлом Кнопки «Завершить» Expert-Exchange.com
19 Oct, 24