• Внешний USB-ЦАП-Аудиопроцессор CDD-010 можно купить

ESP32 DevModule + ADAU1701

sPave

Well-known member
Коллеги, приветствую. Собираю информацию, как добавить к небольшому проекту активных колонок на ADAU1701 Blouetooth приемник на базе ESP32.
Скетч ESP32 подготовил, заставил делать ресемплинг из 44.1 в 48, вижу SDATA, BCLK(1.5МГц вместо обычных 3мГц), вижу LR.

Смущает, что я вижу BCLK, LR даже, когда в скетче прописаy режим slave.

По задумке(думаю, это правильно), хочу что бы все тактировал ADAU.

Вопросы:
1. Режим (master\slave) I2S порта (который рядом с портом I2C) определяется наличием перемычки кварца и играет роль и галочка в регистрах?
2. Режим (master\slave) этой галочкой можно задать только для исходящего I2S потока?
3. В регистрах выставил Right-Justefied 16bit (правильно ли это?).

Пользовался reflex+1701, хотел для проверки поставить ESP32 вместо Reflex и тактировать от него, но для запуска ESP32 в режиме Мастера, смущает его BCLK в 1.5мГц. Подозреваю, нужно что-то сделать с Programm Letght.

Не поделится ли кто мыслями\наработками по этой теме. Пока сомневаюсь даже в коммутации, перемычку кварца запаял.

Мой скетч(только для I2C управления, не для BT):
#include <Wire.h>
#define ADAU1701_I2C_ADDR 0x34 // I2C-адрес ADAU1701, убедитесь, 0x68 правильный ли(подозрен-е, 0x34 верный адрес)
//#define ADAU1701_I2C_ADDR (0x68 >> 1) & 0xFE // I2C-адрес ADAU1701, копипаст адреса из проекта с ГитХаб
#define MUTE_REG_ADDR 0x0016 // Адрес регистра MuteNoSlewAlg2mute
// Настройка подтягивающих резисторов пинов для I2C на моей плате не нужна
#define I2C_SCL_PIN 16
#define I2C_SDA_PIN 17
void setup() {
Wire.begin(I2C_SDA_PIN, I2C_SCL_PIN); // Инициализация I2C с заданными пинами
}
void loop() {
// Включаем Mute
Wire.beginTransmission(ADAU1701_I2C_ADDR);
Wire.write((MUTE_REG_ADDR >> 8) & 0xFF); // Старший байт адреса
Wire.write(MUTE_REG_ADDR & 0xFF); // Младший байт адреса
Wire.write(0x00); // Данные для Mute включения
Wire.write(0x80);
Wire.write(0x00);
Wire.write(0x00);
Wire.endTransmission();
delay(2000);
// Выключаем Mute
Wire.beginTransmission(ADAU1701_I2C_ADDR);
Wire.write((MUTE_REG_ADDR >> 8) & 0xFF); // Старший байт адреса
Wire.write(MUTE_REG_ADDR & 0xFF); // Младший байт адреса
Wire.write(0x00); // Данные для Mute выключения
Wire.write(0x00);
Wire.write(0x00);
Wire.write(0x00);
Wire.endTransmission();
delay(2000);
}
 

Вложения

Последнее редактирование:

Евгений

Administrator
Команда форума
BCLK(1.5МГц вместо обычных 3мГц)
Это значит, что поток 16 бит на канал, т.е. 2 * 16 * 48000. 3 МГц будет, если разрядность 32 бита на канал.

1. Режим (master\slave) I2S порта (который рядом с портом I2C) определяется наличием перемычки кварца и играет роль и галочка в регистрах?
Если речь про ADAU1701: входной порт I2S всегда слейв, это изменить невозможно; режим выходного порта задается в настройках (да, "галочка в регистрах"). Перемычка кварца никак на эти режимы не влияет, а задает выбор MCLK.

2. Режим (master\slave) этой галочкой можно задать только для исходящего I2S потока?
Да.

3. В регистрах выставил Right-Justefied 16bit (правильно ли это?).
Это должно быть согласовано с сопрягаемым устройством. Если у него также, то правильно.

