I2S девайсы, конфигурирование, проверка, софт

Данная категория устройств на новом форуме еще не обсуждалась. Открою тему.
В частности интересует MAX98357A.
По надписям - I2S Mono Amp. Default Gain 9db & (L+R)/2 out.
Вопрос?

  1. Все устройства идут с такой конфигурацией по умолчанию?
  2. А как организовать плавную регулировку усиления

попытка номер раз - сгенерировать синусоидальный сигнал, скетч из примеров библиотеки, настройки такие:

/*
  This example generates a square wave based tone at a specified frequency
  and sample rate. Then outputs the data using the I2S interface to a
  MAX08357 I2S Amp Breakout board.

  I2S Circuit:
   Arduino/Genuino Zero, MKR family and Nano 33 IoT
   MAX08357:
     GND connected GND
     VIN connected 5V
     LRC connected to pin 0 (Zero) or 3 (MKR), A2 (Nano) or 25 (ESP32)
     BCLK connected to pin 1 (Zero) or 2 (MKR), A3 (Nano) or 5 (ESP32)
     DIN connected to pin 9 (Zero) or A6 (MKR), 4 (Nano) or 26 (ESP32)

  DAC Circuit:
   ESP32 or ESP32-S2
   Audio amplifier
   - Note:
     - ESP32 has DAC on GPIO pins 25 and 26.
     - ESP32-S2 has DAC on GPIO pins 17 and 18.
  - Connect speaker(s) or headphones.

  created 17 November 2016
  by Sandeep Mistry
  For ESP extended
  Tomas Pilny
  2nd September 2021
*/

#include <I2S.h>
const int frequency = 800; // frequency of square wave in Hz
const int amplitude = 200; // amplitude of square wave
const int sampleRate = 8000; // sample rate in Hz
const int bps = 16;

const int halfWavelength = (sampleRate / frequency); // half wavelength of square wave

short sample = amplitude; // current sample value
int count = 0;

i2s_mode_t mode = I2S_PHILIPS_MODE; // I2S decoder is needed
// i2s_mode_t mode = ADC_DAC_MODE; // Audio amplifier is needed

// Mono channel input
// This is ESP specific implementation -
//   samples will be automatically copied to both channels inside I2S driver
//   If you want to have true mono output use I2S_PHILIPS_MODE and interlay
//   second channel with 0-value samples.
//   The order of channels is RIGH followed by LEFT
//i2s_mode_t mode = I2S_RIGHT_JUSTIFIED_MODE; // I2S decoder is needed

void setup() {
  Serial.begin(115200);
  Serial.println("I2S simple tone");

  // MAX98357A
  // I2S_DIN  25 (SD or SD_OUT)
  // I2S_LRC  26 (WS or FS)
  // I2S_BCLK 27 (CLK  or SCK)
  
  // start I2S at the sample rate with 16-bits per sample
  // you can change default pins; order of pins = (CLK, WS, SD, SDOUT,SDIN)
  I2S.setAllPins(27, 26, 25, 25, 35);

  if (!I2S.begin(mode, sampleRate, bps)) {
    Serial.println("Failed to initialize I2S!");
    while (1); // do nothing
  }
}

void loop() {
  if (count % halfWavelength == 0 ) {
    // invert the sample every half wavelength count multiple to generate square wave
    sample = -1 * sample;
  }

  if (mode == I2S_PHILIPS_MODE || mode == ADC_DAC_MODE) { // write the same sample twice, once for Right and once for Left channel
    I2S.write(sample); // Right channel
    I2S.write(sample); // Left channel
  } else if (mode == I2S_RIGHT_JUSTIFIED_MODE || mode == I2S_LEFT_JUSTIFIED_MODE) {
    // write the same only once - it will be automatically copied to the other channel
    I2S.write(sample);
  }

  // increment the counter for the next sample
  count++;
}

Что я делаю не так?

Ну, вообще-то надо смотреть, что там написано в библиотеке.
Судя по приведенному коду. метод .write() - блокирующий. Что не есть хорошо. Либо автор кода что-то не так делает (что тоже весьма вероятно).
Кстати, код мне не понравился. И что - он реально работает на Нано?
В общем, без ссылки на библиотеку IMHO здесь обсуждать нечего.

PS. Кстати, по осциллограмме: период 120 мкс, т.е. то, что мы видим, это на частоте дискретизации. Хотелось бы посмотреть еще и на частоте сигнала.

Ну и еще: в I2S сигналы называют кто во что горазд. Включая случаи, когда одно и то же название используется для разных сигналов.
Итак:
битовая синхронизация : BICK, CK, BCLK, BCK, SCK.
кадровая синхронизация (левый/правый) : WS, LRCK, FSYNC, WSEL, LCK.
данные (вход) : DATA, SDATA, SD, SDIN.
данные (выход) : DATA, SDATA, SD, SDOUT, SDTO.
master clock (24.576MHz) : MCLK, MCK, SCK.
Примечание: master clock обычно нужен только ADC.

экспериментирую на ESP32, на нано не замахиваюсь, с возбуждением разобрался… да это штатная библиотека от ядра 2.0.5

смотришь на наводки от dc-dc зачем-то

на модуле PCM5102 от важгата BCK - то, что требовалось, но есть и SCK, что оно такое пока не разбирался…и таки да модули даже на слух звучат получше MAX98357A но на аналоговом усилителе

Да, у PCM5102 сигнал MCLK действительно называется SCK, и для него есть специальный вход. Но при отсутствии этого сигнала чип может генерить его сам на основе BCK. Т.е. он не обязателен. И практика это подтверждает. Подробнее описано на 11-12 стр. дэйташита. А на стр.26 показаны схемы включения в том и другом режимах.

к земле не притянул, но работает, видимо на модуле подтянут через резистор

Вот-вот.
Могу подписаться под каждым словом))))))).