I2s что это
Перейти к содержимому

I2s что это

Аудио ЦАП DAC. Поделки начинающего цапостроителя. Часть 14. I2S и тюнинг ЦАПа

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

Камрад, рассмотри датагорские рекомендации

Полезные и проверенные железяки, можно брать

Опробовано в лаборатории редакции или читателями.

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

А так как транспорт у меня это ПК с выводом по 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.

Для тестирования в самый раз. В дальнейшем планировалось использование аудиоконтроллера 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 — три горизонтальных черты.

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

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

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

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

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

Введение в интерфейс I2S

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

Между этими двумя протоколами действительно существует определенная связь. Оба были первоначально разработаны компанией Philips Semiconductors (теперь NXP), и названия обоих начинаются с «I2», потому что они предназначены для связи между микросхемами (англ. аббревиатура «IC»). Однако I2S появился после I2C, и, если I2C является универсальным интерфейсом, I2S предназначен для передачи аудиоданных – «S» в названии означает «sound» (звук).

I2S был создан в 1980-х годах, когда цифра начала свое завоевание рынка потребительских аудиосистем. Заявленная цель создания I2S – облегчение разработки аудиоэлектроники при помощи стандартизированного интерфейса для передачи цифровых данных между АЦП, ЦАП, цифровыми фильтрами, цифровыми сигнальными процессорами и другими типами интегральных микросхем, используемых в аудиосистемах. По сути, это двухканальный протокол, потому что он был разработан для стереофонического звука.

Характеристики I2S

Следующая диаграмма изображает три конфигурации, поддерживаемые I2S.

Рисунок 1 Конфигурации, поддерживаемые интерфейсо I2S. Схема взята из спецификации I2S, впервые опубликованной Philips Semiconductors в 1986 году и обновленной в 1996 году. Рисунок 1 – Конфигурации, поддерживаемые интерфейсо I2S. Схема взята из спецификации I2S, впервые опубликованной Philips Semiconductors в 1986 году и обновленной в 1996 году.

Данные передаются по линии SD, состояние линии WS соответствует аудиоканалу (правый или левый), который передается в данный момент, а линия синхронизации SCK передает тактовый сигнал. Как видно из диаграммы, сигналы WS и SCK могут генерироваться передатчиком, приемником или сторонним контроллером.

Ниже перечислены характерные особенности трех сигналов интерфейса I2S.

Последовательные данные (SD)

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

Выбор слова (WS)

  • Низкий логический уровень на WS указывает, что передаваемое в настоящее время слово является частью потока данных для левого аудиоканала; высокий логический уровень на WS указывает на передачу звука правого канала.
  • Чтобы облегчить обработку данных как на стороне передатчика, так и на стороне приемника, сигнал WS изменяет свое логическое состояние на один период тактового сигнала раньше завершения передачи слова данных:

Тактовый сигнал (SCK)

  • Протокол не определяет максимальную скорость передачи данных.
  • Тактовый сигнал передается непрерывно.

I2C против I2S

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

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

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

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

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

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

Заключение

I2S – эффективный, простой протокол последовательной связи, который отлично подходит для оцифрованного звука. Тем не менее, нет закона о том, что он ограничен только аудиоданными. Несколько лет назад я использовал его для создания прототипа программно определяемой радиосистемы (SDR); I2S предлагал скорость передачи, достаточную для сигналов основной полосы частот, и был удобно встроен в платформу разработки DSP, с которой я работал.

Записки программиста

Учимся передавать звук с использованием протокола I2S

13 августа 2018

I2S (Inter-IC Sound) — это цифровой протокол передачи звука, который довольно часто используется в современной электронике. I2S не имеет ничего общего с I2C кроме похожего названия, поэтому важно эти протоколы не путать. В рамках сего поста мы постараемся разобраться, на что вообще похож I2S, и как с ним работать.

