Как подключить i2s к компьютеру

Обновлено: 06.07.2024

Растущая коллекция общепринятых электротехнических аббревиатур временами может быть немного ошеломляющей; и я не удивлюсь, если вы несколько раз видели термин «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, с которой я работал.

Имеется контроллер STM32F205 (корпус 64 пин). У этого контроллера есть две шины I2S. Контроллер будет декодировать mp3 с внешнего USB или SD носителя. Далее звук надо подать на ЦАП PCM1742. Как осуществить подключение? Какая то каша у меня в голове, никак не соображу.

Cижу конфигурирую выводы в STM32 MicroXplorer. Один из выходов I2S в режиме Master_with_clock:

I2S_CLK
I2S_WD
I2S_SD
I2S_MCLK - зачем это тактирование?

На PCM1742 так же присутствует вход для этого тактирования. Обязательно ли использовать I2S_MCLK с 6-й ноги порта С или же можно подать такт с ноги какого нибудь таймера? Спрашиваю потому что сейчас развожу плату и I2S перекрывается с ногами SDIO.

_________________
Нельзя всё знать, достаточно понимать.

Добавлено: Не посмотрел Вашу ссылку, у вас там уже и так переведенный аппноут на шину i2s. Что непонятного там написано?) Нарисовано даже))) на схеме только три сигнала.
А также выдержка из даташита на ваш ЦАП :

AUDIO SERIAL INTERFACE
The audio serial interface for the PCM1742 comprises a 3-wire synchronous serial port. It includes LRCK (pin 3), BCK (pin 1), and DATA (pin 2). BCK is the serial audio bit clock, which is used to clock the serial data present on DATA into the audio interface serial shift register. Serial data is clocked into the PCM1742 on the rising edge of BCK. LRCK is the serial audio left/right word clock used to latch serial data into the serial audio interface internal registers. Both LRCK and BCK must be synchronous to the system clock. Ideally, it is recommended that LRCK and BCK be derived from the system clock input, SCK. LRCK is operated at the sampling frequency, fS. BCK can be operated at 32 (16-bit, right-justified only), 48, or 64 times the sampling frequency. Internal operation of the PCM1742 is synchronized with LRCK. Accordingly, internal operation of the device is suspended when the sampling rate clock of LRCK is changed or SCK and/or BCK is interrupted at least for three bit-clock cycles. If SCK, BCK, and LRCK are provided continuously after this suspended state, the internal operation is resynchronized automatically within a period of less than 3/fS. During this resynchronization period and for a 3/fS time thereafter, the analog output is forced to the bipolar zero level, or VCC/2. External resetting is not required..

JLCPCB, всего $2 за прототип печатной платы! Цвет - любой!

Я просто не пойму что на этот пин I2S_MCLK подавать. Дочитал datasheet на PCM1742. Выходит что МК сам будет подавать нужное тактирование на этот пин в зависимости от частоты сэмплирования и дискретизации. Так что ли??

_________________
Нельзя всё знать, достаточно понимать.

Сборка печатных плат от $30 + БЕСПЛАТНАЯ доставка по всему миру + трафарет

насколько я помню, это выход для тактирования ЦАПа, подключается к SCK. Можете его не использовать, но тогда нужно будет где-то искать другой источник тактовых импульсов. А каким образом МК выдает их, и от чего зависит частота я подсказать не могу.

Приглашаем 30 ноября всех желающих посетить вебинар о литиевых источниках тока Fanso (EVE). Вы узнаете об особенностях использования литиевых источников питания и о том, как на них влияют режим работы и условия эксплуатации. Мы расскажем, какие параметры важно учитывать при выборе литиевого ХИТ, рассмотрим «подводные камни», с которыми можно столкнуться при неправильном выборе, разберем, как правильно проводить тесты, чтобы убедиться в надежности конечного решения. Вы сможете задать вопросы представителям производителя, которые будут участвовать в вебинаре.

Master clock may be output to drive an external audio component. Ratio is fixed at
256 × FS (where FS is the audio sampling frequency)

Т.е. на выводе I2S_MCLK присутствует частота сэмплирования умноженная на 256. Если посчитать, то всё сходится с таблицей приведенной в даташите на PCM1742.

.
44100 Гц * 256 = 11289600 Гц = 11.2896 МГц
48000 Гц * 256 = 12288000 Гц = 12.288 Мгц
.

По I2S теперь понятно. Меня MicroXplorer с панталыку сбил. В даташите написано:

Up to 3 SPIs (30 Mbit/s), 2 with muxed I2S to achieve audio class accuracy via audio PLL or external PLL

Т.е. 2 из 3-х SPI могут работать как I2S как я понимаю. А MicroXplorer рисует всё на отдельных пинах. Как будто у контроллера 3 SPI и 2 I2S.

Буду дальше ещё читать.

_________________
Нельзя всё знать, достаточно понимать.

