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;
}
}
}