Главная chevron_right Уроки chevron_right Встроенные библиотеки chevron_right Библиотека I2S

Библиотека I2S

Документация по использованию протокола I2S (Inter-IC Sound) на платах SAMD21 для передачи цифрового аудио.

Обзор

Эта библиотека позволяет работать с протоколом I2S на платах на базе SAMD21 (Arduino/Genuino Zero, MKRZero и MKR1000).

Чтобы подключить библиотеку:

#include <I2S.h>

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

Как устроен I2S-интерфейс

Шина I2S, соответствующая стандарту Philips, использует как минимум три линии:

  • SCK (Serial Clock) — тактовый сигнал, также известный как BCLK (Bit Clock Line);
  • FS (Frame Select) — разделяет данные левого и правого каналов; в документации также обозначается как WS (Word Select);
  • SD (Serial Data) — линия последовательных данных.

Устройство, которое генерирует SCK и WS, называется Контроллером (Controller). Остальные устройства на шине работают в режиме Периферии (Peripheral). В сети одновременно может быть только один Контроллер — им может быть как передатчик, так и приёмник, так и отдельное устройство управления шиной.

Частота линии SCK вычисляется по формуле:

Frequency = SampleRate × BitsPerChannel × numberOfChannels

Размер одного аудиосэмпла может варьироваться от 4 до 32 бит. Как правило, чем выше частота дискретизации (kHz) и разрядность, тем лучше качество звука при обратном преобразовании в аналоговый сигнал.

Класс I2S

begin()

Описание

Инициализирует интерфейс I2S с заданными параметрами и открывает соединение.

Синтаксис

I2S.begin(mode, sampleRate, bitsPerSample); // ведущее устройство
I2S.begin(mode, bitsPerSample); // ведомое устройство

Параметры

  • mode — один из режимов: I2S_PHILIPS_MODE, I2S_RIGHT_JUSTIFIED_MODE или I2S_LEFT_JUSTIFIED_MODE
  • sampleRate — желаемая частота дискретизации в Гц (тип long)
  • bitsPerSample — разрядность сэмпла (например, 8, 16 или 32 бита)

Возвращаемое значение

1 — если инициализация прошла успешно, 0 — если нет.

---

end()

Описание

Отключает интерфейс I2S, освобождая соответствующие пины для использования в качестве обычных GPIO. Чтобы снова включить I2S, вызовите I2S.begin().

Синтаксис

I2S.end()

Параметры

Нет.

Возвращаемое значение

Нет.

---

available()

Описание

Возвращает количество байт, доступных для чтения из интерфейса I2S. Это данные, которые уже поступили и хранятся во внутреннем буфере приёма. available() унаследован от класса Stream.

Синтаксис

I2S.available()

Параметры

Нет.

Возвращаемое значение

Количество байт, готовых к чтению.

---

peek()

Описание

Возвращает следующий сэмпл входящих данных I2S, не удаляя его из внутреннего буфера I2S. Последовательные вызовы peek() будут возвращать одно и то же значение — точно так же, как и следующий вызов read(). peek() унаследован от класса Stream.

Синтаксис

I2S.peek()

Параметры

Нет.

Возвращаемое значение

Следующий доступный сэмпл входящих данных I2S (или 0, если данных нет).

---

read()

Описание

Читает входящие данные I2S из интерфейса I2S. Метод извлекает и удаляет следующий сэмпл из внутреннего буфера I2S. read() унаследован от класса Stream.

Синтаксис

I2S.read()
I2S.read(buffer, length)

Параметры

  • Без аргументов — читает один сэмпл.
  • buffer — массив, в который записываются данные.
  • length — количество сэмплов для чтения.

Возвращаемое значение

  • Первый доступный сэмпл входящих данных I2S (или -1, если данных нет) — тип int.
  • При чтении в буфер: количество фактически прочитанных сэмплов.

---

write()

Описание

Записывает двоичные данные в интерфейс I2S — один сэмпл или серию сэмплов.

Синтаксис

I2S.write(val) // блокирующий режим
I2S.write(buf, len) // неблокирующий режим

Параметры

  • val — одиночное значение для отправки.
  • buf — массив значений для отправки.
  • len — длина буфера.

Возвращаемое значение

Количество записанных байт (тип byte). Считывать это значение необязательно.

---

availableForWrite()

Описание

Возвращает количество байт, которые можно записать в буфер без блокировки операции записи.

Синтаксис

I2S.availableForWrite()

Параметры

Нет.

Возвращаемое значение

Количество байт, доступных для записи.

---

onTransmit(handler)

Описание

Регистрирует функцию-обработчик, которая будет вызвана после успешной передачи блока данных.

Параметры

  • handler — функция без возвращаемого значения, например: void myHandler()

Возвращаемое значение

Нет.

---

onReceive(handler)

Описание

Регистрирует функцию-обработчик, которая будет вызвана при получении блока данных.

Параметры

  • handler — функция без возвращаемого значения, например: void myHandler()

Возвращаемое значение

Нет.

---

Практические замечания

  • Режимы работы. Выбор между I2S_PHILIPS_MODE, I2S_RIGHT_JUSTIFIED_MODE и I2S_LEFT_JUSTIFIED_MODE зависит от подключаемого аудиочипа. Большинство современных ЦАП и АЦП поддерживают режим Philips (I2S_RIGHT_JUSTIFIED_MODE), поэтому начинайте с него.
  • Частота тактирования. Убедитесь, что частота SampleRate × BitsPerChannel × numberOfChannels не превышает возможности вашей платы и периферийного устройства. Типичные значения: 44100 Гц × 16 бит × 2 канала = 1,41 МГц по линии SCK.
  • Обработчики событий. Функции, зарегистрированные через `onTransmit(handler) и onReceive(handler), вызываются из прерывания — не используйте в них kHz, delay()` или другие блокирующие операции.
  • Типичная ошибка. Если begin() возвращает 0, проверьте корректность параметров и убедитесь, что пины SCK, FS и SD не заняты другими библиотеками.
  • Проверка буфера. Перед вызовом read() всегда проверяйте available(), чтобы не получить -1 вместо реальных данных.