Чего сложного с 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 до напряжения питания и чем выше уровень — тем больше этих перескоков. На то, чтобы заставить говорить Омегу у меня ушло несколько недель. Я очень устал и потому, на этом моменте решил остановиться — работает же!

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

Всем спасибо!

Комментарии (8)


  1. Alexeyslav
    08.06.2018 15:40
    +2

    Очень похоже на то что младший/старший байты в слове местами перепутаны. У вас получается что когда звук укладывается в младшие 8 бит то всё нормально, а на деле эти младшие 8 бит АЦП интерпретируются как старшие и кажется что звучит всё отлично. А когда подаёшь полную громкость, в младшем байте будет нечто похожее на переходы от 0 до 255, что интерпретируется АЦП как то что вы видите на осциллографе. Попробуйте байты потока поменять местами.


    1. walti
      08.06.2018 19:38

      У вас получается что когда звук укладывается в младшие 8 бит то всё нормально, а на деле эти младшие 8 бит АЦП интерпретируются как старшие и кажется что звучит всё отлично.
      У автора преобразователь ток/напряжение на резисторе, который оперт об землю.
      И это у ЦАП, у которого сигнальный ток втекает в землю (в отличие, например от РСМ179х, у которого ток вытекает из аналогового питания).

      Автор не понял зачем в даташите нарисованы треугольнички за микросхемой, чем отличается ЦАП с выходом по току и напряжению, и почему первые должны работать на нулевое сопротивление ( а уж никак не на резистор «2к»).
      И почему положительный вход i/u опирается на этот самый переменный резистор.

      Поэтому судить о том, что происходит с сигналом на выходе (скорее всего он дико искажен) судить невозможно.


    1. andrew_atreides Автор
      08.06.2018 19:42

      Думал над этим. У aplay есть возможность перевернуть байты (LSB и MSB флаги) это не изменяет картину, а даже ухудшает ее.


      1. pwl
        08.06.2018 21:36

        Как уже сказал walti, у вас проблема не в I2S, а в совершенно некорректно сделанной аналоговой части. Операционники на стандартной схеме включения не зря нарисованы.
        Этот ЦАП выдает ток, а не напряжение, о чем однозначно сказано в даташите:
        «The output current of the DAC is a sink current.»
        Резистором, конечно, можно превратить ток в напряжение, но тут вот какая проблема:
        Диапазон выходного напряжения у этого ЦАПа — ±25 mV, а тока — 2.3 mA.
        Что получится когда ЦАП попытается выдать эти 2.3 mA на вашу нагрузку в 2 килоома?
        Примерно в тысячу раз большее напряжение чем допустимо для ЦАПа.
        Так-что даже на 1% громкости вы его перегружаете в 10 раз.


        1. andrew_atreides Автор
          09.06.2018 01:40

          Первоначально собирался вариант именно с ОУ, но потом схема была упрощена после изучения аудио форумов и различных схем сравнение характеристик микросхемы. Я понимаю, что это вариант не лучший, но сделал так в угоду простоте схемы (в конечном устройстве мало места). Проверю, конечно, еще раз, но думаю проблема не в этом, а именно в цифровой части.


  1. igrushkin
    08.06.2018 15:43

    Знакомо. Я даже PCM5102 не сразу завел, там на форуме есть мои стенания.
    Теперь другая проблема: заставить shairport-sync воспроизводить звук через i2s
    звук из интернет-радио выводится нормально


  1. intell2000
    09.06.2018 04:35

    такая аналоговая часть в случае 1543 вполне работоспособна. у тебя косяк с форматами данных, но чтобы этот косяк выловить — нужен двухканальный осциллограф (смотреть соотношение фронтов сигналов на входах 1543)


    1. andrew_atreides Автор
      09.06.2018 04:38

      Пытался выловить, проблема в том, что надо как-то заставить слать Омегу на I2S вывод точно известные значения. Пока я не разобрался как это лучше сделать. Есть другой вариант. Взять логически анализатор, считать несколько байтов с I2S и попробовать построить по данным график и сравнить его с аналоговым выходом.