смущает его BCLK в 1.5мГц
Это нормально, пояснение выше.
 

sPave

Well-known member
Скажите, пожалуйста, какой платой ESP32 пользуетесь.
А покупал вот это, вроде не обманули:
ESP-32S Отладочная плата

Нашел какой-то скетч для вытаскивания всей инфы из ESP32, показал это:

Chip Model: ESP32-D0WD-V3
Chip Cores: 2
Flash Size: 4MB
PSRAM Size: 0MB

Memory Information:
Free Heap: 352664 bytes
Minimum Free Heap: 347284 bytes
Max Alloc Heap: 118772 bytes

System Information:
CPU Frequency: 240 MHz
SDK Version: v5.1.4-828-g33fbade6b8-dirty
Sketch Size: 282032 bytes
Free Sketch Space: 1310720 bytes
Flash Frequency: 80000000 Hz
Cycle Count: 263873208

chip revision: v3.1[0m
 

sPave

Well-known member
Если речь про ADAU1701: входной порт I2S всегда слейв, это изменить невозможно; режим выходного порта задается в настройках (да, "галочка в регистрах"). Перемычка кварца никак на эти режимы не влияет, а задает выбор MCLK.
Входной порт I2S, который всегда слейв, должен тактироваться только сигналом MCLK от подключенного устройства, т.к. не вижу в регистрах выбора между BCLK\LR в качестве источника тактирования, как на 1938, если не ошибаюсь?

Вообще, в теории, если на входной слейв порт подаю сигнал с ESP32, то она и только она должна все тактировать и кварц на 1701 не нужен?

И еще заметил, что у MCLK от кварца VPP всего 900мВ, это нормально?
 
Последнее редактирование:

Евгений

Administrator
Команда форума
Входной порт I2S, который всегда слейв, должен тактироваться только сигналом MCLK от подключенного устройства, т.к. не вижу в регистрах выбора между BCLK\LR в качестве источника тактирования, как на 1938, если не ошибаюсь?
На входной порт I2S ADAU1701 всегда нужно подавать внешние сигналы BCLK\LR, они не исключают и не дополняют MCLK, он тоже должен быть.

Вообще, в теории, если на входной слейв порт подаю сигнал с ESP32, то она и только она должна все тактировать и кварц на 1701 не нужен?
Нет. MCLK нужен всегда.
 

sPave

Well-known member
MCLK нужен всегда.
Спасибо. Пойду к разработчику библиотеки, MCLK забыли положить мне или включить как-то надо.

С кварцем на 1701 не совсем понял. При использовании 1701 с Рефлексом, я тактирую 1701 от Рефлекса и Кварц не подключен.
Выходит, в теории, если получу от ESP32 сигнал MCLK мне нужно будет отключить кварц от 1701?
 

Евгений

Administrator
Команда форума
С кварцем на 1701 не совсем понял. При использовании 1701 с Рефлексом, я тактирую 1701 от Рефлекса и Кварц не подключен.
Это верно, но только для частот 44,1/48. Для ADAU1701 частота MCLK не зависит от частоты аудиопотока и всегда постоянна, в нашем случае всегда равна 12,288 МГц.

Спасибо. Пойду к разработчику библиотеки, MCLK забыли положить мне или включить как-то надо.
Выходит, в теории, если получу от ESP32 сигнал MCLK мне нужно будет отключить кварц от 1701?
ADAU1701 может тактироваться или от своего кварца, или от внешнего источника MCLK. Да, если подается внешний MCLK, кварц нужно отключить.
 

Vitalii

Well-known member
Приветствую. А можно любую плату из ESP-32S использовать? Тоже имеются подобные платы.
 

sPave

Well-known member
Приветствую. А можно любую плату из ESP-32S использовать? Тоже имеются подобные платы.
Приветствую. S-версии более продвинутая. Точно подойдет.
Вот скетч с включением MCLK (не знаю на каком пине он будет, если будет). Мне пока тестить лениво, мож вы запустите. Только отпишитесь.
Библиотеки:
И Audio-Tools

#include "AudioTools.h"
#include "BluetoothA2DPSink.h"
AudioInfo from_info(44100, 2, 16); // Входной поток Bluetooth
AudioInfo to_info(48000, 2, 16); // Выходной поток I2S
I2SStream out;
ResampleStream resample(out);
BluetoothA2DPSink a2dp_sink(resample);
void setup() {
Serial.begin(115200);
AudioLogger::instance().begin(Serial, AudioLogger::Info);
auto config = out.defaultConfig(TX_MODE);
config.sample_rate = 48000; // Настройка частоты 48 кГц
config.channels = 2; // Два канала
config.bits_per_sample = 16; // Глубина 16 бит
config.use_apll = true; // Активируем генерацию MCLK

out.begin(config); // Инициализация с переданным config
config.is_master = false; // Включаем режим slave перед инициализацией

resample.begin(from_info, to_info.sample_rate);
a2dp_sink.start("MyMusic");
}
void loop() {
delay(1000);
}
 

Vitalii

Well-known member
Приветствую. S-версии более продвинутая. Точно подойдет.
Вот скетч с включением MCLK (не знаю на каком пине он будет, если будет). Мне пока тестить лениво, мож вы запустите. Только отпишитесь.
Библиотеки:
И Audio-Tools

#include "AudioTools.h"
#include "BluetoothA2DPSink.h"
AudioInfo from_info(44100, 2, 16); // Входной поток Bluetooth
AudioInfo to_info(48000, 2, 16); // Выходной поток I2S
I2SStream out;
ResampleStream resample(out);
BluetoothA2DPSink a2dp_sink(resample);
void setup() {
Serial.begin(115200);
AudioLogger::instance().begin(Serial, AudioLogger::Info);
auto config = out.defaultConfig(TX_MODE);
config.sample_rate = 48000; // Настройка частоты 48 кГц
config.channels = 2; // Два канала
config.bits_per_sample = 16; // Глубина 16 бит
config.use_apll = true; // Активируем генерацию MCLK

out.begin(config); // Инициализация с переданным config
config.is_master = false; // Включаем режим slave перед инициализацией

resample.begin(from_info, to_info.sample_rate);
a2dp_sink.start("MyMusic");
}
void loop() {
delay(1000);
}
Приветствую. Отлично, попробую, но чуть позже. Добью один проект на 1701 и 1467.
 

sPave

Well-known member
Приветствую. Отлично, попробую, но чуть позже. Добью один проект на 1701 и 1467.
Дорожку я протоптал. Заработало! Адрес АДАУ 0x34, а не 0x68, как Сигма Студия отображает.
Рабочий скетч положу в первое сообщение.
Так рад, что заснял для потомков концерт на этой балалайке.

ESP32 вкл\выкл mute каждые 2 сек.:
 

sPave

Well-known member
Приветствую. Отлично, попробую, но чуть позже. Добью один проект на 1701 и 1467.
В общем, мой модуль ESP кривую MCLK выдает, один автор в Инете так же написал и заюзал PCM5120(или 02, как там ее).
А ESP32-S3 должна норм заработать. В общем передаю эстафету, спрашивайте пока не забыл, чего я тут наковырял, наговнокодил.
А эта платка будет только с ПДУ команды отдавать в ADAU1701 по I2C. Ну надеюсь.
 

Vitalii

Well-known member
В общем, мой модуль ESP кривую MCLK выдает, один автор в Инете так же написал и заюзал PCM5120(или 02, как там ее).
А ESP32-S3 должна норм заработать. В общем передаю эстафету, спрашивайте пока не забыл, чего я тут наковырял, наговнокодил.
А эта платка будет только с ПДУ команды отдавать в ADAU1701 по I2C. Ну надеюсь.
Хорошо, будем пробовать.
 

sPave

Well-known member
@Евгений приветствую! А какой адрес EEPROM(как выяснить) на ADAU1701? У меня версия, котор. на сайте висит, там еще SMD нулевку на 100ом пришлось перепаивать.
Как выяснилось, Сигма Студио показывает не правильный адрес ADAU1701, наверняка, и про EEPROM врет.
Разрабатываю управление с IR пульта, хочу некоторые регистры в EEPROM писать.
 
Последнее редактирование:
Верх