Pull to refresh

Как заставить говорить Omega 2 или сказание об I2S

Reading time3 min
Views9.9K
Чего сложного с I2S скажете вы? Подключаешься проводками к нужным пинам и все работает.

Omega2 миникомпьютер Я тоже так думал, но с миникомпьютером 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 В). Получается следующая схема.

Схема подключения TDA1543 к Omega2

Далее следуя действиям из официального сайта 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/

И меня встречают звуки расслабляющего американского блюза. Кстати, ссылка на радио может быть не рабочая, брал отсюда.

image Я завожу пилообразный сигнал и плавно увеличиваю амплитуду. В итоге увидел, что искажения — это хаотичные перескоки от 0 до напряжения питания и чем выше уровень — тем больше этих перескоков. На то, чтобы заставить говорить Омегу у меня ушло несколько недель. Я очень устал и потому, на этом моменте решил остановиться — работает же!

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

Всем спасибо!
Tags:
Hubs:
+10
Comments21

Articles