More readable TLV320 Lib
TLV320HL.cpp@0:808bb0b9cf45, 2014-10-22 (annotated)
- Committer:
- hollegha
- Date:
- Wed Oct 22 09:23:47 2014 +0000
- Revision:
- 0:808bb0b9cf45
More readable TLV320-Lib
Who changed what in which revision?
User | Revision | Line number | New 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 |