Нужна консультация по подключению данного аудиопроцессора, самому запустить, увы, не получилось. Проц работает по I2c шине, в сети нашел библиотеку, подкорректировал немного, но "оживить" TDA с ходу не вышло. Вот откорректированный мной код: Спойлер Код (C++): #include <Wire.h> //chip **7 bit** address // Datasheet says 0x88 but that is the 8 bit // address. Wire.h automatically appends the // extra (lsb write) bit. #define TDA7439_address 0x44 //Sub addresses #define TDA7439_input_sel 0 //0x00 #define TDA7439_input_gain 1 //0x01 #define TDA7439_volume 2 //0x02 #define TDA7439_bass 3 //0x03 #define TDA7439_middle 4 //0x04 #define TDA7439_trebble 5 //0x05 #define TDA7439_ratt 6 //0x06 #define TDA7439_latt 7 //0x07 // Input selection #define TDA7439_input_1 3 //0x03 #define TDA7439_input_2 2 //0x02 #define TDA7439_input_3 1 //0x01 #define TDA7439_input_4 0 //0x00 //TDA7439 input gain in db (x 2) //0x00 -> 0x0F //TDA7439 volume (-db) //0x00 -> 0x2F (0 - 47) #define TDA7439_mute 0x38 //Mute main volume int voll; void setup() { Wire.begin(); } void loop() { /* voll += 1; if (voll == 48) { voll = 0; } */ // setSnd(0, 1); // setSnd(0, 2); // setSnd(0, 3); setInput(3); setVolume(24); inputGain(15); } void setInput(int input) { switch (input) { case 1: input = TDA7439_input_1; break; case 2: input = TDA7439_input_2; break; case 3: input = TDA7439_input_3; break; case 4: input = TDA7439_input_4; break; } writeWire(TDA7439_input_sel, input); } void inputGain(int gain) { writeWire(TDA7439_input_gain, gain); } void setVolume(int volume) { if (volume == 0) { volume = TDA7439_mute; } else { volume = 48 - volume; } writeWire(TDA7439_volume, volume); } void setSnd(int val, int range) { switch (range) { case 1: range = TDA7439_bass; break; case 2: range = TDA7439_middle; break; case 3: range = TDA7439_trebble; break; } switch (val) { case -7: val = 0; break; case -6: val = 1; break; case -5: val = 2; break; case -4: val = 3; break; case -3: val = 4; break; case -2: val = 5; break; case -1: val = 6; break; case 0 : val = 7; break; case 1 : val = 14; break; case 2 : val = 13; break; case 3 : val = 12; break; case 4 : val = 11; break; case 5 : val = 10; break; case 6 : val = 9; break; case 7 : val = 8; break; } writeWire(range, val); } void mute() { writeWire(TDA7439_volume, TDA7439_mute); } void spkAtt(int att) { // Mainly used to override the default attenuation of mute at power up // can be used for balance with some simple code changes here. writeWire(TDA7439_ratt, att); writeWire(TDA7439_latt, att); } void writeWire(char a, char b) { Wire.beginTransmission(TDA7439_address); Wire.write (a); Wire.write (b); Wire.endTransmission(); delay(100); } Проц живой, вроде, I2c csaner его видит (0х44). Более того, звук поданный на вход селектора входов идет на выход, но очень слабо, как буд-то включен режим "Mute" или минимальной громкости, при этом сам селектор входа работает, т.е. я могу переключать входа (setInput(); ), но вот ни громкостью, ни другими режимами управлять не получается. Может что в коде не верно? Хотя вроде бы логично всё. Схема включения аудиопроца стандартная - из Datasheet-а. Начиная с 10 страницы указаны таблицы управления режимами. Огромное спасибо за любые советы и помощь
Да, смотрел, там код написан для PIC и автор исходники не предлагает, только HEX. Меня беспокоит, правильно ли в той библиотеке (для TDA7439), которую я взял за основу, указаны адреса режимов, согласно таблицам: Код (C++): //Sub addresses #define TDA7439_input_sel 0x00 #define TDA7439_input_gain 0x01 #define TDA7439_volume 0x02 #define TDA7439_bass 0x03 #define TDA7439_middle 0x04 #define TDA7439_trebble 0x05 // balance #define TDA7439_ratt 0x06 #define TDA7439_latt 0x07 Код (C++): // Input selection #define TDA7439_input_1 0x03 #define TDA7439_input_2 0x02 #define TDA7439_input_3 0x01 #define TDA7439_input_4 0x00 Честно, эти таблицы понять не могу и у меня вызывает затруднения в проверке правильности этих адресов. В отправке данных по I2c вроде бы все верно: обращаемся к устройству по адресу 0х44 (Wire.beginTransmission(0x44) ), далее отправляем subadress того, что мы хотим изменить (Wire.write (a); ) и следом адрес того на "сколько" мы это хотим изменить (Wire.write (b); ), и заканчиваем передачу (Wire.endTransmission(); ). Быть уверенным бы наверняка, что адреса верны, и искать причину в чем-то другом. Посмотрите, пожалуйста
Все сам да сам... Совсем не обратил внимания на таблицу: "SPEAKER ATTENUATE SELECTION". Видимо по умолчанию стоит "Mute", т.е. -72 dB. Сейчас все работает, вот код для аудипроцессора TDA7439, написанный в Arduino IDE. Код (C++): #include <Wire.h> // chip **7 bit** address // Datasheet says 0x88 but that is the 8 bit // address. Wire.h automatically appends the // extra (lsb write) bit. #define TDA7439_address 0x44 // Адреса режимов // Sub addresses #define TDA7439_input_sel 0x00 #define TDA7439_input_gain 0x01 #define TDA7439_volume 0x02 #define TDA7439_bass 0x03 #define TDA7439_middle 0x04 #define TDA7439_trebble 0x05 // Балансе #define TDA7439_ratt 0x06 #define TDA7439_latt 0x07 // Input selection #define TDA7439_input_1 0x03 #define TDA7439_input_2 0x02 #define TDA7439_input_3 0x01 #define TDA7439_input_4 0x00 //TDA7439 volume (-db) //0x00 -> 0x2F (0 - 47) #define TDA7439_mute 0x38 // Mute main volume void setup() { Wire.begin(); } void loop() { // Установка уровней setSnd(3, 1); // Bass (-7 - 7) setSnd(3, 2); // Midle (-7 - 7) setSnd(5, 3); // High (-7 - 7) setInput(4); // выбор входа (1-4) setVolume(30); // громкость (0-48), 0 Mute inputGain(2); // Предусиление, лучше выше 5 не ставить (0-30), 0 Mute spkAtt(0); // SPEAKER ATTENUATE SELECTION (0 dB) } void setInput(int input) { switch (input) { case 1: input = TDA7439_input_1; break; case 2: input = TDA7439_input_2; break; case 3: input = TDA7439_input_3; break; case 4: input = TDA7439_input_4; break; } writeWire(TDA7439_input_sel, input); } void inputGain(int gain) { writeWire(TDA7439_input_gain, gain); } void setVolume(int volume) { if (volume == 0) { volume = TDA7439_mute; } else { volume = 48 - volume; } writeWire(TDA7439_volume, volume); } void setSnd(int val, int range) { switch (range) { case 1: range = TDA7439_bass; break; case 2: range = TDA7439_middle; break; case 3: range = TDA7439_trebble; break; } switch (val) { case -7: val = 0; break; case -6: val = 1; break; case -5: val = 2; break; case -4: val = 3; break; case -3: val = 4; break; case -2: val = 5; break; case -1: val = 6; break; case 0 : val = 7; break; case 1 : val = 14; break; case 2 : val = 13; break; case 3 : val = 12; break; case 4 : val = 11; break; case 5 : val = 10; break; case 6 : val = 9; break; case 7 : val = 8; break; } writeWire(range, val); } void mute() { writeWire(TDA7439_volume, TDA7439_mute); } void spkAtt(int att) { // Mainly used to override the default attenuation of mute at power up // can be used for balance with some simple code changes here. writeWire(TDA7439_ratt, att); writeWire(TDA7439_latt, att); } void writeWire(char a, char b) { Wire.beginTransmission(TDA7439_address); Wire.write (a); Wire.write (b); Wire.endTransmission(); } Вполне себе неплохой бюджетный аудипроцессор с функцией темброблока, селектора входов.
Чтобы не создавать новую тему напишу здесь. Тоже решил взять за основу tda7439, делать стал по этому проекту https://www.instructables.com/id/Arduino-Powered-Gainclone-amplifier/ Почему то нет реакции на вращение энкодера, на нажатие кнопки срабатывает, пульт привязал. Кому не сложно посмотрите код, почему энкодер не реагирует