Новый интерфейс MIPI I3C работает быстрее, лучше и имеет обратную совместимость с обновленным протоколом I2C

Если вы хотите сделать интернет-приемник, то самый простой вариант — взять Raspberry Pi, подключить к ней ЦАП (цифро-аналоговый преобразователь, на английском DAC) и нравящуюся вам акустику с усилителем. Ну и поставить то приложение, которое вам нравится (volumio, rune audio, max2play etc). Управлять им вы будете со своего телефона, т.е. на самом интернет-приемнике у вас не будет никаких элементов управления и его можно, например, спрятать за фальш-потолок.

ЦАП нужен потому, что из разъема для наушников у Raspberry Pi качество звука ниже любой критики, тут речь не об аудиофилии, а просто чтобы уши не болели.

Альтернативы I2S DAC

Вместо I2S DAC можно использовать любой HDMI-Video/audio преобразователь (ищется на aliexpress по строке “hdmi rca”. Это коробочка, куда втыкается на вход HDMI и на выходе разъемы RCA “тюльпаны” — желтый видео и белый/красный аудио). Вместе с нужным для него HDMI кабелем будет стоить примерно как и описываемые ниже I2S DAC, так что тут скорее дело вкуса, что использовать.

Конечно, с точки зрения программы это совершенно иной способ вывода звука (не управление ЦАП по I2S интерфейсу, а вывод звука на HDMI), но для вас это просто переключатель в веб-интерфейсе volumio.

I2C против I2S

Если вы знакомы с протоколом I2C, то, возможно, уже поняли, что I2C и I2S намного менее похожи, чем можно предположить по их названиям.

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

7476979104b89b57ed1d988e9d03159e2732bc1f
Рисунок 3 – Что может пойти не так при связи по I2C

I2S, напротив, предназначен для эффективной передачи определенного типа цифровых данных. Скорость передачи более важна, поскольку последовательная передача в реальном времени двухканального звука с высоким разрешением требует гораздо большей пропускной способности, чем задачи связи, которые часто выполняются с помощью I2C (или UART).

Характер передачи по I2S «точка-точка» устраняет необходимость в подтягивающих резисторах, как I2C, а использование третьего сигнала для синхронизации на уровне слов позволяет нам обойтись без усложнений протокола, которые помогают I2C поддерживать организацию передачи данных по двухпроводной шине.

I2S больше похож на SPI, чем на I2C. Фактически, реализация SPI, предназначенная для однонаправленной передачи данных, использует, по сути, ту же конфигурацию: одна линия для тактового сигнала, одна линия для данных, и третья линия для синхронизации на уровне слов.

Сраненение PCM5102 или PCM5122 — что лучше

HiFiBerry ранних моделей (DAC) построены ровно на той же микросхеме, что и платы с aliexpress (PCM5102). Новые HiFiBerry (DAC+) — на PCM5122 которая в основном отличается наличием аппаратной регулировки громкости. Если вы регулируете громкость на усилители (и это самый правильный вариант с точки зрения качества звука), то вам эта возможность просто не нужна. При желании регулировать через интерфейс, например, volumio, вы можете включить software volume control — теоретически это снижает качество, но на практике вряд ли вы это заметите.

Вывод на RCA разъемы Вывод на разъем для наушников

Китайцы на них пишут, что это Raspberry Pi HAT-платы, но это не совсем правда. Они подключаются к HAT разъему raspberry pi, но их нельзя просто вставить в него, как HiFiBerry.

В принципе, для подключения паяльник не обязателен, если речь о первом варианте платы и новых raspberry pi (не zero, на которой разъем расширения не распаян) — тогда можно соединить штырьки разъемов с помощью контактных проводов. Найти такие провода можно на aliexpress по строке “wires female to female dupont” — как правило, они цветные, на концах разъемчики (вам нужен вариант female — female).

Raspberry Pi A/B

На самых-самых ранних Raspberry Pi нужные для ЦАП контакты не выведены ни на какой разъем, но вообще есть на плате, и в интернете вы можете найти соответствующие схему. Вряд ли у вас такая модель, поэтому ниже я о них не пишу.

Если у вас чуть более свежие Raspbery Pi первой модели, но до “+” варианта, то нужные для ЦАП контакты находятся на 8-контактном разъеме P5, размещенном пониже основного 26-контактного разъема расширения P1.

