More readable TLV320 Lib

Dependents:   TalkThrough

Committer:
hollegha
Date:
Wed Oct 22 09:23:47 2014 +0000
Revision:
0:808bb0b9cf45
More readable TLV320-Lib

Who changed what in which revision?

UserRevisionLine numberNew contents of line
hollegha 0:808bb0b9cf45 1
hollegha 0:808bb0b9cf45 2 #include "mbed.h"
hollegha 0:808bb0b9cf45 3 #include "TLV320HL.h"
hollegha 0:808bb0b9cf45 4
hollegha 0:808bb0b9cf45 5
hollegha 0:808bb0b9cf45 6 TLV320::TLV320(PinName sda, PinName scl, int addr, I2SSlave* aI2S)
hollegha 0:808bb0b9cf45 7 : mAddr(addr), mI2c_(sda, scl)
hollegha 0:808bb0b9cf45 8 {
hollegha 0:808bb0b9cf45 9 mI2S = aI2S;
hollegha 0:808bb0b9cf45 10 }
hollegha 0:808bb0b9cf45 11
hollegha 0:808bb0b9cf45 12 void TLV320::Init(int aFrequ)
hollegha 0:808bb0b9cf45 13 {
hollegha 0:808bb0b9cf45 14 mI2c_.frequency(100000);
hollegha 0:808bb0b9cf45 15 reset(); //TLV resets
hollegha 0:808bb0b9cf45 16 wait_ms(100);
hollegha 0:808bb0b9cf45 17 power(true);
hollegha 0:808bb0b9cf45 18 // power(0x07); Power Up the TLV320, but not the MIC, ADC and LINE
hollegha 0:808bb0b9cf45 19 format(16, STEREO); //16Bit I2S protocol format, STEREO
hollegha 0:808bb0b9cf45 20 frequency(aFrequ); //Default sample frequency is 44.1kHz
hollegha 0:808bb0b9cf45 21 bypass(false); //Do not bypass device
hollegha 0:808bb0b9cf45 22 mute(false); //Not muted
hollegha 0:808bb0b9cf45 23 activateDigitalInterface_(); //The digital part of the chip is active
hollegha 0:808bb0b9cf45 24 // outputVolume(0.7, 0.7); //Headphone volume to the default state
hollegha 0:808bb0b9cf45 25 inputVolume(1,1);
hollegha 0:808bb0b9cf45 26 outputVolume(0.92,0.92);
hollegha 0:808bb0b9cf45 27 }
hollegha 0:808bb0b9cf45 28
hollegha 0:808bb0b9cf45 29
hollegha 0:808bb0b9cf45 30 // Returns: int 0 (success), -1 (value out of range)
hollegha 0:808bb0b9cf45 31 int TLV320::inputVolume(float leftVolumeIn, float rightVolumeIn)
hollegha 0:808bb0b9cf45 32 {
hollegha 0:808bb0b9cf45 33 //check values are in range
hollegha 0:808bb0b9cf45 34 if((leftVolumeIn < 0.0)||leftVolumeIn > 1.0) return -1;
hollegha 0:808bb0b9cf45 35 if((rightVolumeIn < 0.0)||rightVolumeIn > 1.0) return -1;
hollegha 0:808bb0b9cf45 36 //convert float to encoded char
hollegha 0:808bb0b9cf45 37 char left = (char)31*leftVolumeIn;
hollegha 0:808bb0b9cf45 38 char right = (char)31*rightVolumeIn;
hollegha 0:808bb0b9cf45 39 //Left Channel
hollegha 0:808bb0b9cf45 40 cmd[1] = left | (0 << 7); //set volume
hollegha 0:808bb0b9cf45 41 cmd[0] = LEFT_LINE_INPUT_CHANNEL_VOLUME_CONTROL; //set address
hollegha 0:808bb0b9cf45 42 mI2c_.write(mAddr, cmd, 2); //send
hollegha 0:808bb0b9cf45 43 //Right Channel
hollegha 0:808bb0b9cf45 44 cmd[1] = right | (0 << 7); //set volume
hollegha 0:808bb0b9cf45 45 cmd[0] = RIGHT_LINE_INPUT_CHANNEL_VOLUME_CONTROL; //set address
hollegha 0:808bb0b9cf45 46 mI2c_.write(mAddr, cmd, 2); //send
hollegha 0:808bb0b9cf45 47 return 0;
hollegha 0:808bb0b9cf45 48 }
hollegha 0:808bb0b9cf45 49
hollegha 0:808bb0b9cf45 50
hollegha 0:808bb0b9cf45 51 // Description: Set headphone (line out) volume for left an right channels
hollegha 0:808bb0b9cf45 52 // Returns: int 0 (success), -1 (value out of range)
hollegha 0:808bb0b9cf45 53 int TLV320::outputVolume(float leftVolumeOut, float rightVolumeOut)
hollegha 0:808bb0b9cf45 54 {
hollegha 0:808bb0b9cf45 55 //check values are in range
hollegha 0:808bb0b9cf45 56 if((leftVolumeOut < 0.0)||leftVolumeOut > 1.0) return -1;
hollegha 0:808bb0b9cf45 57 if((rightVolumeOut < 0.0)||rightVolumeOut > 1.0) return -1;
hollegha 0:808bb0b9cf45 58 //convert float to encoded char
hollegha 0:808bb0b9cf45 59 char left = (char)(79*leftVolumeOut)+0x30;
hollegha 0:808bb0b9cf45 60 char right = (char)(79*rightVolumeOut)+0x30;
hollegha 0:808bb0b9cf45 61 //Left Channel
hollegha 0:808bb0b9cf45 62 cmd[1] = left | (1 << 7); //set volume
hollegha 0:808bb0b9cf45 63 cmd[0] = LEFT_CHANNEL_HEADPHONE_VOLUME_CONTROL; //set address
hollegha 0:808bb0b9cf45 64 mI2c_.write(mAddr, cmd, 2); //send
hollegha 0:808bb0b9cf45 65 //Right Channel
hollegha 0:808bb0b9cf45 66 cmd[1] = right | (1 << 7); //set volume
hollegha 0:808bb0b9cf45 67 cmd[0] = RIGHT_CHANNEL_HEADPHONE_VOLUME_CONTROL; //set address
hollegha 0:808bb0b9cf45 68 mI2c_.write(mAddr, cmd, 2); //send
hollegha 0:808bb0b9cf45 69 return 0;
hollegha 0:808bb0b9cf45 70 }
hollegha 0:808bb0b9cf45 71
hollegha 0:808bb0b9cf45 72
hollegha 0:808bb0b9cf45 73 // Description: Send TLV320 into bypass mode, i.e. connect input to output
hollegha 0:808bb0b9cf45 74 void TLV320::bypass(bool bypassVar)
hollegha 0:808bb0b9cf45 75 {
hollegha 0:808bb0b9cf45 76 if(bypassVar == true)
hollegha 0:808bb0b9cf45 77 cmd[1] = (1 << 3) | (0 << 4) | (0 << 5);//bypass enabled, DAC disabled, sidetone insertion disabled
hollegha 0:808bb0b9cf45 78 else
hollegha 0:808bb0b9cf45 79 cmd[1] = (0 << 3) | (1 << 4); //bypass disabled, DAC enabled
hollegha 0:808bb0b9cf45 80 cmd[1] |= (0 << 2);
hollegha 0:808bb0b9cf45 81 cmd[0] = ANALOG_AUDIO_PATH_CONTROL; //set address
hollegha 0:808bb0b9cf45 82 mI2c_.write(mAddr, cmd, 2); //send
hollegha 0:808bb0b9cf45 83 }
hollegha 0:808bb0b9cf45 84
hollegha 0:808bb0b9cf45 85
hollegha 0:808bb0b9cf45 86 // Send TLV320 into mute mode
hollegha 0:808bb0b9cf45 87 void TLV320::mute(bool softMute)
hollegha 0:808bb0b9cf45 88 {
hollegha 0:808bb0b9cf45 89 if(softMute == true) cmd[1] = 0x08; //set instruction to mute
hollegha 0:808bb0b9cf45 90 else cmd[1] = 0x00; //set instruction to NOT mute
hollegha 0:808bb0b9cf45 91 cmd[0] = DIGITAL_AUDIO_PATH_CONTROL; //set address
hollegha 0:808bb0b9cf45 92 mI2c_.write(mAddr, cmd, 2); //send
hollegha 0:808bb0b9cf45 93 }
hollegha 0:808bb0b9cf45 94
hollegha 0:808bb0b9cf45 95
hollegha 0:808bb0b9cf45 96 // Switch TLV320 on/off
hollegha 0:808bb0b9cf45 97 void TLV320::power(bool powerUp)
hollegha 0:808bb0b9cf45 98 {
hollegha 0:808bb0b9cf45 99 if(powerUp == true) cmd[1] = 0x00; //everything on
hollegha 0:808bb0b9cf45 100 else cmd[1] = 0xFF; //everything off
hollegha 0:808bb0b9cf45 101 cmd[0] = POWER_DOWN_CONTROL; //set address
hollegha 0:808bb0b9cf45 102 mI2c_.write(mAddr, cmd, 2); //send
hollegha 0:808bb0b9cf45 103 }
hollegha 0:808bb0b9cf45 104
hollegha 0:808bb0b9cf45 105
hollegha 0:808bb0b9cf45 106 // Switch on individual devices on TLV320
hollegha 0:808bb0b9cf45 107 void TLV320::power(int device)
hollegha 0:808bb0b9cf45 108 {
hollegha 0:808bb0b9cf45 109 cmd[1] = (char)device; //set user defined commands
hollegha 0:808bb0b9cf45 110 cmd[0] = POWER_DOWN_CONTROL; //set address
hollegha 0:808bb0b9cf45 111 mI2c_.write(mAddr, cmd, 2); //send
hollegha 0:808bb0b9cf45 112 }
hollegha 0:808bb0b9cf45 113
hollegha 0:808bb0b9cf45 114
hollegha 0:808bb0b9cf45 115 void TLV320::format(char length, bool mode)
hollegha 0:808bb0b9cf45 116 {
hollegha 0:808bb0b9cf45 117 char modeSet = (1 << 6);
hollegha 0:808bb0b9cf45 118 modeSet |= (1 << 5); //swap left and right channels
hollegha 0:808bb0b9cf45 119 switch (length) //input data into instruction byte
hollegha 0:808bb0b9cf45 120 {
hollegha 0:808bb0b9cf45 121 case 16:
hollegha 0:808bb0b9cf45 122 cmd[1] = modeSet | 0x02;
hollegha 0:808bb0b9cf45 123 break;
hollegha 0:808bb0b9cf45 124 case 20:
hollegha 0:808bb0b9cf45 125 cmd[1] = modeSet | 0x06;
hollegha 0:808bb0b9cf45 126 break;
hollegha 0:808bb0b9cf45 127 case 24:
hollegha 0:808bb0b9cf45 128 cmd[1] = modeSet | 0x0A;
hollegha 0:808bb0b9cf45 129 break;
hollegha 0:808bb0b9cf45 130 case 32:
hollegha 0:808bb0b9cf45 131 cmd[1] = modeSet | 0x0E;
hollegha 0:808bb0b9cf45 132 break;
hollegha 0:808bb0b9cf45 133 default:
hollegha 0:808bb0b9cf45 134 break;
hollegha 0:808bb0b9cf45 135 }
hollegha 0:808bb0b9cf45 136 mI2S->format(length, mode);
hollegha 0:808bb0b9cf45 137 cmd[0] = DIGITAL_AUDIO_INTERFACE_FORMAT; //set address
hollegha 0:808bb0b9cf45 138 mI2c_.write(mAddr, cmd, 2); //send
hollegha 0:808bb0b9cf45 139 }
hollegha 0:808bb0b9cf45 140
hollegha 0:808bb0b9cf45 141
hollegha 0:808bb0b9cf45 142 int TLV320::frequency(int hz)
hollegha 0:808bb0b9cf45 143 {
hollegha 0:808bb0b9cf45 144 char rate;
hollegha 0:808bb0b9cf45 145 switch(hz){
hollegha 0:808bb0b9cf45 146 case 8000:
hollegha 0:808bb0b9cf45 147 rate = 0x03;
hollegha 0:808bb0b9cf45 148 break;
hollegha 0:808bb0b9cf45 149 case 8021:
hollegha 0:808bb0b9cf45 150 rate = 0x0B;
hollegha 0:808bb0b9cf45 151 break;
hollegha 0:808bb0b9cf45 152 case 32000:
hollegha 0:808bb0b9cf45 153 rate = 0x06;
hollegha 0:808bb0b9cf45 154 break;
hollegha 0:808bb0b9cf45 155 case 44100:
hollegha 0:808bb0b9cf45 156 rate = 0x08;
hollegha 0:808bb0b9cf45 157 break;
hollegha 0:808bb0b9cf45 158 case 48000:
hollegha 0:808bb0b9cf45 159 rate = 0x00;
hollegha 0:808bb0b9cf45 160 break;
hollegha 0:808bb0b9cf45 161 case 88200:
hollegha 0:808bb0b9cf45 162 rate = 0x0F;
hollegha 0:808bb0b9cf45 163 break;
hollegha 0:808bb0b9cf45 164 case 96000:
hollegha 0:808bb0b9cf45 165 rate = 0x07;
hollegha 0:808bb0b9cf45 166 break;
hollegha 0:808bb0b9cf45 167 default:
hollegha 0:808bb0b9cf45 168 return -1;
hollegha 0:808bb0b9cf45 169 }
hollegha 0:808bb0b9cf45 170 char clockInChar = (0 << 6);
hollegha 0:808bb0b9cf45 171 // char clockModeChar = (1 << 0);
hollegha 0:808bb0b9cf45 172 char clockModeChar = (0 << 0); // Kogler
hollegha 0:808bb0b9cf45 173
hollegha 0:808bb0b9cf45 174 cmd[1] = (rate << 2) | clockInChar | clockModeChar; //input data into instruciton byte
hollegha 0:808bb0b9cf45 175 cmd[0] = SAMPLE_RATE_CONTROL; //set address
hollegha 0:808bb0b9cf45 176 mI2c_.write(mAddr, cmd, 2); //send
hollegha 0:808bb0b9cf45 177 return 0;
hollegha 0:808bb0b9cf45 178 }
hollegha 0:808bb0b9cf45 179
hollegha 0:808bb0b9cf45 180
hollegha 0:808bb0b9cf45 181 void TLV320::reset(void)
hollegha 0:808bb0b9cf45 182 {
hollegha 0:808bb0b9cf45 183 cmd[0] = RESET_REGISTER; //set address
hollegha 0:808bb0b9cf45 184 cmd[1] = 0x00; //this resets the entire device
hollegha 0:808bb0b9cf45 185 mI2c_.write(mAddr, cmd, 2);
hollegha 0:808bb0b9cf45 186 }
hollegha 0:808bb0b9cf45 187
hollegha 0:808bb0b9cf45 188 void TLV320::setSampleRate_(char rate, bool clockIn, bool clockMode, bool bOSR)
hollegha 0:808bb0b9cf45 189 {
hollegha 0:808bb0b9cf45 190 char clockInChar;
hollegha 0:808bb0b9cf45 191 char clockModeChar;
hollegha 0:808bb0b9cf45 192 char baseOverSamplingRate;
hollegha 0:808bb0b9cf45 193 if(bOSR){
hollegha 0:808bb0b9cf45 194 baseOverSamplingRate = (1 << 0);
hollegha 0:808bb0b9cf45 195 } else {
hollegha 0:808bb0b9cf45 196 baseOverSamplingRate = (0 << 0);
hollegha 0:808bb0b9cf45 197 }
hollegha 0:808bb0b9cf45 198 if(clockIn){
hollegha 0:808bb0b9cf45 199 clockInChar = (1 << 6);
hollegha 0:808bb0b9cf45 200 } else {
hollegha 0:808bb0b9cf45 201 clockInChar = (0 << 6);
hollegha 0:808bb0b9cf45 202 }
hollegha 0:808bb0b9cf45 203 if(clockMode){
hollegha 0:808bb0b9cf45 204 clockModeChar = 0x01;
hollegha 0:808bb0b9cf45 205 } else {
hollegha 0:808bb0b9cf45 206 clockModeChar = 0x00;
hollegha 0:808bb0b9cf45 207 }
hollegha 0:808bb0b9cf45 208 cmd[1] = (rate << 2) | clockInChar | clockModeChar | baseOverSamplingRate; //input data into instruciton byte
hollegha 0:808bb0b9cf45 209 cmd[0] = SAMPLE_RATE_CONTROL; // set address
hollegha 0:808bb0b9cf45 210 mI2c_.write(mAddr, cmd, 2); // send
hollegha 0:808bb0b9cf45 211 }
hollegha 0:808bb0b9cf45 212
hollegha 0:808bb0b9cf45 213
hollegha 0:808bb0b9cf45 214 void TLV320::activateDigitalInterface_(void)
hollegha 0:808bb0b9cf45 215 {
hollegha 0:808bb0b9cf45 216 cmd[1] = 0x01; //Activate
hollegha 0:808bb0b9cf45 217 cmd[0] = DIGITAL_INTERFACE_ACTIVATION; //set address
hollegha 0:808bb0b9cf45 218 mI2c_.write(mAddr, cmd, 2); //send
hollegha 0:808bb0b9cf45 219 }
hollegha 0:808bb0b9cf45 220
hollegha 0:808bb0b9cf45 221 void TLV320::deactivateDigitalInterface_(void)
hollegha 0:808bb0b9cf45 222 {
hollegha 0:808bb0b9cf45 223 cmd[1] = 0x00; //Deactivate
hollegha 0:808bb0b9cf45 224 cmd[0] = DIGITAL_INTERFACE_ACTIVATION; //set address
hollegha 0:808bb0b9cf45 225 mI2c_.write(mAddr, cmd, 2); //send
hollegha 0:808bb0b9cf45 226 }
hollegha 0:808bb0b9cf45 227
hollegha 0:808bb0b9cf45 228
hollegha 0:808bb0b9cf45 229
hollegha 0:808bb0b9cf45 230