Embedded HandbookПриложения
Все разделы › III. Периферия
STM32F407, STM32F405 · уровень средний · 7 мин чтения
Открыть в интерактивном справочнике

18а. Звук по I2S: кадр, форматы и точная частота отсчётов

I2S — последовательный интерфейс для цифрового звука: микроконтроллер отдаёт отсчёты кодеку (ЦАП с усилителем) или принимает их от цифрового микрофона и АЦП. У STM32F4 это не отдельный блок, а второй режим модулей SPI2 и SPI3. Главная трудность у I2S не в битах, а в частоте: кодек ждёт ровно 44 100 или 48 000 отсчётов в секунду, а тактовая частота кристалла на них не делится. Для этого в F4 есть отдельная ФАПЧ — PLLI2S.

Правила кадра, формулы делителей и ограничения ФАПЧ взяты из справочного руководства на F405/F407 (из пакета Keil). Кадр и упаковка 24-битного слова построены программой _verify/i2s18a/i2sframe.c, частоты — перебором всех допустимых делителей в _verify/i2s18a/i2sclk.c; обе собраны gcc на компьютере. Сверяет _verify/i2s18a_check.py.

Как это называется в документации

Оригинал Перевод
serial clock (CK) тактовый сигнал битов
word select (WS) выбор канала: левый или правый
serial data (SD) линия данных
master clock (MCK), MCKOE тактовая частота для кодека и бит её вывода
Philips, MSB justified, LSB justified, PCM четыре стандарта кадра
channel side (CHSIDE) флаг: какой канал сейчас передаётся
PLLI2S, I2SDIV, ODD звуковая ФАПЧ и делитель частоты I2S
full duplex (I2Sx_ext) одновременные передача и приём

18а.1 Четыре провода

Сигнал Что несёт
CK такт битов
WS какой канал идёт: 0 — левый, 1 — правый
SD данные, старший бит первым
MCK тактовая частота для кодека — 256 × частота отсчётов; необязателен

Каналов два, и левый всегда первым. Регистр данных один, 16-битный: программа (или DMA) пишет в него отсчёты по очереди, а флаг CHSIDE показывает, чей сейчас черёд. Неполного кадра не бывает — только левый вместе с правым.

Стандартов кадра четыре: Philips (он же «I2S»), MSB justified, LSB justified и PCM. Кодек поддерживает один или несколько — в его документации ищут, какой выбрать в I2SSTD.


18а.2 Кадр Philips

Кадр I2S Philips: CK, WS и SD для левого слова 0x76A3 и правого 0x8EAA

Главная особенность стандарта Philips: WS меняется за один такт до старшего бита канала. Передатчик выставляет бит по спаду CK, приёмник читает по фронту.

Программа построила кадр 16 бит × 2 канала для левого слова 0x76A3 (его приводит руководство) и правого 0x8EAA:

ws =00000000000000001111111111111111
sd =00111011010100011100011101010101

В MSB justified такой задержки нет: WS меняется одновременно со старшим битом. Перепутать Philips и MSB justified — значит сдвинуть все отсчёты на бит: звук исказится и захрипит.


18а.3 Форматы данных

Данные в канале Записей в регистр на канал Что делает аппаратура
16 бит в 16-битном канале 1 —
16 бит в 32-битном канале 1 младшие 16 бит — нули сами
24 бита в 32-битном канале 2 младшие 8 бит — нули сами
32 бита в 32-битном канале 2 —

24-битный отсчёт пишется двумя словами: старшие 16 бит, затем младшие 8 в старшем байте второго слова. Для 0x8EAA33 программа даёт 0x8EAA, затем 0x33XX — младший байт второго слова не значит ничего. Так же в руководстве.

Размер кадра: 16 × 2 = 32 бита при 16-битных каналах, 32 × 2 = 64 при 32-битных. Отсюда частота CK: при 48 кГц и 16 битах — 48 000 × 32 = 1 536 000 Гц. MCK для кодека — 256 × 48 000 = 12 288 000 Гц.


18а.4 Откуда берётся частота отсчётов

Цепочка делителей I2S для 44,1 кГц: без MCK и с MCK, от входа ФАПЧ 1 МГц до частоты отсчётов

Цепочка: вход ФАПЧ (1 или 2 МГц после общего делителя PLLM) × N / R — получается частота I2S; затем делитель 2·I2SDIV + ODD:

MCK Кадр Частота отсчётов
выключен 16 бит fI2S / [32 · (2·I2SDIV + ODD)]
выключен 32 бита fI2S / [64 · (2·I2SDIV + ODD)]
включён любой fI2S / [256 · (2·I2SDIV + ODD)]