На базе устройств, использующих I2S, существует немало готовых плат, в частности:

  • У Adafruit есть два микрофона — первый и второй; можно купить у той же компании;
  • Еще есть DAC с усилителем MAX98357 для вывода звука на динамик;
  • На Tindie можно купить I2S-микрофон на базе ICS43434;
  • На том же сайте был найден DAC на базе чипа CS4344;

При написании этого поста я использовал PmodI2S производства компании Digilent. Данный модуль построен на базе чипа CS4344 (типичная маркировка «344C 1609», даташит [PDF]). Устройство было приобретено в Чип-и-Дипе, но на момент написания этих строк оно успело куда-то пропасть с сайта магазина. Впрочем, для повторения описанных далее шагов вы можете использовать любой аналогичный модуль. Внешний вид использованного мной модуля:

Модуль PmodI2S на базе чипа CS4344

Типичный I2S-сигнал выглядит в PulseView как-то так:

I2S-сигнал в PulseView

Здесь SCK представляет собой тактовый сигнал. WS (он же LRCLK) отвечает за выбор канала. Через SDA (он же SDIN) передаются сами данные. Сигнала MCLK, строго говоря, нет в спецификации I2S [PDF]. Но на практике многие устройства используют его для синхронизации своих внутренних операций. Обычно сюда идет тактовый сигнал с частотой в 256 раз больше частоты дискретизации звука.

Fun fact! Если хочется извлечь звук из записанного I2S-сигнала, это можно сделать такой командой:

Для экспериментов с модулем я воспользовался отладочной платой Nucleo-F411RE. Микроконтроллер, используемый в этой плате, имеет аппаратную поддержку I2S, которой и было решено воспользоваться. Какие настройки доступны в STM32CubeMX и к каким пинам микроконтроллера следует подключать модуль, вы без труда разберетесь самостоятельно по полной версии проекта. Поговорим лучше непосредственно о коде.

Например, генерация синусоидального сигнала с частотой 100 Гц осуществляется так:

#define PI 3.14159265358979323846
#define TAU (2.0 * PI)

void loop ( ) {
HAL_StatusTypeDef res ;
int16_t signal [ 46876 ] ;
int nsamples = sizeof ( signal ) / sizeof ( signal [ 0 ] ) ;

int i = 0 ;
while ( i < nsamples ) {
double t = ( ( double ) i / 2.0 ) / ( ( double ) nsamples ) ;
signal [ i ] = 32767 * sin ( 100.0 * TAU * t ) ; // left
signal [ i + 1 ] = signal [ i ] ; // right
i += 2 ;
}

while ( 1 ) {
res = HAL_I2S_Transmit ( & hi2s2 , ( uint16_t * ) signal , nsamples ,
HAL_MAX_DELAY ) ;
if ( res != HAL_OK ) {
UART_Printf ( "I2S — ERROR, res = %d! \r \n " , res ) ;
break ;
}
}
}

Интересно, что по каким-то причинам микроконтроллеры STM32 не могут использовать традиционные значения частоты дискретизации, такие, как 44100 Гц или 48000 Гц. В частности, при выборе частоты 48000 Гц реальная частота составит 46876 Гц (на 2.34% меньше). Впрочем, на слух такая разница совершенно незаметна. Все эти различия между желаемой и реальной частотой отображаются прямо в STM32CubeMX.

Проверяем звук, переданный по I2S, с помощью осциллографа

Но это еще не все. Если вы попытаетесь, например, просто взять и проиграть WAV-файл с SD-карты «в лоб», то у вас ничего не получится. Звук будет периодически обрываться и слушать такое будет совершенно невозможно. Решение заключается в том, чтобы использовать прерывания и двойную буфферизацию. Другими словами, параллельно с проигрыванием одного отрывка файла должен читаться следующий отрывок. Таким образом, когда проигрывание текущего отрывка завершится, следующий отрывок будет уже готов, и не придется тратить время на его чтение с SD-карты (что и является источником обрывов в звуке).

volatile bool end_of_file_reached = false ;
volatile bool read_next_chunk = false ;
volatile uint16_t * signal_play_buff = NULL ;
volatile uint16_t * signal_read_buff = NULL ;
volatile uint16_t signal_buff1 [ 4096 ] ;
volatile uint16_t signal_buff2 [ 4096 ] ;

