Библиотека 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вместо реальных данных.