Обычно P5 не распаян. Можете посмотреть видео, как его распаивать на сайте HiFiBerry.

Подробнее о P5 можно прочитать Raspberry Pi P5 Header.

Обратите внимание, что разъем подразумевается к установке с обратной стороны платы (хотя в видео про HiFiBerry его паяют с той же стороны, что и основной разъем расширения). Поэтому четные-нечетные контакты в P5 с противоположной стороны от того, как в основном разъеме P1. Проверить себя, можно померив напряжение — на контакте P5-1 должно быть 5В, на контакте P5-2 3.3В, оба последних контакта P5, P5-7 и P5-8 — земля.

Описание интерфейса I2C

Способ подключения

В интерфейсе используются два провода, это линия тактирования SCL, и линия передачи данных SDA, которые вместе образуют шину данных. Устройства, подключенные к шине подразделяются на ведущего и ведомого. Ведущий инициализирует процесс передачи данных и выдает тактовые импульсы на линию SCL, ведомый принимает команды /данные, а также выдает данные по запросу ведущего. Линии SDA и SCL двунаправленные, устройства подключаемые к шине должны иметь выводы перенастраиваемые на вход и выход. Причем тип выхода должен быть с открытым коллектором или открытым стоком, в связи с чем, обе линии SDA и SCL через резисторы подтягиваются к положительному полюсу источника питания. На следующей картинке приведена схема подключения интерфейса I2C:

Читайте также:  Ламповый усилитель на 2,8Вт по схеме Лофтин-Уайт от Анатолия Манакова

Подключение интерфейса I2C
В случае использования микроконтроллера, для установки лог. 1 на линии, достаточно перенастроить порт микроконтроллера на вход, при этом резистор “подтянет” линию к высокому логическому уровню, подача высокого логического уровня с порта микроконтроллера на линию не допускается. Для установки лог. 0 на линии, порт перенастраивается на выход, в выходную защелку заранее записывается значение 0, при этом линия “прижимается” к низкому логическому уровню.

Адресация

В интерфейсе предусмотрена программная адресация устройств подключенных к шине, наиболее распространена длина адреса в 7 бит, теоретически это позволяет подключать на шину до 127 устройств, но часть адресов по спецификации зарезервированы и не могут использоваться разработчиками. Каждое устройство имеет свой уникальный адрес, который заложен производителем и указан в технической документации. Адрес устройства может быть фиксированным, или с возможностью аппаратной настройки, в этом случае устройство имеет дополнительные входы, в зависимости от уровня напряжения на входах (высокое или низкое), можно получить различные адреса. Обычно количество входов варьируется от 1-го до 3-х, которые задают значения определенных битов 7-битного адреса. Аппаратная настройка адреса предусмотрена для возможности подключения нескольких однотипных устройств на одну шину.

Также интерфейс предусматривает более редкую 10-битную адресацию, под которую зарезервирован 7-битный адрес 11110XX (XX-зависят от значения адреса), в этом случае сначала предается зарезервированный адрес, в котором два последних бита представляют собой старшие биты 10-битного адреса, затем передаются младшие 8 бит адреса. При использовании данной адресации на шину можно подключать более 1000 устройств.

Условия “Старт” и “Стоп”

Каждый сеанс передачи данных начинается со специального условия, называемого “Старт”. В исходном состоянии, когда шина свободна, обе линии SDA и SCL подтянуты к высокому логическому уровню, условие “Старт” подразумевает переключение линии SDA с высокого логического уровня на низкий, в то время когда на линии SCL установлен высокий уровень.

Аналогично, сеанс передачи данных завершается специальным условием “Стоп”, это переключение линии SDA с низкого логического уровня на высокий, при высоком уровне на линии SCL. Данные условия генерирует ведущий (микроконтроллер).

Исходя из условий “Старт” и “Стоп”, во время передачи данных линия SDA может переключаться только при низком уровне на линии SCL, то есть установка новых данных на линии SDA возможна только после спада уровня на SCL. В течение импульса тактирования (высокий уровень на SCL), состояние линии SDA не должно меняться, в это время выполняется считывание данных на SDA.

Формат передачи данных

