Протокол I2S в ESP32: принципы работы, основы программирования


I2S (Inter-IC Sound protocol) – последовательная шина для соединения цифровых аудиоустройств, используемая для передачи и приема аудио данных по синхронному последовательному порту между двумя устройствами. Находит достаточно широкое применение в современной электронике.

В настоящее время в мире существует много протоколов для передачи аудио данных, применяемых в аудио кодеках, ЦАП (для цифрового аудио выхода), АЦП (для цифрового аудио входа). Среди них одним из самых простых и прозрачных протоколов является протокол I2S.

Проект, демонстрирующий возможности протокола I2S в модуле ESP32

Данный протокол был разработан компанией Philips Semiconductor (сейчас NXP Semiconductors) и он находит широкое применение в микроконтроллерах, кодеках, аудио модулях, микрофонах и т.п.

Ранее на нашем сайте мы уже рассматривали основы работы с протоколом I2S в статье про интернет радио на основе модуля ESP32, в этой же статье мы более глубоко рассмотрим принципы работы протокола I2S и программирование работы с ним в модуле ESP32.

Необходимые компоненты

  1. Модуль ESP32 Devkit (купить на AliExpress).
  2. Плата усиления MAX98357A I2S (купить на AliExpress).
  3. 8-омный громкоговоритель (динамик).
  4. USB кабель.

3-х проводное соединение в протоколе I2S

Протокол I2S использует 3 провода для соединения. Структура соединения между передающим и приемным устройствами в протоколе I2S показана на следующем рисунке.

Структура соединения между передающим и приемным устройствами в протоколе I2S

Провод Word Select (WS) или Frame Select (FS)

Поскольку протокол I2S позволяет передавать звук в формате стерео, то левый или правый каналы в нем могут быть выбраны с помощью контакта WS или Word Select (выбор слова). Если контакт WP находится в состоянии Low, то выбран канал 1 (левый канал, left channel). Если контакт WP находится в состоянии High, то выбран канал 2 (правый канал, right channel).

То есть получаем:

Независимо от этого контакта выбора канала, протокол I2S использует два дополнительных канала, которые применяются в большинстве последовательных интерфейсов.

Контакт Serial Data или SD

Контакт Serial Data (или SD) в протоколе I2S используется для передачи данных, которые передаются в два приема.

При передаче данных в протоколе I2S сначала передаются наиболее значимые биты (most significant bit, MSB). Для этого есть объективная причина – в протоколе I2S данные от передатчика к приемнику могут передаваться словами различной длины.

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

Если WS приемника больше чем WS передатчика, слово обрезается и наименее значимые данные устанавливаются в 0. Если WS приемника меньше чем WS передатчика, биты после наименее значимых битов (LSB) игнорируются.

Линия Bit clock или BCLK

Линия Bit clock (или BCLK, bit clock line) представляет собой линию, по которой передаются тактовые импульсы – это необходимо для процессов синхронизации. Линия синхронизации играет важную роль во всех последовательных протоколах передачи данных.

Она необходима чтобы все компоненты работали в одном и том же цикле. Частота линии BCLK зависит от частоты дискретизации (sample rate), количества бит на канал (Bits per channel) и числа используемых каналов (Number of channels).

Формула для ее расчета следующая:

Frequency = Sample Rate x Bits per channel x Number of channels.

К примеру:

Sample rate (частота дискретизации): 44.1 kHz
Bits per channel (бит на канал): 8
Number of channels (число каналов): 2 [Stereo]
В итоге получаем частоту линии BCLK равную 44.1 kHz * 8 * 2 = 705 kHz.

Временные диаграммы протокола I2S

Показаны на следующем рисунке.

Временные диаграммы протокола I2S

На представленных диаграммах показаны три линии протокола I2S: BCLK, WS, SD. Линия BCLK обеспечивает требуемую частоту следования импульсов. Линия WS изменяет свое состояние от правого канала к левому.

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

Работа с протоколом I2S в модуле ESP32

Основные принципы работы драйвера протокола I2S в модуле ESP32:

  1. Драйвер (контроллер) протокола I2S в модуле ESP32 может работать в режиме ведущего (master) или ведомого (slave).
  2. Он может работать как передатчик или приемник на шине I2S.
  3. Модуль ESP32 имеет выделенный DMA контроллер (контроллер прямого доступа к памяти), который может транслировать биты данных не используя ресурсы центрального процессора модуля.
  4. Периферийные устройства модуля ESP32, работающие по протоколу I2S, также поддерживают режим LCD. В этом режиме данные протокола I2S передаются по параллельной шине. Данный режим необходим для некоторых ЖК дисплеев (LCDs) и камер, подключаемых к модулю ESP32.

В режиме LCD контроллер I2S модуля ESP32 может работать в следующих режимах:

  1. Ведущий (master) в режиме передачи – для ЖК дисплея.
  2. Камера в режиме ведомого (slave).
  3. Режим ADC/DAC (АЦП/ЦАП).

Генератор тона NOKIA с использованием протокола I2S

Давайте подключим громкоговоритель (динамик) к модулю ESP32 по протоколу I2S и сгенерируем символическую мелодию тона NOKIA.

Поскольку громкоговоритель (динамик) является аналоговым устройством, то его невозможно напрямую подключить к модулю ESP32 – для этой цели мы будем использовать модуль усилителя MAX98357A, работающий по протоколу I2S. MAX98357A работает в режиме Mono.

Внешний вид модуля усилителя MAX98357A показан на следующем рисунке.

Внешний вид модуля MAX98357A

Самыми важными контактами модуля MAX98357A являются BCLK, DIN и LRC. DIN – это контакт передачи данных, фактически, это линия SD в протоколе I2S. LRC (Left-Right Channel) – это контакт выбора канала, аналог контакта WS в протоколе I2S.

Схема подключения модуля MAX98357A к ESP32 по интерфейсу I2S представлена на следующем рисунке.

Схема подключения модуля MAX98357A к ESP32 по интерфейсу I2SВ схеме имеем следующие соединения:

  1. BCLK pin of I2S = BCLK Pin of the Module = ESP32 Pin 27.
  2. Word Select pin of I2S = LRC Pin of the Module = ESP32 Pin 26.
  3. Serial Data pin of I2S = DIN Pin of the Module = ESP32 Pin 25.

Объяснение программы для модуля ESP32

Полный код программы приведен в конце статьи, здесь же мы кратко рассмотрим его основные фрагменты.

Чтобы код нашей программы работал, необходимо чтобы файл sampleaac.h содержал шестнадцатеричный код мелодии Nokia. О том, как это сделать, вы можете прочитать в статье про аудиоплеер на основе модуля ESP32.

Заголовочный файл должен быть примерно следующего формата:

В программе мы будем использовать библиотеку audio generator AAC, которая использует протокол I2S для генерирования аудио сигнала. Ее можно скачать по следующей ссылке - https://github.com/earlephilhower/ESP8266Audio.

После этого в программе укажем контакты модуля ESP32, к которым подключен модуль MAX98357A.

Далее, в функции setup, используя ранее указанные контакты, запустим в работу драйвер протокола I2S.

Затем, в функции void loop() мы будем проигрывать аудио в формате AAC (Advanced Audio Coding - усовершенствованное кодирование аудиоматериалов).

Тестирование работы проекта

После того как схема проекта будет собрана и программа загружена в модуль ESP32, мы можем приступить к тестированию работы проекта. Для теста мы использовали проигрывание мелодии Nokia.

Тестирование работы проекта

Более подробно работу проекта вы можете посмотреть на видео, приведенном в конце статьи.

Исходный код программы (скетча)

Видео, демонстрирующее работу проекта

Источник статьи

(Проголосуй первым!)
Загрузка...
5 446 просмотров

Комментарии

Протокол I2S в ESP32: принципы работы, основы программирования — 9 комментариев

  1. Всё отлично, но НА ошибки проверьте. Аудиочтото пишется слитно почти всегда!!!

  2. А можно ли LRC привязать к земле, например, чтобы всегда был один канал, и чтобы освободить линию, которых может не хватить (конкретно, если это ESP-01 и надо еще пару кнопок подключить). А программно, как-то где-то задать, что звук всегда бы в моно передавался?

  3. ArduinoIDE зависает на компиляции , очень жалко , больше подобных примеров нету но очень нужно.

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

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

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

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