Чего сложного с I2S скажете вы? Подключаешься проводками к нужным пинам и все работает.
Я тоже так думал, но с миникомпьютером Omega2 оказалось не все так просто. Поэтому я решил написать эту статью.
Начнем с того, чего я добился в итоге. Я подключил микросхему TDA1543 (стерео I2S ЦАП с разрешением по амплитуде 16 бит) к микрокомпьютеру Omega 2. Звук хороший, я с удовольствием слушаю интернет радиостанции (тут должна быть шутка про аудифилию и теплый ламповый звук). Однако я так и не разобрался в причине перегруза аудио, а лишь научился его обходить костыльным методом. И я очень хотел бы услышать ваши идеи по этому вопросу.
Возможно кто-то не вкурсе что такое Omega2. Это миникомпьютер на котором стоит Linux основанный на LEDE, который по сути является ответвлением от OpenWRT. Процессор MT7688, 64 МБ RAM и 16 МБ Flash. В общем, подробней можно почитать на википедии, тут и тут.
Так же важно отметить, все действия выполняются на оригинальной прошивке версии 0.2.0
А теперь, давайте поговорим немного о боли том как я к этому пришел.
Для начала все прозрачно, соединяем все линии I2S ТДА'шки и Омеги. Это соотвественно линия тактового сигнала CLK, линия синхронизации каналов WS, линия данных DATA и земля GND. Плюс добавляем парочку резисторов и конденсаторов, но главное — это подстроечный резистор на 7 ножку TDA1543. На эту ножку надо подавать смещение нуля, на этом я вначале засыпался. Дело в том, что микросхема TDA1543, уникальная для своего времени, работает от однополярного питания. Ну а звуковой сигнал это колебания относительно 0 вниз и вверх, поэтому надо сместить этот ноль в середину диапазона питающего напряжения и получить колебания относительно этой точки. В даташите все расписано, но первоначально я собирал схему с обычным резистором (из этих ваших интернетов) и получил искажения, которые долго не понимал. Ставите переменный резистор и добиваетесь смещения нуля при отсутствии сигнала на входе (режим покоя) 1,3-1,5 В (при питании 3.3 В). Получается следующая схема.
Далее следуя действиям из официального сайта onion обновляемся до develop версии прошивки, в которую добавили поддержку I2S (хотел написать не прошло и года, но нет… прошел). Обновляемся и ставим нужные пакеты для работы звука:
opkg update
opkg install alsa-utils mpg123
Переключаем GPIO в режим I2S командой:
omega2-ctrl gpiomux set i2s i2s
Копируем тестовый wav файл, я по классике использовал Suzanne Vega — Tom's Diner. И пробуем воспроизвести с помощью aplay:
aplay za_sebya_i_za_sashky.wav
И слышим искажения. Просто очень много жесткого перегруза. Настолько много, что может показаться что вы вернулись в 2007. Но в нем прослеживается ударный мотив песни, значит что-то там работает, верно?
Я попробовал убавить громкость в alsa mixer — без толку, ибо драйвер заточен под микросхему MAX98090, которая управляется по I2C и соотвественно все настройки просто шлются в I2C, а сами данные I2S не изменяются.
Хорошо, открываем даташит на MAX98090. И начинаем раскуривать. Микросхема поддерживает очень много форматов входных данных: I2S/LJ/RJ/TDM и большую битность он может переваривать. Да и сам процессор MT7688 тоже может больше и быстрее чем ТДАшка. Может проблемы с данными в I2S?
Я пошел постепенно ковыряться осциллографом.
Битность 16 бит? Да. Я повесил на один канал линию WS на другой канал линию CLK. И убедился в длине импульсов WS — 16 тактов.
Неправильные частоты работы? Нет. Частоты все соотвествуют рабочим. WS — 44100 Гц, CLK — 1411200 Гц.
Формат типа чисел в данных? Используется верный знаковый формат (да, я подумал что нужен unsigned). Проверял созданием искусственных синусов и передвижением их вверх и вниз относительно 0 в audacity и изменял амплитуду. Качественных изменений нет.
Там вообще I2S? скорее всего да. Во-первых потому, что потом у меня все заработало (ну или мне так кажется), а во-вторых я пытался проверять осциллографом, хотя без логического анализатора это конечно сложно. Возможно стоит провести более точный тест и привлечь сюда свой Beaglebone.
Вроде все верно, и у ребят с форума onion все работает, но правда на других микросхемах: MAX98357A и PCM5102. В общем, я бросаю затею воспроизводить wav'ки и завожу mpg123 для воспроизведения мп3шек. Врубаю с флагом -C и начинаю уменьшать громкость. И вот тут я присел. При выставлении в программе mpg123 уровня громкости около 1 процента я получаю отличный звук. Микросхема раскачивается на полную амплитуду. Запускаю радио с флагом -f 128:
mpg123 -f 128 http://us2.internet-radio.com:8443/
И меня встречают звуки расслабляющего американского блюза. Кстати, ссылка на радио может быть не рабочая, брал отсюда.
Я завожу пилообразный сигнал и плавно увеличиваю амплитуду. В итоге увидел, что искажения — это хаотичные перескоки от 0 до напряжения питания и чем выше уровень — тем больше этих перескоков. На то, чтобы заставить говорить Омегу у меня ушло несколько недель. Я очень устал и потому, на этом моменте решил остановиться — работает же!
Однако, я понимаю, что так нельзя поэтому я буду рад услышать ваши идеи и предложения. Ну а для тех кто муками пытается заставить омегу говорить, надеюсь я вам помог!
Всем спасибо!
Автор: andrew_atreides