Данные по интерфейсу передаются побайтно, старшим битом вперед, за каждым переданным байтом (8 бит) следует бит подтверждения, устройство (ведущий или ведомый) принявшее байт данных, устанавливает низкий уровень на линии SDA на следующем тактовом импульсе SCL, тем самым подтверждая получение байта. В это время передающее устройство должно опрашивать линию SDA, ожидая ответ об успешном получении байта. Ниже на картинке представлена диаграмма передачи данных по шине I2C:

диаграмма передачи I2C
Сначала передается байт с 7-битным адресом ведомого, значение 8-го бита (R/W) определяет направление передачи данных, нулевое значение соответствует записи данных, то есть передача от ведущего к ведомому. Если бит направления равен 1, то выполняется чтение данных из ведомого.

Ведомый сравнивает переданный адрес со своим и при совпадении откликается, устанавливая низкий уровень на линии SDA (бит подтверждения). Ведущий, получив подтверждение, начинает передавать байты с данными, или принимает их, в зависимости от направления передачи. На следующей картинке более подробно представлены различные варианты передачи данных по шине I2C:

i2c-peredacha-dannih
После передачи адреса ведомого, передается адрес регистра, над которым будут производиться операции чтения/записи. Каждое устройство обладает своим набором внутренних регистров, назначение которых указано в технической документации.

Запись одного байта состоит из следующей последовательности: условие “Старт” – адрес ведомого (бит R/W сброшен) – адрес внутреннего регистра ведомого – данные (1 байт) – условие “Стоп”. Запись нескольких байтов практически ничем не отличается, после отправки первого байта данных, передаются остальные байты, сеанс заканчивается условием “Стоп”. При этом данные записываются в регистры последовательно, начиная с заданного адреса, обычно ведомый выполняет автоматический инкремент адреса внутренних регистров.

Для чтения одного байта данных, необходимо сначала передать адрес ведомого и адрес требуемого регистра, при этом бит направления должен быть сброшен на запись, после чего повторно передается условие “Старт”, затем снова адрес ведомого, в этот раз с установленным битом направления на чтение. Далее выполняется прием байта данных от ведомого, для окончания сеанса передачи ведущий не выдает подтверждения, то есть на линии SDA остается высокий уровень на время бита подтверждения, далее следует условие “Стоп”. Чтение нескольких байтов выглядит аналогично, ведущий выдает подтверждение после каждого принятого байта, за исключением последнего байта. Как и в случае записи, ведомый выполняет автоматический инкремент адреса, начиная с заданного.

Читайте также:  Практическое занятие «Исследование усилителя на полевом транзисторе»

Во время сеанса передачи данных ведомый может принудительно удерживать на линии SCL низкий уровень, например, если ему требуется время на обработку данных. Ведущий “отпуская” линию SCL должен проверить переход от низкого логического уровня к высокому, если этого не произошло, то необходимо ожидать перехода. Таким образом, ведущий не имеет абсолютного права на управление линией SCL.

Интерфейс также предусматривает режим конкуренции, когда на шине присутствуют несколько ведущих, я не стану рассматривать этот режим, так как он редко применяется. Для предотвращения конфликтов в таких случаях используется функция арбитража и синхронизации линии тактирования SCL.

Скорость передачи данных

По спецификации интерфейс поддерживает три скоростных режима передачи:

  1. Самый распространенный до 100 Кбит/сек, частота тактирования линии SCL до 100 кГц, длительность высокого и низкого уровней не менее 5 мкс.
  2. Скоростной режим до 400 Кбит/сек, частота тактирования до 400 кГц.
  3. Высокоскоростной режим до 3,4 Мбит/сек, частота тактирования до 3,4 МГц.

Стандартный режим до 100 Кбит/сек поддерживают все устройства, возможность функционирования на больших скоростях необходимо уточнять в технической документации на устройство.

Как подключить I2S DAC к Raspberry Pi

Первый вариант ЦАП:

DAC Pi A/B Pi A+/B+, Pi2, Pi3, PiZ PCM5102
Vcc (+5v) P5-1 J8-2
+3.3v (not used, just to check youself) P5-2 J8-1
BCK P5-3 J8-12 Audio data bit clock input
LRCK(LCK) P5-4 J8-35 Audio data word clock input
DATA(DIN) P5-6 J8-40 Audio data input
Gnd P5-7 J8-39

В описании ЦАП китаец пишет, что неверно обозначены BCK и DATA, но, наверно, это относится к ранним модификациям платы — на моей крайний разъем обозначен BCK, и так его и надо подключать.

Второй вариант ЦАП:

К первому варианту добавляются контакты:

DAC Pi A/B Pi A+/B+, Pi2, Pi3, PiZ PCM5102
GND P1-6 J8-6
FLT (gnd) P1-14 J8-14 Filter select : Normal latency (Low) / Low latency (High)
DMP (gnd) P5-8 J8-20 ? De-emphasis control for 44.1kHz sampling rate(1): Off (Low) / On (High)
SCL P1-5 J8-5 ? System clock input
FMT (gnd) P1-18 J8-18 Audio format selection : I2S (Low) / Left justified (High)
XMT (3.3v) P1-1 J8-1

Подробно разъемы для интересующихся расписаны на вики: RPi Low-level peripherals.

PCM5102 datasheet

Никто особо не возражает, что разрешение 16*44 морально устаревает и безумно хочется чего-нибудь припарить. Или отпарить. Что одно и то же. Мой товарищ любезно переслал мне ссылку на статью «Без передискретизации и фильтрации» автора под инициалами ADV – рекомендую прочесть: https://lynx-audio.h1.ru/state/dac/andron_dac.htm Я получил огромное удовольствие от грамотного изложения, скурпулезности и одновременно легкости с которой решены многие схемотехнические моменты. Тут же всплыла в памяти статья Андрея Маркитанова «Изобилие звука» (автора и изготовителя известных в Москве и Таганроге DAC-ов «Маркан»). Тематика обоих опусов очень схожа и захотелось вникнуть «глубже, что бы видеть ширше». Подогрело письмо зарубежного товарища, который здорово интересовался как подключить DAC к шине I2S, имеющуюся у него на проигрывателе компакт –дисков. Как говорил известный персонаж мультфильма «..это ж-ж-ж-ж – неспроста…» Для начала заглянем в библию под названием «Справочное руководство по звуковой схемотехнике» Пауля Шкритека, где без труда можно обнаружить следующее определение: шина I2S (Inter -IC signal bus) фирм Philips/Valvo предназначена для обмена цифровыми данными между микросхемами внутри одного элемента блока системы например ЦАП, АЦП цифровых фильтров и т.д. Это последовательная трехлинейная шина. Одна линия служит для предачи сигналов дыух каналов с временным уплотнением «data», SD (по-нашему информационная, как вариант), вторая — для предачи тактовых сигналов SCK (пусть будет синхронизация или тактовый генератор, если не возражаете) третья — селекционная «»word select», WS (похоже, что обозначения претерпели изменения и теперь привычная аббревиатура BCK, суть я надеюсь не поменялась). И далее говорится что есть селектирующая линия для привязки каналов «левый — правый». С классиком не поспоришь. Со Шкритеком расстанемся, как ни жаль, и дальше пытаемся разобраться сами. Современная система передачи данных внутри устройства предполагает все-таки 4-х проводную шину, в которой сигнал левого и правого каналов выделен в отдельный (LRCK). И работает просто: 0-кадру присваивается статус левого канала, 1 — соответственно правого. Вариантов 4-х проводки есть множество, поскольку Внутри 32 битового кадра места предостаточно, например: 16 bit, MSB-first, right-justified — длина слова 16 бит, младший разряд первый, с привязкой к правой стороне кадра; 24 bit, MSB-first, right-justified — длина слова 24 бит, привязка к правой стороне кадра; 24 bit, MSB-first, left-justified -то же самое с привязкой к левой стороне кадра; 24 bit, MSB-first, I2S — а это и есть наш старый знакомый! И что он из себя представляет? Да тоже самое, только в силу своей трехпроводности (ведь отдельнго сигнала «левый-правый» он не имеет), ему в начале кадра оставляется место для служебнго бита, который может нести ту же инфо: 0-левый канал, 1-правый. Единственное, появляется необходимость предупредить об этом собственно DAC( ЦАП), что бы тот правильно разобрался что ему подсовывают. Казалось бы, что принципиальных изменений в структуре сигнала с привязкой не должно происходить, ан -нет. Получаю письма, что I2S звучит совсем по-другому ( в смысле несравненно лучше по отношению к другим привязкам) причем практически с угрозами, когда начинаю робко возражать из-за непонимания возникновения улучшений. Ну да и Бог с ним.

struktura-seansa-peredachi-dannyh-po-i2c

data_b

address_b

full_b

Оцените статью
Добавить комментарий