More readable TLV320 Lib
Diff: TLV320HL.cpp
- Revision:
- 0:808bb0b9cf45
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/TLV320HL.cpp Wed Oct 22 09:23:47 2014 +0000 @@ -0,0 +1,230 @@ + +#include "mbed.h" +#include "TLV320HL.h" + + +TLV320::TLV320(PinName sda, PinName scl, int addr, I2SSlave* aI2S) +: mAddr(addr), mI2c_(sda, scl) +{ + mI2S = aI2S; +} + +void TLV320::Init(int aFrequ) +{ + mI2c_.frequency(100000); + reset(); //TLV resets + wait_ms(100); + power(true); + // power(0x07); Power Up the TLV320, but not the MIC, ADC and LINE + format(16, STEREO); //16Bit I2S protocol format, STEREO + frequency(aFrequ); //Default sample frequency is 44.1kHz + bypass(false); //Do not bypass device + mute(false); //Not muted + activateDigitalInterface_(); //The digital part of the chip is active + // outputVolume(0.7, 0.7); //Headphone volume to the default state + inputVolume(1,1); + outputVolume(0.92,0.92); +} + + +// Returns: int 0 (success), -1 (value out of range) +int TLV320::inputVolume(float leftVolumeIn, float rightVolumeIn) +{ + //check values are in range + if((leftVolumeIn < 0.0)||leftVolumeIn > 1.0) return -1; + if((rightVolumeIn < 0.0)||rightVolumeIn > 1.0) return -1; + //convert float to encoded char + char left = (char)31*leftVolumeIn; + char right = (char)31*rightVolumeIn; + //Left Channel + cmd[1] = left | (0 << 7); //set volume + cmd[0] = LEFT_LINE_INPUT_CHANNEL_VOLUME_CONTROL; //set address + mI2c_.write(mAddr, cmd, 2); //send + //Right Channel + cmd[1] = right | (0 << 7); //set volume + cmd[0] = RIGHT_LINE_INPUT_CHANNEL_VOLUME_CONTROL; //set address + mI2c_.write(mAddr, cmd, 2); //send + return 0; +} + + +// Description: Set headphone (line out) volume for left an right channels +// Returns: int 0 (success), -1 (value out of range) +int TLV320::outputVolume(float leftVolumeOut, float rightVolumeOut) +{ + //check values are in range + if((leftVolumeOut < 0.0)||leftVolumeOut > 1.0) return -1; + if((rightVolumeOut < 0.0)||rightVolumeOut > 1.0) return -1; + //convert float to encoded char + char left = (char)(79*leftVolumeOut)+0x30; + char right = (char)(79*rightVolumeOut)+0x30; + //Left Channel + cmd[1] = left | (1 << 7); //set volume + cmd[0] = LEFT_CHANNEL_HEADPHONE_VOLUME_CONTROL; //set address + mI2c_.write(mAddr, cmd, 2); //send + //Right Channel + cmd[1] = right | (1 << 7); //set volume + cmd[0] = RIGHT_CHANNEL_HEADPHONE_VOLUME_CONTROL; //set address + mI2c_.write(mAddr, cmd, 2); //send + return 0; +} + + +// Description: Send TLV320 into bypass mode, i.e. connect input to output +void TLV320::bypass(bool bypassVar) +{ + if(bypassVar == true) + cmd[1] = (1 << 3) | (0 << 4) | (0 << 5);//bypass enabled, DAC disabled, sidetone insertion disabled + else + cmd[1] = (0 << 3) | (1 << 4); //bypass disabled, DAC enabled + cmd[1] |= (0 << 2); + cmd[0] = ANALOG_AUDIO_PATH_CONTROL; //set address + mI2c_.write(mAddr, cmd, 2); //send +} + + +// Send TLV320 into mute mode +void TLV320::mute(bool softMute) +{ + if(softMute == true) cmd[1] = 0x08; //set instruction to mute + else cmd[1] = 0x00; //set instruction to NOT mute + cmd[0] = DIGITAL_AUDIO_PATH_CONTROL; //set address + mI2c_.write(mAddr, cmd, 2); //send +} + + +// Switch TLV320 on/off +void TLV320::power(bool powerUp) +{ + if(powerUp == true) cmd[1] = 0x00; //everything on + else cmd[1] = 0xFF; //everything off + cmd[0] = POWER_DOWN_CONTROL; //set address + mI2c_.write(mAddr, cmd, 2); //send +} + + +// Switch on individual devices on TLV320 +void TLV320::power(int device) +{ + cmd[1] = (char)device; //set user defined commands + cmd[0] = POWER_DOWN_CONTROL; //set address + mI2c_.write(mAddr, cmd, 2); //send +} + + +void TLV320::format(char length, bool mode) +{ + char modeSet = (1 << 6); + modeSet |= (1 << 5); //swap left and right channels + switch (length) //input data into instruction byte + { + case 16: + cmd[1] = modeSet | 0x02; + break; + case 20: + cmd[1] = modeSet | 0x06; + break; + case 24: + cmd[1] = modeSet | 0x0A; + break; + case 32: + cmd[1] = modeSet | 0x0E; + break; + default: + break; + } + mI2S->format(length, mode); + cmd[0] = DIGITAL_AUDIO_INTERFACE_FORMAT; //set address + mI2c_.write(mAddr, cmd, 2); //send +} + + +int TLV320::frequency(int hz) +{ + char rate; + switch(hz){ + case 8000: + rate = 0x03; + break; + case 8021: + rate = 0x0B; + break; + case 32000: + rate = 0x06; + break; + case 44100: + rate = 0x08; + break; + case 48000: + rate = 0x00; + break; + case 88200: + rate = 0x0F; + break; + case 96000: + rate = 0x07; + break; + default: + return -1; + } + char clockInChar = (0 << 6); + // char clockModeChar = (1 << 0); + char clockModeChar = (0 << 0); // Kogler + + cmd[1] = (rate << 2) | clockInChar | clockModeChar; //input data into instruciton byte + cmd[0] = SAMPLE_RATE_CONTROL; //set address + mI2c_.write(mAddr, cmd, 2); //send + return 0; +} + + +void TLV320::reset(void) +{ + cmd[0] = RESET_REGISTER; //set address + cmd[1] = 0x00; //this resets the entire device + mI2c_.write(mAddr, cmd, 2); +} + +void TLV320::setSampleRate_(char rate, bool clockIn, bool clockMode, bool bOSR) +{ + char clockInChar; + char clockModeChar; + char baseOverSamplingRate; + if(bOSR){ + baseOverSamplingRate = (1 << 0); + } else { + baseOverSamplingRate = (0 << 0); + } + if(clockIn){ + clockInChar = (1 << 6); + } else { + clockInChar = (0 << 6); + } + if(clockMode){ + clockModeChar = 0x01; + } else { + clockModeChar = 0x00; + } + cmd[1] = (rate << 2) | clockInChar | clockModeChar | baseOverSamplingRate; //input data into instruciton byte + cmd[0] = SAMPLE_RATE_CONTROL; // set address + mI2c_.write(mAddr, cmd, 2); // send +} + + +void TLV320::activateDigitalInterface_(void) +{ + cmd[1] = 0x01; //Activate + cmd[0] = DIGITAL_INTERFACE_ACTIVATION; //set address + mI2c_.write(mAddr, cmd, 2); //send +} + +void TLV320::deactivateDigitalInterface_(void) +{ + cmd[1] = 0x00; //Deactivate + cmd[0] = DIGITAL_INTERFACE_ACTIVATION; //set address + mI2c_.write(mAddr, cmd, 2); //send +} + + + +