Данная категория устройств на новом форуме еще не обсуждалась. Открою тему.
В частности интересует MAX98357A.
По надписям - I2S Mono Amp. Default Gain 9db & (L+R)/2 out.
Вопрос?
Все устройства идут с такой конфигурацией по умолчанию?
попытка номер раз - сгенерировать синусоидальный сигнал, скетч из примеров библиотеки, настройки такие:
/*
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.
на модуле PCM5102 от важгата BCK - то, что требовалось, но есть и SCK, что оно такое пока не разбирался…и таки да модули даже на слух звучат получше MAX98357A но на аналоговом усилителе
Да, у PCM5102 сигнал MCLK действительно называется SCK, и для него есть специальный вход. Но при отсутствии этого сигнала чип может генерить его сам на основе BCK. Т.е. он не обязателен. И практика это подтверждает. Подробнее описано на 11-12 стр. дэйташита. А на стр.26 показаны схемы включения в том и другом режимах.