More readable TLV320 Lib

Dependents:   TalkThrough

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
+}
+
+
+
+