TDA7439 Аудипроц

Тема в разделе "Arduino & Shields", создана пользователем Salk, 5 дек 2015.

  1. Salk

    Salk Гик

    Нужна консультация по подключению данного аудиопроцессора, самому запустить, увы, не получилось.
    Проц работает по 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 страницы указаны таблицы управления режимами.
    Огромное спасибо за любые советы и помощь :)
     
  2. 9xA59kK

    9xA59kK Гик

  3. Salk

    Salk Гик

    Да, смотрел, там код написан для 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
    таблица 1.jpg
    Код (C++):
    // Input selection
    #define TDA7439_input_1 0x03
    #define TDA7439_input_2 0x02
    #define TDA7439_input_3 0x01
    #define TDA7439_input_4 0x00
    таблица 2.jpg
    Честно, эти таблицы понять не могу и у меня вызывает затруднения в проверке правильности этих адресов.

    В отправке данных по I2c вроде бы все верно:
    Безымянный.jpg
    обращаемся к устройству по адресу 0х44 (Wire.beginTransmission(0x44) ), далее отправляем subadress того, что мы хотим изменить (Wire.write (a); ) и следом адрес того на "сколько" мы это хотим изменить (Wire.write (b); ), и заканчиваем передачу (Wire.endTransmission(); ).
    Быть уверенным бы наверняка, что адреса верны, и искать причину в чем-то другом. Посмотрите, пожалуйста :)
     
    Последнее редактирование: 6 дек 2015
  4. Salk

    Salk Гик

    Все сам да сам...
    Совсем не обратил внимания на таблицу: "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();
    }
    Вполне себе неплохой бюджетный аудипроцессор с функцией темброблока, селектора входов.
     
  5. veryaskin

    veryaskin Нуб

    Чтобы не создавать новую тему напишу здесь. Тоже решил взять за основу tda7439, делать стал по этому проекту https://www.instructables.com/id/Arduino-Powered-Gainclone-amplifier/
    Почему то нет реакции на вращение энкодера, на нажатие кнопки срабатывает, пульт привязал. Кому не сложно посмотрите код, почему энкодер не реагирует
     
  6. veryaskin

    veryaskin Нуб

    скетч
     

    Вложения: