Как я уже говорил, на плате STM32F4-Discovery установлен ЦАП, который подключается по интерфейсу I2S. И оно может проигрывать мелодии, пищать и издавать в соответствующий разъём всякие звуки. Если, конечно, туда подключить какое-нибудь устройство воспроизведения.
Прежде, чем можно будет в I2S гнать аудиопоток, ЦАП надо включить и настроить, иначе он будет молча данные игнорировать:
1. Линию PD4 (~RESET) перевести в высокий уровень. ЦАП начнёт работать и воспринимать команды.
2. Командами по линии I2C программно включить ЦАП, выбрать и настроить протокол I2S, настроить коэффициенты усиления, установить громкость и всё такое. Настроек там выше крыши, и их все можно посмотреть в
даташите.
3. Настроить I2S в контроллере.
После этого можно уже посылать данные и слышать результат в наушниках.
читать дальшеЯ взял уже готовый базовый проект из предыдущих, готовый драйвер I2C (с буферизацией на 5 транзакций) и настраивал посредством него:
Не суть важно. Драйвер i2c можно заменить на любой другой, даже из стандартной библиотеки.
Так что там с I2S. На плате на ЦАП ведут дорожки с выводов PC7 (MCK), PC10 (SCK), PC12 (SD), PA4 (WS). Альтернативная функция: 6.
Даже по названиям линий видно, что это синхронный протокол. По сути - это что-то вроде SPI, только с дополнительными линиями данных, одна из которых (WS) говорит о том, на какой канал идёт передаваемый аудиосемпл. Не удивительно и то, что протокол I2S реализован на базе модуля SPI (нам нужен SPI3, но на SPI2 тоже есть, вроде).
Настройка проста, только требует ряда расчётов:
1. Подаём тактовый сигнал на соответствующий модуль SPI (флаг SPI3EN в регистре RCC_APB1ENR);
2. Выбираем источник тактирования для I2S: PLLI2S (отдельный PLL для аудио) или внешний тактовый сигнал. За это отвечает флаг I2SSRC в регистре RCC_CFGR. Так как внешнего сигнала нема, сбрасываем флаг;
3. Настраиваем этот самый PLL для аудио (множитель, делитель) в регистре PLLI2SCFGR, параметры примерные можно глянуть в таблице 125 (Audio frequency precision) из Ref. Man. Там же идёт и пример расчёта под нестандартные значения. Относительно него потом будет вычисляться частота семплирования аудио, с какой скоростью слать данные ЦАПу.
4. Включаем его установлением флага PLLI2SON в регистре RCC_CR;
5. Ожидаем готовности (PLLI2SRDY там же);
6. Настраивается делитель относительно PLLI2S, чтобы дать нужную частоту следования выборок: 48000 кГц, 96000 кГц, 8 кГц и т.д., в зависимости от формата проигрываемого файла. Опять же, параметры для стандартных частот указаны в таблице 125.
Дальше можно данные запихивать в регистр SPIx_DR, разделение по каналам такое: сначала пишем левый, потом правый, потом снова левый и так далее.
В примере идёт инициализация ЦАПа и I2S, а потом в цикле играет гамма, каждая нотка по паре секунд. Звук грязный, ибо меандр. Правда, в высоте звука я не уверен.
Проект;
cs43l22.c;
i2s.c;
test2.c.
побайтовая запись ленива и упорна. Вот пример записи через DMA, где обмен идёт с кодом уже блоками.
Проект с DMA;
i2s.c (DMA);
test2.c (DMA).
<< Предыдущее Следующее >>