#include #include #include #include #define CS8416_ADDRESS 0x20 #define TAS5076_ADDRESS 0x36 #define I2C_WRITE 0 #define I2C_READ 1 unsigned char I2CWrite(unsigned char address, unsigned char subaddress, unsigned char writevalue) { unsigned char cnt; unsigned char var; char err; SWStartI2C(); var = SWWriteI2C(address + I2C_WRITE); SWAckI2C(); var = SWWriteI2C(subaddress); // word address SWAckI2C(); var = SWWriteI2C(writevalue); // data SWAckI2C(); SWStopI2C(); } unsigned char I2CRead(unsigned char address, unsigned char subaddress) { unsigned char cnt; unsigned char var; char err; SWStartI2C(); var = SWWriteI2C(address + I2C_WRITE); SWAckI2C(); var = SWWriteI2C(subaddress); // word address SWAckI2C(); SWRestartI2C(); var = SWWriteI2C(address + I2C_READ); SWAckI2C(); var = SWReadI2C(); SWNotAckI2C(); SWStopI2C(); return var; } int ADresult; unsigned char CurrentVol; unsigned char PrevVol; void main (void) { char WriteData; char currentch; int i=0; Delay100TCYx(10); CurrentVol = 0xFF; PrevVol = 0xFF; TRISAbits.TRISA2 = 0; //MUTE PORTAbits.RA2 = 0; TRISBbits.TRISB0 = 1; INTCON2bits.NOT_RBPU = 0; //CS8416 //Serial Audio Format = 1 0 00 0 1 0 1 (I2S 24bit) WriteData = 0x85; //I2S I2CWrite(CS8416_ADDRESS, 0x05, WriteData); //Set channel = 1 currentch = 1; WriteData = 0x80 + currentch * 8 + currentch; I2CWrite(CS8416_ADDRESS, 0x04, WriteData); //Setup TAS5076 //Enable Factory PLL trim WriteData = 0x00; I2CWrite(TAS5076_ADDRESS, 0x1B, WriteData); WriteData = 0x40; //all channel ON 0000 0000 I2CWrite(TAS5076_ADDRESS, 0x05, WriteData); WriteData = 0x00; //all channel ON 0000 0000 I2CWrite(TAS5076_ADDRESS, 0x05, WriteData); WriteData = 0xC0; //set master volume adequate I2CWrite(TAS5076_ADDRESS, 0x07, WriteData); //UNMUTE PORTAbits.RA2 = 1; while(1) { Delay100TCYx(5); OpenADC( 0b10100111, 0b00000001, 0b01111110 ); Delay100TCYx(5); //Read Volume ConvertADC(); while( BusyADC() ); ADresult = ReadADC(); CloseADC(); CurrentVol = 0xFF - (ADresult>>2); if ((PrevVol < (CurrentVol - 0x03)) || (CurrentVol + 0x03 < PrevVol) ) { WriteData = CurrentVol; //set master volume adequate I2CWrite(TAS5076_ADDRESS, 0x07, WriteData); PrevVol = CurrentVol; //record volume } //Check Opt or Coax if (PORTBbits.RB0 == 0) // COAX, 3 { if (currentch == 1) { currentch = 3; WriteData = 0x80 + currentch * 8 + currentch; I2CWrite(CS8416_ADDRESS, 0x04, WriteData); } } else // OPT, 1 { if (currentch == 3) { currentch = 1; WriteData = 0x80 + currentch * 8 + currentch; I2CWrite(CS8416_ADDRESS, 0x04, WriteData); } } } }