Чего сложного с 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 (хотел написать не прошло и года, но нет… прошел). Обновляемся и ставим нужные пакеты для работы звука:
Переключаем GPIO в режим I2S командой:
Копируем тестовый wav файл, я по классике использовал Suzanne Vega — Tom's Diner. И пробуем воспроизвести с помощью aplay:
И слышим искажения. Просто очень много жесткого перегруза. Настолько много, что может показаться что вы вернулись в 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:
И меня встречают звуки расслабляющего американского блюза. Кстати, ссылка на радио может быть не рабочая, брал отсюда.
Я завожу пилообразный сигнал и плавно увеличиваю амплитуду. В итоге увидел, что искажения — это хаотичные перескоки от 0 до напряжения питания и чем выше уровень — тем больше этих перескоков. На то, чтобы заставить говорить Омегу у меня ушло несколько недель. Я очень устал и потому, на этом моменте решил остановиться — работает же!
Однако, я понимаю, что так нельзя поэтому я буду рад услышать ваши идеи и предложения. Ну а для тех кто муками пытается заставить омегу говорить, надеюсь я вам помог!
Всем спасибо!
Я тоже так думал, но с миникомпьютером 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 до напряжения питания и чем выше уровень — тем больше этих перескоков. На то, чтобы заставить говорить Омегу у меня ушло несколько недель. Я очень устал и потому, на этом моменте решил остановиться — работает же!
Однако, я понимаю, что так нельзя поэтому я буду рад услышать ваши идеи и предложения. Ну а для тех кто муками пытается заставить омегу говорить, надеюсь я вам помог!
Всем спасибо!
Комментарии (8)
igrushkin
08.06.2018 15:43Знакомо. Я даже PCM5102 не сразу завел, там на форуме есть мои стенания.
Теперь другая проблема: заставить shairport-sync воспроизводить звук через i2s
звук из интернет-радио выводится нормально
intell2000
09.06.2018 04:35такая аналоговая часть в случае 1543 вполне работоспособна. у тебя косяк с форматами данных, но чтобы этот косяк выловить — нужен двухканальный осциллограф (смотреть соотношение фронтов сигналов на входах 1543)
andrew_atreides Автор
09.06.2018 04:38Пытался выловить, проблема в том, что надо как-то заставить слать Омегу на I2S вывод точно известные значения. Пока я не разобрался как это лучше сделать. Есть другой вариант. Взять логически анализатор, считать несколько байтов с I2S и попробовать построить по данным график и сравнить его с аналоговым выходом.
Alexeyslav
Очень похоже на то что младший/старший байты в слове местами перепутаны. У вас получается что когда звук укладывается в младшие 8 бит то всё нормально, а на деле эти младшие 8 бит АЦП интерпретируются как старшие и кажется что звучит всё отлично. А когда подаёшь полную громкость, в младшем байте будет нечто похожее на переходы от 0 до 255, что интерпретируется АЦП как то что вы видите на осциллографе. Попробуйте байты потока поменять местами.
walti
У вас получается что когда звук укладывается в младшие 8 бит то всё нормально, а на деле эти младшие 8 бит АЦП интерпретируются как старшие и кажется что звучит всё отлично.
У автора преобразователь ток/напряжение на резисторе, который оперт об землю.
И это у ЦАП, у которого сигнальный ток втекает в землю (в отличие, например от РСМ179х, у которого ток вытекает из аналогового питания).
Автор не понял зачем в даташите нарисованы треугольнички за микросхемой, чем отличается ЦАП с выходом по току и напряжению, и почему первые должны работать на нулевое сопротивление ( а уж никак не на резистор «2к»).
И почему положительный вход i/u опирается на этот самый переменный резистор.
Поэтому судить о том, что происходит с сигналом на выходе (скорее всего он дико искажен) судить невозможно.
andrew_atreides Автор
Думал над этим. У aplay есть возможность перевернуть байты (LSB и MSB флаги) это не изменяет картину, а даже ухудшает ее.
pwl
Как уже сказал walti, у вас проблема не в I2S, а в совершенно некорректно сделанной аналоговой части. Операционники на стандартной схеме включения не зря нарисованы.
Этот ЦАП выдает ток, а не напряжение, о чем однозначно сказано в даташите:
«The output current of the DAC is a sink current.»
Резистором, конечно, можно превратить ток в напряжение, но тут вот какая проблема:
Диапазон выходного напряжения у этого ЦАПа — ±25 mV, а тока — 2.3 mA.
Что получится когда ЦАП попытается выдать эти 2.3 mA на вашу нагрузку в 2 килоома?
Примерно в тысячу раз большее напряжение чем допустимо для ЦАПа.
Так-что даже на 1% громкости вы его перегружаете в 10 раз.
andrew_atreides Автор
Первоначально собирался вариант именно с ОУ, но потом схема была упрощена после изучения аудио форумов и различных схем сравнение характеристик микросхемы. Я понимаю, что это вариант не лучший, но сделал так в угоду простоте схемы (в конечном устройстве мало места). Проверю, конечно, еще раз, но думаю проблема не в этом, а именно в цифровой части.