Ограничения из руководства: выход генератора ФАПЧ — 100…432 МГц, 50 ≤ N ≤ 432, 2 ≤ R ≤ 7, частота I2S не больше 192 МГц, I2SDIV — от 2 (0 и 1 запрещены). Вход 1…2 МГц; руководство советует 2 МГц — меньше дрожание.

Перебор всех вариантов. Программа перебрала N, R, I2SDIV и ODD и для каждой частоты нашла наименьшую ошибку. С входом 1 МГц все примеры из таблицы руководства оказались лучшими из возможных — перебор не нашёл ничего точнее. Некоторые из них:

Частота MCK N R I2SDIV ODD Получается Ошибка
48 000 нет, 16 бит 192 5 12 1 48 000 0
44 100 нет, 16 бит 302 2 53 1 44 100,467 0,0011 %
48 000 да 258 3 3 1 47 991,071 0,0186 %
44 100 да 271 2 6 0 44 108,073 0,0183 %

Без MCK делитель большой, и частоту можно подогнать почти точно. С MCK общий делитель уже в 256 раз, на I2SDIV остаются единицы — для 44,1 кГц ошибка вырастает в 17 раз.

Вход 1 или 2 МГц. Делитель PLLM общий с основной ФАПЧ, поэтому вход выбирают один на весь кристалл. С MCK:

Частота Вход 1 МГц Вход 2 МГц
8 000 0 0
22 050 0,0011 % 0,0063 %
44 100 0,0183 % 0,0344 %
48 000 0,0186 % 0,0186 %

То есть совет «вход 2 МГц ради меньшего дрожания» для 44,1 кГц с MCK почти вдвое ухудшает точность частоты. Ошибка 0,03 % на слух не заметна (около 0,6 цента — 0,6 сотой полутона), но в записи с внешним таймером набегает: 44 100 × 0,000344 ≈ 15 отсчётов в секунду лишних или недостающих. Если нужен ровный ноль — внешний звуковой такт на вход I2S_CKIN. Для 48 кГц без MCK хватит 12,288 МГц (I2SDIV = 4, 16-битный кадр), с MCK нужно 49,152 МГц: I2SDIV не бывает меньше 2, и 12,288 МГц дают с MCK не больше 12 кГц. Для 44,1 кГц — своё семейство: 11,2896 МГц без MCK, 45,1584 МГц с MCK. Либо ведущим делают кодек с его кварцем, а STM32 работает ведомым.

Мелочь для внимательных: частоты в таблице руководства отличаются от точных в тысячных долях герца (44 100,46875 против 44 100,46729) — таблицу считали с округлением; на проценты ошибки это не влияет.


18а.5 Поток: DMA и двойной буфер

Звук — непрерывный поток: не успели записать отсчёт до конца текущего — щелчок. Поэтому I2S почти всегда кормят через DMA в кольцевом режиме (раздел 9):

Передача и приём одновременно — пара I2Sx и I2Sx_ext: основной модуль ведущий и выдаёт CK и WS, дополнительный работает только ведомым и только в полнодуплексном режиме.

Выключать I2S — только после TXE = 1 и BSY = 0, иначе последний отсчёт оборвётся.


18а.6 Грабли

Звук хрипит. Стандарт кадра у кодека и у STM32 разный (Philips против MSB justified) — все биты сдвинуты на один.

Каналы поменялись местами. Первый отсчёт в буфере — левый; сдвиг буфера на одно полуслово меняет каналы. В режиме ведомого (и у I2Sx_ext) причина бывает и в пуске: блок включают, когда на WS нужный уровень — высокий в стандарте Philips, низкий в MSB, LSB и PCM; включённый посреди канала, он начнёт кадр не с того слова.

Тон «ниже», чем должен. Частота I2S посчитана без учёта MCK: с включённым MCK делитель в 8 (16-битный кадр) или в 4 раза (32-битный) больше.

44,1 кГц с ошибкой 0,03 %. Вход ФАПЧ 2 МГц. С входом 1 МГц — 0,018 %; ровный ноль — только внешний звуковой такт на I2S_CKIN (18а.4).

24-битный звук «рассыпается». Второе полуслово записано младшим байтом вниз; младшие 8 бит отсчёта должны лежать в старшем байте второго слова.

Щелчки раз в несколько миллисекунд. Программа не успевает заполнить половину буфера за её длительность. Больше буфер или меньше работы в прерывании.

I2SDIV = 1 «работает» не так. Значения 0 и 1 запрещены.


18а.7 Итоги

Дальше: раздел 18б «SAI и DFSDM: многоканальный звук и цифровые микрофоны» — звуковой блок SAI с кадром до 16 слотов и фильтр для PDM-микрофонов.

Открыть в интерактивном справочнике