Приглашаем всех желающих 25/11/2021 г. принять участие в вебинаре, посвященном антеннам Molex. Готовые к использованию антенны Molex являются компактными, высокопроизводительными и доступны в различных форм-факторах для всех стандартных антенных протоколов и частот. На вебинаре будет проведен обзор готовых решений и перспектив развития продуктовой линейки. Разработчики смогут получить рекомендации по выбору антенны, работе с документацией и поддержкой, заказу образцов.

1. Можно ли параллелить ЦАПы ? Т.е. один выход I2S подключать на 3 ЦАПа ?
2. Как лучше организовать звуковой тракт: по схеме на рисунке 1 или на рисунке 2?

Рис. 1 - можно применить качественный ОУ. Более дешевый усилитель (покупной) без фильтров.
Рис. 2 - проще схема, не нужно городить 2-х полярное питание для ОУ, более дорогой усилитель с фильтрами

TPA5050 - процессор задержки звука с программируемым временем
PCM1794 - ЦАП

Всё это сугубо в личных учебных целях. Для автомобиля. Укажите на слабые места.

Примерный усилитель для рис. 2 (5-ти канальный с фильтрами) Kicx QS 5.300 Цена

Сегодня мы начинаем изучение нового для нас интерфейса – это шина I2S, чем то похожая на I2C, но заточенная непосредственно на передачу цифрового аудиопотока. Описание и диаграммы протокола данной шины можно найти на странице 894 STM32F4 Reference manual. Ну если кратко, данная шина является также синхронной, причем синхронизация обеспечивается не только для каждого переданного бита, как у I2C, а также поканально. То есть отдельный провод синхронизации задействован так, что при передачи полностью всех битов (их может быть 8, 16, 24) одного канала он находится в состоянии 1, а при передачи всех битов другого канала – в 0. Данное условие обеспечивает невозможность случайного обмена каналов между собой вследствие искажения сигнала потока.

Свой проект мы создадим из одного из предыдущих проектов USB_HOST_MSC_FATFS, так как работать мы будем с USB Flash Drive, ибо нам для изучения преобразования цифрового аудио надо это цифровое аудио откуда-то взять. Было принято решение взять его из WAV файлов, расположенных на данном носителе. Проект мы назовём по наименованию шины I2S_AUDIO. Так как мы ещё будем подключать к плате Discovery носитель USB Flash Drive, то необходимо туда скопировать для WAV-файла со звуком: Track1.wav и Track2.wav. Частота сэмплирования данных файлов может быть любая, но желательно не больше 48 кГц.

Посмотрим подключение аудио-микросхемы в плате Discovery (нажмите на картинку для увеличения изображения)

image00_0500

Данная микросхема именуется CS43L22. Основной её характеристикой является поддерживаемая частота дискретизации. Это от 4 кГц до 96 кГц. Откроем её даташит. Там существуют четыре вида протокола I2S. Мы используем самый первый стандарт. Единственное из даташита непонятно зачем нужен контакт MCLK. В даташите дано следующее описание данного контакта:

Пролистав несколько форумов, я нашел, что это ещё третий вид синхронизации – тактирование сэмплов.

Вот так у нас всё подключено к плате

Откроем наш проект в MS Cube и сделаем необходимое добавление определённых настроек. Включим первым делом саму шину I2S

image02

Ножки никакие не переопределяем. Оставим так как есть. Именно по этим ножкам и подключена микросхема Аудио ЦАП.

Внесем также некоторые корректировки в настройки I2S

image01

Для работы лапки RESET микросхемы нам будет ещё необходимо включить на выход и настроить данную лапку порта (PD4)

image03

Также добавим и настроим DMA на шине I2S

image06

А так как управление микросхемой происходит в отличии от основного аудио-потока уже по шине I2C, то необходимо включить ещё и эту шину

image05

Только I2C3 мы отдадим под символьный дисплей, а I2C1 нам понадобится именно для аудио-микросхемы. Мало того, лапку PB7 нужно будет переопределить на PB9. Я думаю, все уже умеют это делать. Сначала сбросим её, а затем переопределим

Теперь переходник дисплея у нас будет подключен к другим лапкам портов:

Сгенерируем проект для среды Keil, настроим программатор на авторезет, добавим в дерево проекта файл lcd.c и скомпилируем проект.

Создадим и добавим в проект новые файлы, предназначенные для работы со звуком, audioplay.c и audioplay.h следующего содержания:

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

13 августа 2018

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

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

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

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

I2S-сигнал в PulseView

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

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

sigrok-cli -i i2s.sr -P i2s: sd =SDA: ws =WS: sck =SCK -A i2s =right | \
cut -c27-30 | xxd -r -p | \
sox -t raw -B -b 16 -c 1 -e signed-integer -r 48k - audio.wav

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

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

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

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

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

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

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

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

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

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

Читайте также: