Как я гонял I2S по обычному патчкорду Fast Ethernet CAT5


На столе 74AC573, DIR9001, 74AC245, IL715 и др.
На этапе проектирования очередного ЦАП я задался вполне стандартным вопросом. Что можно улучшить в архитектуре, структуре, элементной базе или компоновке, чтоб не получить очередной клон уже имеющегося устройства? Причем сделать доработку или усовершенствование, не меняющее в корне рабочую систему и не требующее удорожания на порядки. Из всех возможных на данный момент вариантов единственно возможным оказался I2S вход от внешнего источника, в дополнение к уже имеющемуся коаксиальному и оптическому SPDIF входам. — Ну I2S так I2S!- сказал я, и поставил курсор в поисковую строку Google. Накрывшее меня разочарование было неожиданным. Как так? При массе восторгов от способа передачи информации по этой чудесной шине, о приросте качества звучания, и прочих положительных моментах не оказалось ни одного законченного схемного решения уровня «корпус источника» — «корпус ЦАП».

 

А так как транспорт у меня это ПК с выводом по USB, то именно решение «корпус» — «корпус» самый оптимальный вариант. Да и на рынке все чаще стали появляться вполне высококачественные решения USB-транспортов с выходом I2S TTL. В общем нужно продумать линк, позволяющий гнать I2S от транспорта до ЦАП в TTL формате, да еще и с гальваноразвязкой. Вообще для подобных целей технически грамотно было бы использовать шину LVDS, но кроме явных плюсов в виде большого расстояния передачи, симметричных линий, имеем и свои минусы — дороговизна и труднодоставаемость микросхем приемопередатчиков, необходимость использования специальных разъемов, отсутствие гальваноразвязки.

Мне же нужно расстояние на более полуметра, но вот как это организовать? Сразу же в голове нарисовалась картина: куча экранированных проводов, позолоченный разъем…. Ах да! Разъем! Поиск как обычно дал «массу вариантов». Кто-то использовал DB-9 — разъем от СОМ порта ПК. Но моя «личная неприязнь» к нему как к разъему не позволила остановиться на этом решении.

А что применяют иностранцы в своих вариантах USB-транспортов? Недолгий поиск и есть ответ — RG45. Восьмиконтактный пластиковый обжимной разъем, применяющийся в сетевой инфраструктуре стандарта Fast Ethernet (100BASE-T)! Четыре изолированных витых пары! — Шикарно!- сказал я. — Ага!- сказал поисковик — А распиновка? — Давай, попробуй… «I2S pinout», «RG45 I2S» и еще тридцать два варианта… — Нету? — Да ты искать не умеешь! И правда не умею. Так как из всего найденного «фабричного» интересными было два варианта — Northstar DAC Model 192 MKII и Terralink X, решено было остановиться на них.

 

У всего остального найденного было что-то не совсем вменяемое, включая фантомное питание +5В. Ну и информации о соединительном кабеле, применяемом с этими устройствами тоже не смог найти. Ну в общем то раскладка Terralink меня устраивала, так как окзалось, что она попарно совпадала с распиновкой стандартного патчкорда.

Ну хоть где-то что-то будет по стандарту! Хотя здесь я сделаю отступление. Следование стандарту на этот момент уже не было моей целью, не на продажу же, а вот применение максимального количества стандартных компонентов было желательно. Итак, что мы имеем?


Распиновку.


Патчкорд. И дикое желание что-то сваять. Осталось продумать устройство вывода и устройство ввода.

 

В качестве устройства вывода был изготовлен на коленке формирователь USB-I2S с использованием РСМ2707. Как буфер-конвертер TTL утровней – 74АС573.


В железе получилось довольно компактно. Так как проверить работоспособность получившейся карты без аудиовыхода сложно, добавил светодиод на линию DATA. Есть поток — светимся, нажал паузу — не светимся.


Для тестирования в самый раз. В дальнейшем планировалось использование аудиоконтроллера USB-I2S TAS1020, ну и что-нибудь возможно посерьезнее.

Теперь необходимо продумать приемную сторону. Тут немного сложнее. Во-первых нужно внести в схему ЦАП систему коммутации входов между ресивером SPDIF и цифровым фильтром. Здесь можно воспользоваться мультиплексором четырехканальным, типа 74хх157/257.

А во вторых… А как быть во-вторых? Ведь самое проблемное место — гальваноразвязка. Это дома заземление, отдельная нейтраль. А в любом другом месте ушатать ЦАП или источник не хотелось бы. Раз не применяем LVDS, то RS485 можно попробовать. Как приемная часть SPDIF потока. По частоте MCLK вроде проходит, лишь бы трансы позволили…

Ну четырех штук ADM1485 в наличии не было, зато в хламе нашлась АМ26С32. То же самое, только четыре канала на корпус — не я один видимо такой ерундой занимаюсь… Но на проверку, такая схема оказалась неработоспособна. Или мои кривые руки что-то не так сделали…

Мало того, что мастерклок не корректно пролазил через трансформаторную развязку, чего я и боялся, так еще и на шине данных в паузах был посторонний шум, приводящий к сбоям в работе ЦАП, а то и полном зависании ЦФ. В чем проблема? Может витая пара не позволяет гонять такие данные без коррекции ошибок? Несимметричная линия? Попробовать экранированный провод? Но не каждый кабель возможно запихать в RG45.

А ведь уже сделана плата, установлен мультиплексор, ЦАП работает без проблем в режиме SPDIF от DIR9001. Бросать на половине пути ? В какой то момент мой взгляд упал на кабель SATA, что лежал на столе. Кусачки в руки и в руках у меня плоский четырехжильный экранированный провод! Ну конечно там система 2+2, но уже что-то! Заделать его в разъем RG45 большого труда не составило, разве что домотать изоленту на концы, чтоб надежно прижать замками коннекторов.

 


Вполне сносно получилось. Но все равно не работает! Ладно, выкидываю приемную часть, выпаиваю очередной разъем со старой сетевухи, включаю напрямую, без гальваноразвязки. Ага! ПоетЬ! Но есть проблема. Так как уровни на выходе с размахом в 5В, а питание мультиплексора 3,3В, то сигналы «пролазят» через закрытый вход при работе от DIR9001. Шум и потрескивание не сильно приятно.

Ладно, надо попробовать конвертер. Из хлама извлекаю 74АС245, которая по даташиту справляется с уровнями в 5В при питании 3,3В и горожу на коленке такую схему:


В железе получилось еще проще.


И снизу


Завелось все с полпинка! Работает и с SATA проводом, и на стандартном патчкорде! Ни помех, ни выпадений сигнала! Но отсутствует вторая часть задания — гальваническая развязка. Печально, но придется заказывать digital isolator.

Вообще, этих цифровых развязок есть много типов. Различаются они, в основном, числом каналов, принципом работы, направлением передачи – приема, пропускной способностью и производителем. Интересные девайсы. Раздельное питание, работа с 3,3В и 5В. Мне нужно четыре канала на прием. Из найденного в сети подходят: ADuM1400, IL715, ISO7240.

Заказал IL715, по даташиту она как раз под AD/DA заточена, да и доступна относительно. А заодно и DC/DC конвертер на 5В. Ведь питать входную часть надо от источника, что не предусмотрено конструктивом, либо от самого приемника, но при этом развязать гальванически его от входа. Пока все это ехало, накидал схему развязки…


И внес изменения в плату самого ЦАП. Добавил мультиплексор и сделал отключение питания приемника DIR9001 при работе от I2S. А также доработал индикацию режимов.

 

Теперь, при работе от SPDIF индикатор показывает текущую частоту дискретизации, а при работе от I2S — три горизонтальных черты.


Такой веселый «переходничок» пришлось изготовить, потому что не было в наличии DIP версии мультиплексора, а плата была уже собрана. А теперь сборка и наладка самого интерфейса.


Вид снизу.


Включение и запуск никаких проблем не принесли, все было ожидаемо и проверено заранее. Работа четкая, без сбоев.

В идеале, развязку надо было бы установить на основную плату, например вместо приемника DIR9001 или рядом, но для этого пришлось бы полностью переделать трассировку всей платы, и размер бы сильно изменился. Поэтому метод «бутерброд» показался самым оптимальным. Да и провода соединительные покороче будут.


Сзади переключателей добавилось. Помимо моего стандартного переключения «оптика/коаксиал», теперь еще и «spdif/i2s». Но на ходу редко нужно что-то переключать, хотя все переключается и работает без сбоев, так что выносить переключатели вперед нет смысла. Вид с лица. Конечно можно было нарисовать на дисплее I2S, или вставить LCD с контроллером, графику там или что еще. Но вроде как девайс не на продажу, а мне и так нормально все видно и понятно.


Сверху коробочка — USB/I2S аудиоконтроллер на базе TAS1020.

Ну и традиционное «как оно?».

 

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

Но самое главное — это опыт и возможность дополнительной модернизации. Тем более запланирован нормальный источник, с возможностью внешнего тактирования. А тогда можно и пересинхронизацию и ЦАП в режиме «мастер». Так что может кому-то это будет интресно.

Файлы здесь: ▼ Файловый сервис недоступен. Зарегистрируйтесь или авторизуйтесь на сайте.

А я думаю, продолжение последует.

Алексей

 

 

3Библиотека «Wire» для работы с IIC

Для облегчения обмена данными с устройствами по шине I2C для Arduino написана стандартная библиотека Wire. Она имеет следующие функции:

Функция Назначение
begin(address) инициализация библиотеки и подключение к шине I2C; если не указан адрес, то присоединённое устройство считается ведущим; используется 7-битная адресация;
requestFrom() используется ведущим устройством для запроса определённого количества байтов от ведомого;
beginTransmission(address) начало передачи данных к ведомому устройству по определённому адресу;
endTransmission() прекращение передачи данных ведомому;
write() запись данных от ведомого в ответ на запрос;
available() возвращает количество байт информации, доступных для приёма от ведомого;
read() чтение байта, переданного от ведомого ведущему или от ведущего ведомому;
onReceive() указывает на функцию, которая должна быть вызвана, когда ведомое устройство получит передачу от ведущего;
onRequest() указывает на функцию, которая должна быть вызвана, когда ведущее устройство получит передачу от ведомого.

5Управление устройством по шине IIC

Рассмотрим диаграммы информационного обмена с цифровым потенциометром AD5171, представленные в техническом описании:


Рассмотрим диаграммы чтения и записи цифрового потенциометра AD5171

 

Нас тут интересует диаграмма записи данных в регистр RDAC. Этот регистр используется для управления сопротивлением потенциометра.

Откроем из примеров библиотеки «Wire» скетч: Файл Образцы Wire digital_potentiometer. Загрузим его в память Arduino.

#include // подключаем библиотеку «Wire» byte val = 0; // значение для передачи потенциометру
void setup() {
Wire.begin(); // подключаемся к шине I2C как мастер
}void loop() {
Wire.beginTransmission(44); // начинаем обмен с устройством с I2C адресом «44» (0x2C) Wire.write(byte(0x00)); // посылаем инструкцию записи в регистр RDAC Wire.write(val); // задаём положение 64-позиционного потенциометра Wire.endTransmission(); // завершаем I2C передачу val++; // инкрементируем val на 1 if (val == 63) { // по достижении максимума потенциометра val = 0; // сбрасываем val } delay(500);
}
После включения вы видите, как яркость светодиода циклически нарастает, а потом гаснет. При этом мы управляем потенциометром с помощью Arduino по шине I2C.

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

Форматы [ править | править код ]

Существуют два формата передачи данных по звуковому интерфейсу — I²S и DSP (Digital Signal Processing, цифровая обработка сигналов), в которых идет двухсторонний обмен данными, регулируемый активным устройством (контроллером). В формате I²S фреймовая синхронизация задает смену канала. Низкий уровень кадровой синхронизации задает левый канал, высокий — правый. Тактовые сигналы не изменяются (не прерываются) в отличие от приборного интерфейса. Тактовый сигнал подается непрерывно, что упрощает алгоритм.

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

Согласно заявленной спецификации, стандарт I²S обладает следующими параметрами

  • Программно конфигурируемое разрешение 16/32 бит;
  • Стабильность тактирования: не менее 0,5 %
  • Возможность работать в режимах ведущего и ведомого;
  • Поддержка частот семплирования от 8 до 192 кГц;
  • Два независимых приемопередатчика. [1]

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

 

Параллельные и последовательные интерфейсы

Допустим нам нужно переслать 1 байт (8 бит) информации. Как это сделать? Можно выделить под каждый бит по одной ножке МК (линии), тогда для передачи потребуется 8 ножек, плюс одна, которая будет говорить принимающей стороне что передача закончена и нужно считать входной сигнал. Такой интерфейс называется параллельным (англ. parallel): группа битов передаётся одновременно за один квант времени. К таким интерфейсам относится PCI (32 линии) и её можно встретить в LCD знакогенерирующих индикаторах (например WINSATR).

Можно поступить по другому и передавать данные по одной линии, кодируя, например, 1 как высокий уровень сигнала (3,3 В), а 0 как низкий (0 В). В таком случае потребует всего одна ножка МК для передачи и одна что бы сообщать когда этот сигнал считывать. Такие интерфейсы называют последовательными (англ. serial): N битов передаётся по одному за N-квантов времени. Примером последовательного интерфейса — USART.

Параллельный интерфейс, как не сложно догадаться, быстрее в N-раз, однако требует в N-раз больше линий. В микроконтроллерах чаще всего присутствуют только последовательные интерфейсы (периферийные блоки, которые делают всё автоматически), к ним относятся SPI, I2C, I2S, CAN, USART и USB. Некоторые из них мы рассмотрим подробнее в этом курсе.

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

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

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

Организация контроллера [ править | править код ]

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

Первая часть — сам контроллер со входами. Для работы ему нужен генератор тактовой частоты, который выдает события канала прямого доступа. Прием-передача звука может осуществляться не микропроцессором, а каналом прямого доступа, специальным процессором для ввода-вывода данных. Этот канал прямого доступа нуждается в событиях начала считывания данных регистров приема или передачи данных в регистры передаточные.

Вторая часть — регистры интерфейса, предусмотрены следующие их типы:

 

  1. Регистры флагов прерывания;
  2. Регистр разрешения прерываний от того или иного источника (по числу флагов прерывания или по числу разрядов регистра разрешения прерываний)
  3. Регистр управления, в котором задаются режимы работы контроллера;
  4. Регистр генератора частоты выборки, в котором можно задавать тактовый сигнал и его частоту для битовой синхронизации — если данные принимаются, то регистр записывает эти данные и те могут быть подсчитаны программно;
  5. Два регистра приема данных;
  6. Регистры передачи данных по каналам, в которых могут быть два 32-х битовых регистра, передаваемых последовательно.

Сигналы прерывания говорят о том, какие события возникли внутри контроллера и нуждаются в обработке. Существуют две группы прерываний: первая есть прерывания, связанные с приемом и передачей данных и событий, вторая — связанные с обработкой и генерацией тактовых сигналов. Она вырабатывает сигналы для канала прямого доступа и контроллера прерываний.

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

Обработчик прерываний сперва производит чтение регистра флагов прерываний для их последующего сброса. Далее читает или записывает данных в регистры данных I²S, если не используется канал прямого доступа. После этого происходит возврат из прерывания.

Конфигурационные опции задают для синхронизатора полярность битовой и кадровой синхронизации. Эти данные помогают синхронизатору выбрать режим работы звукового интерфейса.

Приём данных [ править | править код ]

Последовательный приёмник четко фиксирует уровни сигналов, которые тактируются синхронизатором. Далее эти данные побитно поступают по линии принимаемых данных в регистр сдвига, который синхронизирует данные от синхронизатора. После того, как регистр сдвига запомнится, он переписывается в буфер регистра приёма. Размер разрядности регистра сдвига задается длиной слова. После того, как буфер регистра регистрирует принятые данные, может произойти расширение знака. Так как заведомо используется формат с фиксированной запятой, надо расширить знак до 32-х разрядов, получив 12 разрядов данных. Старший разряд полученных данных распространяется во все старшие разряды регистра, чтобы было правильное число, представленное в дробном формате.

Дифференциальные интерфейсы

USB является дифференциальным последовательным интерфейсом. При этом он довольно требователен к стабильности частоты и именно по этой причине в нашем устройстве не реализована на физическом уровне возможность подключения часов к компьютеру; требуется внешний высокочастотный кварцевый резонатор.

Дифференциальным он называется потому, что сигнал передаётся сразу по двум линиям, причём если на одной линии выставлена 1, то на второй должен быть выставлен 0 и наоборот.

Опять же вопрос, зачем два провода, когда можно использовать один? UART вроде хорошо работал на одной линии… На самом деле нет. UART хорошо работает на низких скоростях. При повышении частоты передачи начинают влиять паразитные ёмкости и индуктивности и сигнал просто теряется. Дифф-пара позволяет понизить напряжение, уменьшить электро-магнитное излучение, уменьшить потребление и повысить устойчивость приёма сигнала.

 

Выбирать дифференциальную пару, конечно, нужно не только в тех случаях, где требуется высокая скорость передачи, но и там, где «шумная» среда. В электронике автомобиля используется другой интерфейс, под названием CAN. Скорость передачи данных там не высокая, за-то она обеспечивает хороший приём в условиях жёсткой эксплуатации.

К слову, проводной интернет (Ethernet) так же построен на дифференциальной паре.

4Подключение I2C устройствак Arduino

Давайте посмотрим, как работать с шиной I2C с помощью Arduino.

Сначала соберём схему, как на рисунке. Будем управлять яркостью светодиода, используя цифровой 64-позиционный потенциометр AD5171 (см. техническое описание), который подключается к шине I2C. Адрес, по которому мы будем обращаться к потенциометру – 0x2c (44 в десятичной системе).


Подключение цифрового потенциометра к Arduino по шине I2C

 

От admin

Добавить комментарий

Ваш адрес email не будет опубликован. Обязательные поля помечены *