using System; using Microsoft.SPOT; using Microsoft.SPOT.Hardware; namespace AudioControler { public class TDA7313 { private GHIElectronics.NETMF.Hardware.Emulation.SoftwareI2C _softI2C; private I2CDevice.Configuration _slaveConfig; bool _isSoftI2C = false; public enum AudioInput: int { Input1 = 0, Input2 = 1, Input3 = 10, // Input4 = 11 } public enum AudioGain: int { Gain_0db = 11, Gain_3_75db = 10, Gain_7_5db = 1, Gain_11_25db = 0 } private byte[] volume = { 0x00,0x01,0x02,0x03,0x04,0x05,0x06,0x07, /* 0 -- -8.75db */ 0x08,0x09,0x0a,0x0b,0x0c,0x0d,0x0e,0x0f, /*-10-- -18.75db */ 0x10,0x11,0x12,0x13,0x14,0x15,0x16,0x17, /*-20-- -28.75db */ 0x18,0x19,0x1a,0x1b,0x1c,0x1d,0x1e,0x1f, /*-30-- -38.75db */ 0x20,0x21,0x22,0x23,0x24,0x25,0x26,0x27, /*-40-- -48.75db */ 0x28,0x29,0x2a,0x2b,0x2c,0x2d,0x2e,0x2f, /*-50-- -58.75db */ 0x30,0x31,0x32,0x33,0x34,0x35,0x36,0x37, /*-60-- -68.75db */ 0x38,0x39,0x3a,0x3b,0x3c,0x3d,0x3e,0x3f, /*-70-- -78.75db */ }; private byte[] spLeftFront = { 0x80,0x81,0x82,0x83,0x84,0x85,0x86,0x87, /* 0 -- -8.75db */ 0x88,0x89,0x8a,0x8b,0x8c,0x8d,0x8e,0x8f, /* 10 -- -18.75db */ 0x90,0x91,0x92,0x93,0x94,0x95,0x96,0x97, /* 20 -- -28.75db */ 0x98,0x99,0x9a,0x9b,0x9c,0x9d,0x9e,0x9f /* 30 -- -38.75db */ }; private byte[] spRightFront = { 0xa0,0xa1,0xa2,0xa3,0xa4,0xa5,0xa6,0xa7, /* 0 -- -8.75db */ 0xa8,0xa9,0xaa,0xab,0xac,0xad,0xae,0xaf, /* 10 -- -18.75db */ 0xb0,0xb1,0xb2,0xb3,0xb4,0xb5,0xb6,0xb7, /* 20 -- -28.75db */ 0xb8,0xb9,0xba,0xbb,0xbc,0xbd,0xbe,0xbf /* 30 -- -38.75db */ }; private byte[] spLeftRear = { 0xc0,0xc1,0xc2,0xc3,0xc4,0xc5,0xc6,0xc7, /* 0 -- -8.75db */ 0xc8,0xc9,0xca,0xcb,0xcc,0xcd,0xce,0xcf, /* 10 -- -18.75db */ 0xd0,0xd1,0xd2,0xd3,0xd4,0xd5,0xd6,0xd7, /* 20 -- -28.75db */ 0xd8,0xd9,0xda,0xdb,0xdc,0xdd,0xde,0xdf /* 30 -- -38.75db */ }; private byte[] spRightRear = { 0xe0,0xe1,0xe2,0xe3,0xe4,0xe5,0xe6,0xe7, /* 0 -- -8.75db */ 0xe8,0xe9,0xea,0xeb,0xec,0xed,0xee,0xef, /* 10 -- -18.75db */ 0xf0,0xf1,0xf2,0xf3,0xf4,0xf5,0xf6,0xf7, /* 20 -- -28.75db */ 0xf8,0xf9,0xfa,0xfb,0xfc,0xfd,0xfe,0xff /* 30 -- -38.75db */ }; private byte[] bassControl = { 0x60, 0x61, 0x62, 0x63, 0x64, 0x65, 0x66, 0x6f, 0x6e, 0x6d, 0x6c, 0x6b, 0x6a, 0x69, 0x68 }; // -14dB to +14dB private byte[] trebleControl = { 0x70, 0x71, 0x72, 0x73, 0x74, 0x75, 0x76, 0x7f, 0x7e, 0x7d, 0x7c, 0x7b, 0x7a, 0x79, 0x78 }; // -14dB to +14dB /// /// Init TDA7313 in Normal I2C mode (hardware) /// public TDA7313() { _isSoftI2C = false; _slaveConfig = new I2CDevice.Configuration(0x44, 59); //0x44 7bit Chip address } /// /// Init TDA7313 in Emulated I2C mode (software) /// /// Digital I/O pin for SCL /// Digital I/O pin for SDZ public TDA7313(Cpu.Pin softSCLpin, Cpu.Pin softSDApin) { _isSoftI2C = true; InitSoft(softSCLpin, softSDApin); } private void InitSoft(Cpu.Pin SCLpin, Cpu.Pin SDApin) { _softI2C = new GHIElectronics.NETMF.Hardware.Emulation.SoftwareI2C(SCLpin, SDApin, 100); _softI2C.Transmit(true, false, 0x88); //Chip Address 8 bits _softI2C.Transmit(false, false, (byte)0x80); //Speaker Left Front 0dB _softI2C.Transmit(false, false, (byte)0xa0); //Speaker Right Front 0dB _softI2C.Transmit(false, false, (byte)0xc0); //Speaker Left Rear 0dB _softI2C.Transmit(false, false, (byte)0xe0); //Speaker Right Rear 0dB _softI2C.Transmit(false, false, (byte)0x3f); //Volume -78,5 dB (silent) // _softI2C.Transmit(false, false, (byte)0x00); //Volume 0 dB (full volume) _softI2C.Transmit(false, false, (byte)0x5c); // Input 1, Gain: 0dB, No loudness } private void InitHw() { hwI2C(0x88); //Chip Address 8 bits hwI2C((byte)0x80); //Speaker Left Front 0dB hwI2C((byte)0xa0); //Speaker Right Front 0dB hwI2C((byte)0xc0); //Speaker Left Rear 0dB hwI2C((byte)0xe0); //Speaker Right Rear 0dB hwI2C((byte)0x3f); //Volume -78,5 dB (silent) //hwI2C((byte)0x00); //Volume 0 dB (full volume) hwI2C((byte)0x5c); // Input 1, Gain: 0dB, No loudness } /// /// Set Audiosource /// /// Input 1-3 /// Audio Gain, 0 to +11.25dB in four steps /// Use loudness filter public void SetInput(AudioInput inp, AudioGain gain, bool loudness) { string _loud = "1"; if(loudness) _loud = "0"; string _binStr = "010" + FillZero((int)gain, 2) + _loud + FillZero((int)inp, 2); _binStr = FillZero(_binStr, 8); if (_isSoftI2C) { _softI2C.Transmit(false, false, ConvertString2Byte(_binStr)); } else { hwI2C(ConvertString2Byte(_binStr)); } } /// /// Main Volume Control. 0dB to -78,5dB regulated in 1.25dB steps (64 steps) /// /// Volume in procent. 0 = silent, 100 = full volume. public void SetVolumeMain(double proc) { double _vol = 63 * (proc / 100); int _volIndex = 63 - ((int)_vol); if (_isSoftI2C) { _softI2C.Transmit(false, false, (byte)volume[_volIndex]); } else { hwI2C((byte)volume[_volIndex]); } } /// /// Speaker Left Front Volume. 0dB to -38,5dB regulated in 1.25dB steps (32 steps) /// /// Volume in procent. 0 = silent, 100 = full volume. public void SetSpeakerLeftFrontVolume(double proc) { double _vol = 31 * (proc / 100); int _volIndex = 31 - ((int)_vol); if (_isSoftI2C) _softI2C.Transmit(false, false, (byte)spLeftFront[_volIndex]); else hwI2C((byte)spLeftFront[_volIndex]); } /// /// Speaker Right Front Volume. 0dB to -38,5dB regulated in 1.25dB steps (32 steps) /// /// Volume in procent. 0 = silent, 100 = full volume. public void SetSpeakerRightFrontVolume(double proc) { double _vol = 31 * (proc / 100); int _volIndex = 31 - ((int)_vol); if (_isSoftI2C) _softI2C.Transmit(false, false, (byte)spRightFront[_volIndex]); else hwI2C((byte)spRightFront[_volIndex]); } /// /// Speaker Left Rear Volume. 0dB to -38,5dB regulated in 1.25dB steps (32 steps) /// /// Volume in procent. 0 = silent, 100 = full volume. public void SetSpeakerLeftRearVolume(double proc) { double _vol = 31 * (proc / 100); int _volIndex = 31 - ((int)_vol); if (_isSoftI2C) _softI2C.Transmit(false, false, (byte)spLeftRear[_volIndex]); else hwI2C((byte)spLeftRear[_volIndex]); } /// /// Speaker Right Rear Volume. 0dB to -38,5dB regulated in 1.25dB steps (32 steps) /// /// Volume in procent. 0 = silent, 100 = full volume. public void SetSpeakerRightRearVolume(double proc) { double _vol = 31 * (proc / 100); int _volIndex = 31 - ((int)_vol); if (_isSoftI2C) _softI2C.Transmit(false, false, (byte)spRightRear[_volIndex]); else hwI2C((byte)spRightRear[_volIndex]); } /// /// Set Treble -14dB to +14dB in 2dB steps /// /// -7 = -14dB, 0 = 0dB, 7 = +14dB public void SetTreble(int val) { int _index = val + 7; if (_index < 0) _index = 0; if (_index > 14) _index = 14; Debug.Print("treble _Index: " + _index); if (_isSoftI2C) _softI2C.Transmit(false, false, (byte)trebleControl[_index]); else hwI2C((byte)trebleControl[_index]); } /// /// Set Bass -14dB to +14dB in 2dB steps /// /// -7 = -14dB, 0 = 0dB, 7 = +14dB public void SetBass(int val) { int _index = val + 7; if (_index < 0) _index = 0; if (_index > 14) _index = 14; Debug.Print("Bass _index: " + _index); if (_isSoftI2C) _softI2C.Transmit(false, false, (byte)bassControl[_index]); else hwI2C((byte)bassControl[_index]); } private void hwI2C(byte data) { I2CBus.GetInstance().Write(_slaveConfig, new byte[] { data }, 1000); } #region Utils public string FillZero(int Number, int Digits) { return FillZero(Number.ToString(), Digits); } public string FillZero(string Number, int Digits) { char _char = '0'; for (int i = Number.Length; i < Digits; ++i) { Number = _char + Number; } return Number; } #region ConvertString2Byte private byte ConvertString2Byte(string strByte) { switch(strByte) { case "00000000": return 0X00; case "00000001": return 0X01; case "00000010": return 0X02; case "00000011": return 0X03; case "00000100": return 0X04; case "00000101": return 0X05; case "00000110": return 0X06; case "00000111": return 0X07; case "00001000": return 0X08; case "00001001": return 0X09; case "00001010": return 0X0A; case "00001011": return 0X0B; case "00001100": return 0X0C; case "00001101": return 0X0D; case "00001110": return 0X0E; case "00001111": return 0X0F; case "00010000": return 0X10; case "00010001": return 0X11; case "00010010": return 0X12; case "00010011": return 0X13; case "00010100": return 0X14; case "00010101": return 0X15; case "00010110": return 0X16; case "00010111": return 0X17; case "00011000": return 0X18; case "00011001": return 0X19; case "00011010": return 0X1A; case "00011011": return 0X1B; case "00011100": return 0X1C; case "00011101": return 0X1D; case "00011110": return 0X1E; case "00011111": return 0X1F; case "00100000": return 0X20; case "00100001": return 0X21; case "00100010": return 0X22; case "00100011": return 0X23; case "00100100": return 0X24; case "00100101": return 0X25; case "00100110": return 0X26; case "00100111": return 0X27; case "00101000": return 0X28; case "00101001": return 0X29; case "00101010": return 0X2A; case "00101011": return 0X2B; case "00101100": return 0X2C; case "00101101": return 0X2D; case "00101110": return 0X2E; case "00101111": return 0X2F; case "00110000": return 0X30; case "00110001": return 0X31; case "00110010": return 0X32; case "00110011": return 0X33; case "00110100": return 0X34; case "00110101": return 0X35; case "00110110": return 0X36; case "00110111": return 0X37; case "00111000": return 0X38; case "00111001": return 0X39; case "00111010": return 0X3A; case "00111011": return 0X3B; case "00111100": return 0X3C; case "00111101": return 0X3D; case "00111110": return 0X3E; case "00111111": return 0X3F; case "01000000": return 0X40; case "01000001": return 0X41; case "01000010": return 0X42; case "01000011": return 0X43; case "01000100": return 0X44; case "01000101": return 0X45; case "01000110": return 0X46; case "01000111": return 0X47; case "01001000": return 0X48; case "01001001": return 0X49; case "01001010": return 0X4A; case "01001011": return 0X4B; case "01001100": return 0X4C; case "01001101": return 0X4D; case "01001110": return 0X4E; case "01001111": return 0X4F; case "01010000": return 0X50; case "01010001": return 0X51; case "01010010": return 0X52; case "01010011": return 0X53; case "01010100": return 0X54; case "01010101": return 0X55; case "01010110": return 0X56; case "01010111": return 0X57; case "01011000": return 0X58; case "01011001": return 0X59; case "01011010": return 0X5A; case "01011011": return 0X5B; case "01011100": return 0X5C; case "01011101": return 0X5D; case "01011110": return 0X5E; case "01011111": return 0X5F; case "01100000": return 0X60; case "01100001": return 0X61; case "01100010": return 0X62; case "01100011": return 0X63; case "01100100": return 0X64; case "01100101": return 0X65; case "01100110": return 0X66; case "01100111": return 0X67; case "01101000": return 0X68; case "01101001": return 0X69; case "01101010": return 0X6A; case "01101011": return 0X6B; case "01101100": return 0X6C; case "01101101": return 0X6D; case "01101110": return 0X6E; case "01101111": return 0X6F; case "01110000": return 0X70; case "01110001": return 0X71; case "01110010": return 0X72; case "01110011": return 0X73; case "01110100": return 0X74; case "01110101": return 0X75; case "01110110": return 0X76; case "01110111": return 0X77; case "01111000": return 0X78; case "01111001": return 0X79; case "01111010": return 0X7A; case "01111011": return 0X7B; case "01111100": return 0X7C; case "01111101": return 0X7D; case "01111110": return 0X7E; case "01111111": return 0X7F; case "10000000": return 0X80; case "10000001": return 0X81; case "10000010": return 0X82; case "10000011": return 0X83; case "10000100": return 0X84; case "10000101": return 0X85; case "10000110": return 0X86; case "10000111": return 0X87; case "10001000": return 0X88; case "10001001": return 0X89; case "10001010": return 0X8A; case "10001011": return 0X8B; case "10001100": return 0X8C; case "10001101": return 0X8D; case "10001110": return 0X8E; case "10001111": return 0X8F; case "10010000": return 0X90; case "10010001": return 0X91; case "10010010": return 0X92; case "10010011": return 0X93; case "10010100": return 0X94; case "10010101": return 0X95; case "10010110": return 0X96; case "10010111": return 0X97; case "10011000": return 0X98; case "10011001": return 0X99; case "10011010": return 0X9A; case "10011011": return 0X9B; case "10011100": return 0X9C; case "10011101": return 0X9D; case "10011110": return 0X9E; case "10011111": return 0X9F; case "10100000": return 0XA0; case "10100001": return 0XA1; case "10100010": return 0XA2; case "10100011": return 0XA3; case "10100100": return 0XA4; case "10100101": return 0XA5; case "10100110": return 0XA6; case "10100111": return 0XA7; case "10101000": return 0XA8; case "10101001": return 0XA9; case "10101010": return 0XAA; case "10101011": return 0XAB; case "10101100": return 0XAC; case "10101101": return 0XAD; case "10101110": return 0XAE; case "10101111": return 0XAF; case "10110000": return 0XB0; case "10110001": return 0XB1; case "10110010": return 0XB2; case "10110011": return 0XB3; case "10110100": return 0XB4; case "10110101": return 0XB5; case "10110110": return 0XB6; case "10110111": return 0XB7; case "10111000": return 0XB8; case "10111001": return 0XB9; case "10111010": return 0XBA; case "10111011": return 0XBB; case "10111100": return 0XBC; case "10111101": return 0XBD; case "10111110": return 0XBE; case "10111111": return 0XBF; case "11000000": return 0XC0; case "11000001": return 0XC1; case "11000010": return 0XC2; case "11000011": return 0XC3; case "11000100": return 0XC4; case "11000101": return 0XC5; case "11000110": return 0XC6; case "11000111": return 0XC7; case "11001000": return 0XC8; case "11001001": return 0XC9; case "11001010": return 0XCA; case "11001011": return 0XCB; case "11001100": return 0XCC; case "11001101": return 0XCD; case "11001110": return 0XCE; case "11001111": return 0XCF; case "11010000": return 0XD0; case "11010001": return 0XD1; case "11010010": return 0XD2; case "11010011": return 0XD3; case "11010100": return 0XD4; case "11010101": return 0XD5; case "11010110": return 0XD6; case "11010111": return 0XD7; case "11011000": return 0XD8; case "11011001": return 0XD9; case "11011010": return 0XDA; case "11011011": return 0XDB; case "11011100": return 0XDC; case "11011101": return 0XDD; case "11011110": return 0XDE; case "11011111": return 0XDF; case "11100000": return 0XE0; case "11100001": return 0XE1; case "11100010": return 0XE2; case "11100011": return 0XE3; case "11100100": return 0XE4; case "11100101": return 0XE5; case "11100110": return 0XE6; case "11100111": return 0XE7; case "11101000": return 0XE8; case "11101001": return 0XE9; case "11101010": return 0XEA; case "11101011": return 0XEB; case "11101100": return 0XEC; case "11101101": return 0XED; case "11101110": return 0XEE; case "11101111": return 0XEF; case "11110000": return 0XF0; case "11110001": return 0XF1; case "11110010": return 0XF2; case "11110011": return 0XF3; case "11110100": return 0XF4; case "11110101": return 0XF5; case "11110110": return 0XF6; case "11110111": return 0XF7; case "11111000": return 0XF8; case "11111001": return 0XF9; case "11111010": return 0XFA; case "11111011": return 0XFB; case "11111100": return 0XFC; case "11111101": return 0XFD; case "11111110": return 0XFE; case "11111111": return 0XFF; default: return 0x00; } } #endregion #endregion } }