void HAL_I2S_TxCpltCallback ( I2S_HandleTypeDef * hi2s ) {
if ( end_of_file_reached )
return ;

volatile uint16_t * temp = signal_play_buff ;
signal_play_buff = signal_read_buff ;
signal_read_buff = temp ;

int nsamples = sizeof ( signal_buff1 ) / sizeof ( signal_buff1 [ 0 ] ) ;
HAL_I2S_Transmit_IT ( & hi2s2 , ( uint16_t * ) signal_play_buff , nsamples ) ;
read_next_chunk = true ;
}

int playWavFile ( const char * fname ) {
UART_Printf ( "Openning %s. \r \n " , fname ) ;
FIL file ;
FRESULT res = f_open ( & file , fname , FA_READ ) ;
if ( res != FR_OK ) {
UART_Printf ( "f_open() failed, res = %d \r \n " , res ) ;
return — 1 ;
}

UART_Printf ( "File opened, reading. \r \n " ) ;

unsigned int bytesRead ;
uint8_t header [ 44 ] ;
res = f_read ( & file , header , sizeof ( header ) , & bytesRead ) ;
if ( res != FR_OK ) {
UART_Printf ( "f_read() failed, res = %d \r \n " , res ) ;
f_close ( & file ) ;
return — 2 ;
}

if ( memcmp ( ( const char * ) header , "RIFF" , 4 ) != 0 ) {
UART_Printf ( "Wrong WAV signature at offset 0: "
"0x%02X 0x%02X 0x%02X 0x%02X \r \n " ,
header [ 0 ] , header [ 1 ] , header [ 2 ] , header [ 3 ] ) ;
f_close ( & file ) ;
return — 3 ;
}

if ( memcmp ( ( const char * ) header + 8 , "WAVEfmt " , 8 ) != 0 ) {
UART_Printf ( "Wrong WAV signature at offset 8! \r \n " ) ;
f_close ( & file ) ;
return — 4 ;
}
if ( memcmp ( ( const char * ) header + 36 , "data" , 4 ) != 0 ) {
UART_Printf ( "Wrong WAV signature at offset 36! \r \n " ) ;
f_close ( & file ) ;
return — 5 ;
}

uint32_t fileSize = 8 + ( header [ 4 ] | ( header [ 5 ] << 8 ) |
( header [ 6 ] << 16 ) | ( header [ 7 ] << 24 ) ) ;
uint32_t headerSizeLeft = header [ 16 ] | ( header [ 17 ] << 8 ) |
( header [ 18 ] << 16 ) | ( header [ 19 ] << 24 ) ;
uint16_t compression = header [ 20 ] | ( header [ 21 ] << 8 ) ;
uint16_t channelsNum = header [ 22 ] | ( header [ 23 ] << 8 ) ;
uint32_t sampleRate = header [ 24 ] | ( header [ 25 ] << 8 ) |
( header [ 26 ] << 16 ) | ( header [ 27 ] << 24 ) ;
uint32_t bytesPerSecond = header [ 28 ] | ( header [ 29 ] << 8 ) |
( header [ 30 ] << 16 ) | ( header [ 31 ] << 24 ) ;
uint16_t bytesPerSample = header [ 32 ] | ( header [ 33 ] << 8 ) ;
uint16_t bitsPerSamplePerChannel = header [ 34 ] | ( header [ 35 ] << 8 ) ;
uint32_t dataSize = header [ 40 ] | ( header [ 41 ] << 8 ) |
( header [ 42 ] << 16 ) | ( header [ 43 ] << 24 ) ;

UART_Printf (
"— WAV header — \r \n "
"File size: %lu \r \n "
"Header size left: %lu \r \n "
"Compression (1 = no compression): %d \r \n "
"Channels num: %d \r \n "
"Sample rate: %ld \r \n "
"Bytes per second: %ld \r \n "
"Bytes per sample: %d \r \n "
"Bits per sample per channel: %d \r \n "
"Data size: %ld \r \n "
"—————— \r \n " ,
fileSize , headerSizeLeft , compression , channelsNum ,
sampleRate , bytesPerSecond , bytesPerSample ,
bitsPerSamplePerChannel , dataSize ) ;

if ( headerSizeLeft != 16 ) {
UART_Printf ( "Wrong `headerSizeLeft` value, 16 expected \r \n " ) ;
f_close ( & file ) ;
return — 6 ;
}

if ( compression != 1 ) {
UART_Printf ( "Wrong `compression` value, 1 expected \r \n " ) ;
f_close ( & file ) ;
return — 7 ;
}

if ( channelsNum != 2 ) {
UART_Printf ( "Wrong `channelsNum` value, 2 expected \r \n " ) ;
f_close ( & file ) ;
return — 8 ;
}

if ( ( sampleRate != 44100 ) || ( bytesPerSample != 4 ) ||
( bitsPerSamplePerChannel != 16 ) || ( bytesPerSecond != 44100 * 2 * 2 )
|| ( dataSize < sizeof ( signal_buff1 ) + sizeof ( signal_buff2 ) ) ) {
UART_Printf ( "Wrong file format, 16 bit file with sample "
"rate 44100 expected \r \n " ) ;
f_close ( & file ) ;
return — 9 ;
}

res = f_read ( & file , ( uint8_t * ) signal_buff1 , sizeof ( signal_buff1 ) ,
& bytesRead ) ;
if ( res != FR_OK ) {
UART_Printf ( "f_read() failed, res = %d \r \n " , res ) ;
f_close ( & file ) ;
return — 10 ;
}

res = f_read ( & file , ( uint8_t * ) signal_buff2 , sizeof ( signal_buff2 ) ,
& bytesRead ) ;
if ( res != FR_OK ) {
UART_Printf ( "f_read() failed, res = %d \r \n " , res ) ;
f_close ( & file ) ;
return — 11 ;
}

read_next_chunk = false ;
end_of_file_reached = false ;
signal_play_buff = signal_buff1 ;
signal_read_buff = signal_buff2 ;

HAL_StatusTypeDef hal_res ;
int nsamples = sizeof ( signal_buff1 ) / sizeof ( signal_buff1 [ 0 ] ) ;
hal_res = HAL_I2S_Transmit_IT ( & hi2s2 , ( uint16_t * ) signal_buff1 ,
nsamples ) ;
if ( hal_res != HAL_OK ) {
UART_Printf ( "I2S — HAL_I2S_Transmit failed, "
"hal_res = %d! \r \n " , hal_res ) ;
f_close ( & file ) ;
return — 12 ;
}

while ( dataSize >= sizeof ( signal_buff1 ) ) {
if ( ! read_next_chunk ) {
continue ;
}

res = f_read ( & file , ( uint8_t * ) signal_read_buff ,
sizeof ( signal_buff1 ) , & bytesRead ) ;
if ( res != FR_OK ) {
UART_Printf ( "f_read() failed, res = %d \r \n " , res ) ;
f_close ( & file ) ;
return — 13 ;
}

dataSize -= sizeof ( signal_buff1 ) ;
}

res = f_close ( & file ) ;
if ( res != FR_OK ) {
UART_Printf ( "f_close() failed, res = %d \r \n " , res ) ;
return — 14 ;
}

Передача данных по I2S осуществляется асинхронно при помощи процедуры HAL_I2S_Transmit_IT . По завершении передачи данных вызывается коллбэк HAL_I2S_TxCpltCallback . Если это известно, то остальная часть кода становится тривиальной.

Напомню, что с форматом WAV-файлов и библиотекой FatFs мы ранее познакомились в рамках статей Парсинг заголовка и проигрывание WAV-файла на Scala и Работа с FAT32 и exFAT с помощью библиотеки FatFs соответственно.

Вот и все, о чем я хотел сегодня рассказать. Исходники к этому посту вы найдете на GitHub. Если у вас есть вопросы или дополнения, используйте комментарии, не стесняйтесь!

Вы можете прислать свой комментарий мне на почту, или воспользоваться комментариями в Telegram-группе.

Что такое I2S?

ЦАП I2S DSD256-PCM

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

Что такое I2S?

I2S (Inter-IC Sound) — это конструкция последовательной шины (тракта) для цифровых аудиоустройств и технологий, таких как проигрыватели компакт-дисков ( CD ), цифровые звуковые процессоры и звук цифрового телевидения ( DTV ). Конструкция I2S обрабатывает аудиоданные отдельно от тактовых сигналов. Разделяя данные и тактовые сигналы, ошибки, связанные со временем, что устраняет необходимость в устройствах, предотвращающих джиттер. Конструкция шины I2S состоит из трех последовательных шинных линий: линия с двумя каналами данных мультиплексирования с временным разделением ( TDM ), линия выбора и линия синхронизации.

I²S ( Inter-IC Sound ), — стандарт интерфейса последовательной электрической шины, используемой для соединения цифровых аудиоустройств. Он используется для передачи аудиоданных ИКМ между интегральными схемами в электронном устройстве. Шина I²S разделяет тактовые сигналы и сигналы последовательных данных, в результате чего получатели становятся проще, чем те, которые требуются для асинхронных систем связи, которым необходимо восстановить тактовые импульсы из потока данных. Альтернативно I²S пишется как I2S или IIS. Несмотря на похожее название, I²S не имеет отношения к двунаправленной шине I²C (IIC).

ЦАП I2S DSD256-PCM

ЦАП I2S DSD256-PCM

Немного истории I2S

Этот стандарт был введен в 1986 году компанией Philips Semiconductor (в настоящее время NXP Semiconductors ) и в последний раз пересматривался 5 июня 1996 года

Протокол I²S описывает один конкретный тип цифровой аудиосвязи PCM с определенными параметрами, указанными в спецификации Philips.

Состоит он как минимум из трех линий:

  • Официально «Word Select (WS)». Обычно называется «левый-правый тактовый генератор (LRCLK)» или «кадровая синхронизация (FS)».
  • 0 = левый канал, 1 = правый канал
  • По крайней мере, одна мультиплексированная линия данных
  • Официально «последовательные данные (SD)», но их можно назвать SDATA, SDIN, SDOUT, DACDAT, ADCDAT и т. д.

И2С также может включать следующие строки:

  • Основные часы (обычно 256 x LRCLK)
  • Это не является частью стандарта I2S но обычно используется для синхронизации внутренней работы аналого-цифровых преобразователей.
  • Мультиплексированная строка данных для загрузки

Битовая тактовая частота пульсирует один раз для каждого дискретного бита данных в строках данных. Тактовая частота битов является воспроизведением частоты дискретизации , количества бит на канал и количества каналов. Так, например, CD Audio с частотой дискретизации 44,1 кГц, с точностью 16 бит и двумя каналами (стерео) имеет тактовую частоту:

44,1 кГц × 16 × 2 = 1,4112 МГц

Часы выбора слова позволяют устройству узнать, отправляется ли в данный момент канал 0 или канал 1, поскольку I²S позволяет отправлять два канала по одной и той же линии данных. Это сигнал с коэффициентом заполнения 50%, частота которого совпадает с частотой дискретизации. Для стерео материала спецификация I²S гласит, что левый звук передается в низком цикле тактового сигнала выбора слова, а правый канал передается в верхнем цикле. Обычно он синхронизируется с задним фронтом последовательных часов, так как данные фиксируются на переднем фронте.

I2S ЦАП

I2S ЦАП

Данные подписываются , сначала кодируются как два дополнения с MSB ( старший значащий бит ). Это позволяет произвольному числу битов в кадре без согласования между передатчиком и приемником.

В качестве аудио-соединения I2S

В звуковом оборудовании I²S иногда используется как внешнее соединение между проигрывателем компакт-дисков и отдельным блоком ЦАП, в отличие от чисто внутреннего соединения внутри одного блока проигрывателя. Это может сформировать альтернативу обычно используемым стандартам AES / EBU или Toslink или S / PDIF.

Соединение I²S не предназначалось для использования через кабели, и большинство интегральных микросхем не будет иметь правильного сопротивления для коаксиальных кабелей. Поскольку ошибка адаптации импеданса, связанная с разной длиной линии, может привести к разнице в задержке распространения между тактовой линией и строкой данных, это может привести к проблеме синхронизации между SCK, WS и сигналами данных, в основном на высокой частоте дискретизации и битрейте. Поскольку I²S не имеет никакого механизма обнаружения ошибок, это может вызвать важную ошибку декодирования.

ЦАП 4398+2706

ЦАП 4398+2706

Для этого применения нет стандартного соединительного кабеля. Некоторые производители предоставляют просто три разъема BNC, разъем 8P8C («RJ45») или разъем DE-9 . Другие, такие как Audio Alchemy (ныне несуществующая), использовали разъемы DIN. А вот PS Audio, Musica Pristina и Wyred4Sound используют разъем HDMI. Голландский производитель Van Medevoort внедрил Q-link в своем оборудовании, передает i2s через 4 разъема RCA (Data, MCK, LRCK, BCK).

ЭТО ДОСТАТОЧНО ПРОСТОЙ ИНТЕРФЕЙС

Не путайте его с другим протоколом Philips Semiconductor: I2C. Протокол Inter-Integrated Circuit имеет инициалы IIC, и двойная буква была сокращена, чтобы придумать номенклатуру «в квадрате», которую мы полюбили с I2C. Возрожденный в 1982 году, этот предшествующий I2S на четыре года, что объясняет несколько странную аббревиатуру «Inter-Integrated Circuit Sound».

i2s_dac

i2s_dac

Протокол застрял, потому что он очень не удобен для работы с последовательных данных, связанных с высококачественным цифровым звуком. Это так не удобно, что вы, вероятно, слышали о том, что он используется для других целей, кроме аудио. Но сначала, что на самом деле делает 2S?

Цифровой источник звука обычно создает два слова данных, одно для левого канала и одно для правого, один раз для каждого интервала выборки. Например, источник аудио CD с частотой дискретизации 44,1 кГц, который будет передавать два 16-битных слова 44 100 раз каждую секунду. На одной последовательной линии это колоссальные 1 411 200 бит в секунду (44100 x 16 x 2).

ЦАП Audiophile V2 на 9038 + клон FM711

ЦАП Audiophile V2 на 9038 + клон FM711

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

I2S решает обе эти проблемы с помощью дополнительных строк, предоставляя строку выбора слова (также иногда называемую тактовыми импульсами L / R) для выбора левого или правого отсчетов, а также битовую линию тактового сигнала для синхронизации всего. Вот и все, что есть в I 2 S: строка данных, строка синхронизации слов и строка синхронизации битов.

ЦАП Audio-gd Master 7 обзор

Спецификация была формализована Philips в документе 1986 года, благодаря которому подразделение полупроводников компании стало NXP, но, к сожалению, исчезло с веб-сайта NXP. К счастью, у Wayback Machine она есть , поэтому она все еще доступна. Читая документ, становится очевидным, что даже в 1980-х годах это был не сложный интерфейс для работы, и он даже дает базовые диаграммы для передатчика и приемника. Не исключено, что при наличии некоторых микросхем TTL и цепочки резисторов будет возможно создать ЦАП I2S из первых принципов на вашем стенде, хотя это и не очень высокопроизводительный пример.

Итак, у вас есть I2S

Все, что вам нужно знать о межкомпонентных аудиоразъемах, в четырех удобных параграфах.

I2S для цифрового звука — только начало. Это простая и несложная спецификация, которую легко реализовать, и в то же время легко злоупотреблять. Например, он не определяет верхний предел тактовой частоты. Естественно, его потенциал как очень быстрого последовательного вывода побудил аппаратных хакеров использовать его для других целей. Мы видели, что он используется как радиопередатчик AM , видеовыход NTSC , VGA-выход и даже карта Ethernet . Как же они это делают !

ЦАП NFB28

Ответ заключается в модуляции плотности импульсов , форме аналого-цифрового преобразования, в которой число логических 1 битов в данный период времени зависит от уровня аналогового сигнала. Это необработанный вывод АЦП с дельта-сигмой , и он имеет удобное свойство, заключающееся в том, что при наличии только потока данных PDM этап цифроаналогового преобразования может быть выполнен только с помощью простого фильтра нижних частот. Если вы увеличите битрейт на интерфейсе I 2 S до максимума, а затем передадите ему слова, которые образуют поток данных PDM, вы можете добавить фильтр нижних частот, чтобы создать АЦП с максимальной пропускной способностью, равной половине его бита. темп.

ESP32 I2S намного сложнее, чем базовый стандарт.

В приведенном выше списке примеров проектов, использующих I2S, есть дополнение, которое касается некоторых из тех, которые мы не представили. ESP32 имеет модуль I 2 S, и благодаря ему были реализованы некоторые впечатляющие проекты, такие как этот полноцветный генератор VGA . Однако, рискуя спором, эти проекты не используют I2S в самом строгом смысле. Страница 303 технического справочника ESP32 проливает некоторый свет на это, показывая, что периферийное устройство I 2 S в части Espressif является многофункциональным. Наряду с обработкой звука I2S, как описано выше, также обрабатывает интерфейсы для камер и ЖК-дисплеев, как если бы вы представляли разъемы камеры и ЖК-дисплея на Raspberry Pi, направленные на один и тот же кусок кремния.

Raspberry Pi 4 + клон дартЗил

Возможно, эта номенклатура имеет корни в ESP8266, имеющем периферийное устройство I 2 S на чипе, и общее периферийное устройство в более позднем устройстве.

Raspberry Pi 4 + клон Зил

Поскольку большинство интерфейсов I 2 S могут работать с тактовой частотой в несколько мегагерц, их пропускная способность может быть на удивление высокой. Это то же самое, что и принцип, заложенный в любой программно-определяемый радиопередатчик: одним махом и с очень небольшим количеством дополнительного оборудования вы перенесли задачу создания произвольных спектров в диапазоне МГц с аппаратного на программное обеспечение.

Raspberry Pi 4 и флешка

Даже самые современные микроконтроллеры обладают достаточной вычислительной мощностью для выполнения этой задачи, что делает относительно простыми некоторые приложения для I 2 S, которые были бы за гранью воображения тех инженеров Philips 1980-х годов. Однако, I2S к которой можно было только подключить аудио ЦАП, не останавливает аудиофилов от подключения, и этот интерфейс становится намного полезнее, а возможности безграничны.

ЦАП Audio-gd Master 7 купить

Я надеюсь, что эта статья «Что такое I2S?» немного помогла. Пожалуйста, оставляйте комментарии ниже, чтобы я мог вернуться к вам. Не бойтесь меня и добавляйтесь в ВК, Ютуб

Если вы хотите узнать больше об этой теме, и быть в курсе, пожалуйста, подпишитесь на наш сайт.

Не забывайте сохранять нас в закладках! (CTRL+SHiFT+D) Подписывайтесь, комментируйте, делитесь в соц.сетях. Желаю удачи в поиске своего звука!

На нашем сайте Звукомания есть полезная информация по звуку и видео, которая пригодится для каждого, причем на каждый день, мы обновляем сайт «Звукомания» постоянно и стараемся искать и писать только отличную, проверенную и нужную информацию.

Вам нужен хороший фонокорректор, новый ламповый усилитель или отличный ЦАП, плеер, наушники, АС или другую звуковую технику, (усилитель, ресивер и т.д.) то пишите в ВК, помогу выгодно и с гарантией приобрести хорошую звуковую технику…

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

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