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
Главная особенность стандарта Philips: WS меняется за один такт до старшего бита канала. Передатчик выставляет бит по спаду CK, приёмник читает по фронту.
Программа построила кадр 16 бит × 2 канала для левого слова 0x76A3
(его приводит руководство) и правого 0x8EAA:
ws =00000000000000001111111111111111
sd =00111011010100011100011101010101
- WS поднимается на такте 16, а старший бит правого канала — на такте 17;
- биты 1…16 — левое слово
0111 0110 1010 0011=0x76A3; - такт 0 несёт младший бит правого канала прошлого кадра — из-за той же
задержки на такт. Программа собрала оба слова обратно из потока битов
и получила
0x76A3и0x8EAA.
В 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 Откуда берётся частота отсчётов
Цепочка: вход ФАПЧ (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):
- буфер делится на две половины; DMA передаёт одну, а прерывание «половина передана» даёт программе время заполнить её заново;
- время на заполнение половины — её длительность: 256 кадров при 48 кГц — 256 / 48 000 = 5,33 мс;
- стерео 16 бит: кадр — два полуслова; половина на 256 кадров — 512 полуслов, весь буфер — 1024.
Передача и приём одновременно — пара 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 Итоги
- I2S — режим SPI2/SPI3: CK, WS, SD и необязательный MCK; левый канал первым, старший бит первым.
- Philips: WS за такт до старшего бита; такт 0 кадра несёт младший бит правого канала прошлого кадра.
- 24 бита — две записи:
0x8EAA33→0x8EAA,0x33XX. - 48 кГц × 16 бит × 2 = 1,536 МГц на CK; MCK = 256 × fs = 12,288 МГц.
- Примеры руководства для PLLI2S — лучшие из возможных при входе 1 МГц; с MCK 44,1 кГц даёт 0,0183 % (вход 1 МГц) или 0,0344 % (вход 2 МГц).
- Поток — DMA по кругу с двумя половинами; 256 кадров при 48 кГц — 5,33 мс на заполнение половины.
Дальше: раздел 18б «SAI и DFSDM: многоканальный звук и цифровые микрофоны» — звуковой блок SAI с кадром до 16 слотов и фильтр для PDM-микрофонов.