comunication between main MCU and sound processor TDA7342 - tomaskovacik/audi_concert1_chorus1_volume_fix GitHub Wiki

datasheet: https://www.st.com/en/automotive-infotainment-and-telematics/tda7342.html

i2c comunication is described in datasheet, or in this function:

void decode_i2c(uint8_t data[howmanybytesinpacket]) {
  uint8_t increments = 1; //at least 1 iteration of next FOR must run...
  if (data[1] > 0xf) {
    //autoincrement of subaddress:
    //packet is subbadress+data, data[0] is packet size , so number of incrementation is "packet_size - 1"
    increments = data[0] - 1;
  }
  for (uint8_t i = 0; i < increments; i++) {
    uint8_t subaddress = (data[1] & 0xf) + i;//subbadress is always lower 4bits of 2nd field in array plus increment
    uint8_t c = data[i + 2];//0th byte -> size, 1st byte->subaddress
    //Serial.println(subaddress);
    switch (subaddress) {
      case 0:
        { // input selector

          Serial.print(F("Input selector: "));
          //Serial.print(c,HEX);
          //Serial.print(F(" ");
          switch (c & B0000111) {
            case 1:
              Serial.println(F("TAPE selected (IN2)"));
              break;
            case 2:
              Serial.println(F("FM / AM selected (IN1) "));
              break;
            case 3:
              Serial.println(F("TP selected (AM mono)"));
              break;

          }
          switch (c & B01000111) {
            case 0:
              Serial.println(F("CD selected (0dB diferential input gain (IN3))"));
              break;
            case 40:
              Serial.println(F("CD selected (-6dB diferential input gain (IN3))"));
              break;

          }
          switch (c & B00011000) {
            case 0:
              Serial.println(F("11.25dB gain"));
              break;
            case 1:
              Serial.println(F("7.5dB gain"));
              break;
            case 2:
              Serial.println(F("3.75dB gain"));
              break;
            case 3:
              Serial.println(F("0dB gain"));
              break;
          }
        }
        break;
      case 1:
        { // loudness
          Serial.print(F("Loudness: "));
          if (c > 0xf) {
            Serial.println(F("OFF"));
          } else {
            Serial.print(F(" - "));
            Serial.print(((c & 0xF) * 1.25), DEC);
            Serial.println(F("dB"));
          }
        }
        break;
      case 2:
        { // volume
          Serial.print(F("volume "));
          //          Serial.println(c);
          float _volume = 0;
          //          Serial.println((c & B00000011) * (-0.31));
          //          Serial.println(((c >> 2) & B00000111) * (-1.25));
          //          Serial.println(20 - (((c >> 5) & B00000111) * 10));
          _volume = (20 - (((c >> 5) & B00000111) * 10)) + (((c >> 2) & B00000111) * (-1.25)) + ((c & B00000011) * (-0.31));
          Serial.print(_volume);
          Serial.print(F("dB"));
          Serial.print(F(" ( "));
          Serial.print(c, HEX);
          Serial.println(F(" )"));
        }
        break;
      case 3: // bass, treble
        {
          Serial.print(F("Bass: "));
          //Bass
          switch (c >> 4) {
            case 0:
              Serial.print(-14);
              break;
            case 1:
              Serial.print(-12);
              break;
            case 2:
              Serial.print(-10);
              break;
            case 3:
              Serial.print(-8);
              break;
            case 4:
              Serial.print(-6);
              break;
            case 5:
              Serial.print(-4);
              break;
            case 6:
              Serial.print(-2);
              break;
            case 7:
            case 15:
              Serial.print(0);
              break;
            case 8:
              Serial.print(14);
              break;
            case 9:
              Serial.print(12);
              break;
            case 10:
              Serial.print(10);
              break;
            case 11:
              Serial.print(8);
              break;
            case 12:
              Serial.print(6);
              break;
            case 13:
              Serial.print(4);
              break;
            case 14:
              Serial.print(2);
              break;
          }
          Serial.print(F("dB, Trebble: "));
          //trebble
          switch (c & 0xF) {
            case 0:
              Serial.print(18);
              break;
            case 1:
              Serial.print(16);
              break;
            case 2:
              Serial.print(-10);
              break;
            case 3:
              Serial.print(-8);
              break;
            case 4:
              Serial.print(-6);
              break;
            case 5:
              Serial.print(-4);
              break;
            case 6:
              Serial.print(-2);
              break;
            case 7:
            case 15:
              Serial.print(0);
              break;
            case 8:
              Serial.print(14);
              break;
            case 9:
              Serial.print(12);
              break;
            case 10:
              Serial.print(10);
              break;
            case 11:
              Serial.print(8);
              break;
            case 12:
              Serial.print(6);
              break;
            case 13:
              Serial.print(4);
              break;
            case 14:
              Serial.print(2);
              break;
          }
          Serial.println(F("dB"));
        }
        break;
      case 4: // Speaker Attenuator left front
        Serial.print(F("Speaker Attenuator left front: "));
        spk_atten(c);
        break;
      case 5: // Speaker Attenuator left rear
        Serial.print(F("Speaker Attenuator left rear: "));
        spk_atten(c);
        break;
      case 6: // Speaker Attenuator right front
        Serial.print(F("Speaker Attenuator right front: "));
        spk_atten(c);
        break;
      case 7: // Speaker Attenuator left rear
        Serial.print(F("Speaker Attenuator left rear: "));
        spk_atten(c);
        break;
      case 8: // mute
        Serial.print(F("Mute: "));
        //0th and 1st bits
        switch (c & B00000011) {
          case 1:
            Serial.println(F("Soft Mute with fast slope (I = Imax)"));
            break;
          case 3:
            Serial.println(F("Soft Mute with slow slope (I = Imin)"));
            break;
        }
        //3th bit
        if ((c >> 3) & 1) Serial.println(F("Direct Mute"));
        //2nd and 4th bit
        if (!((c >> 5) & 1)) {
          Serial.print(F("Zero Crossing Mute "));
          if ((c >> 2) & 1) {
            Serial.println(F("On"));
          } else {
            Serial.println(F("Off"));
          }
        }
        //5th and 6th bit
        switch ((c >> 5) & B00000011) {
          case 0:
            Serial.println(F("160mV ZC Window Threshold (WIN = 00)"));
            break;
          case 1:
            Serial.println(F("80mV ZC Window Threshold (WIN = 01)"));
            break;
          case 2:
            Serial.println(F("40mV ZC Window Threshold (WIN = 10)"));
            break;
          case 3:
            Serial.println(F("20mV ZC Window Threshold (WIN = 11)"));
            break;
        }
        switch ((c >> 7) & B00000011) {
          case 0:
            Serial.println(F("Nonsymmetrical Bass Cut"));
            break;
          case 1:
            Serial.println(F("Symmetrical Bass Cut"));
            break;
        }
        break;
    }
  }
}