Use the TLV320 with in-built I2S object to stream audio data from an SD Card and send it to the TLV320 CODEC for audio playback
Dependencies: I2SSlave mbed TLV320
Revision 1:9ea0cc2fa567, committed 2011-08-05
- Comitter:
- d_worrall
- Date:
- Fri Aug 05 10:12:21 2011 +0000
- Parent:
- 0:3d6892f6384f
- Commit message:
- verison 2.0
Changed in this revision
diff -r 3d6892f6384f -r 9ea0cc2fa567 I2SSlave.lib --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/I2SSlave.lib Fri Aug 05 10:12:21 2011 +0000 @@ -0,0 +1,1 @@ +http://mbed.org/users/d_worrall/code/I2SSlave/#aa3e863920d2
diff -r 3d6892f6384f -r 9ea0cc2fa567 I2SSlave/I2SSlave.cpp --- a/I2SSlave/I2SSlave.cpp Fri Aug 05 10:07:47 2011 +0000 +++ /dev/null Thu Jan 01 00:00:00 1970 +0000 @@ -1,306 +0,0 @@ -/****************************************************** - * I2SSlave.cpp: I2S port abstraction library cpp file for NXP LPC1768 - * - * Written by: - * mbed Team - 15th July 2011 - * Daniel Worrall - * - * History - * version 1.31 -******************************************************/ -#include "I2SSlave.h" -/*Global Functions*/ -FunctionPointer akjnh3489v8ncv; - -extern "C" void I2S_IRQHandler(void){ //this is a very special function so can remain outside - akjnh3489v8ncv.call(); -} -/****************************************************** - * Function name: I2SSlave - * - * Description: class constructor - * - * Parameters: PinName tx_sda, PinName tx_ws, PinName clk, PinName rx_sda, PinName rx_ws - * Returns: none -******************************************************/ -//Constructor -I2SSlave::I2SSlave(PinName tx_sda, PinName tx_ws, PinName clk, PinName rx_sda, PinName rx_ws){ - storePins_(tx_sda, tx_ws, clk, rx_sda, rx_ws); - format(16, STEREO); //this also invokes initialize so no need to call it twice -} -//Public functions -/****************************************************** - * Function name: format() - * - * Description: sets the bit length for writing and stereo or mono mode - * - * Parameters: int bit, bool mode - * Returns: none -******************************************************/ -void I2SSlave::format(int bit, bool mode){ - bit_ = bit; - mode_ = mode; - initialize_(tx_sda_, tx_ws_, clk_, rx_sda_, rx_ws_); -} -/****************************************************** - * Function name: write() - * - * Description: load buffer to write to I2S port - * - * Parameters: long *buffer - * Returns: none -******************************************************/ -void I2SSlave::write(int* buffer, int from, int length){ - int to = from + length; - for(int i = from; i < to; ++i){ - LPC_I2S->I2STXFIFO = buffer[i]; - } -} -/****************************************************** - * Function name: start() - * - * Description: attach streamOut_ function to ticker interrupt - * - * Parameters: none - * Returns: none -******************************************************/ -void I2SSlave::start(int mode){ - switch(mode){ - case(0): - LPC_I2S->I2SIRQ |= (0 << 0); //disable receive interrupt - LPC_I2S->I2SIRQ |= (0 << 1); //disable transmit interrupt - break; - case(1): - LPC_I2S->I2SIRQ |= (0 << 0); //disable receive interrupt - LPC_I2S->I2SIRQ |= (1 << 1); //enable transmit interrupt - LPC_I2S->I2SIRQ |= (0 << 16); //set I2STXFIFO depth to 0 words - break; - case(2): - LPC_I2S->I2SIRQ |= (1 << 0); //enable receive interrupt - LPC_I2S->I2SIRQ |= (0 << 1); //disable transmit interrupt - LPC_I2S->I2SIRQ |= (4 << 8); //set I2SRXFIFO depth to 4 words - break; - case(3): - LPC_I2S->I2SIRQ |= (1 << 0); //enable receive interrupt - LPC_I2S->I2SIRQ |= (4 << 8); //set I2SRXFIFO depth to 4 words - LPC_I2S->I2SIRQ |= (1 << 1); //enable transmit interrupt - LPC_I2S->I2SIRQ |= (0 << 16); //set I2STXFIFO depth to 0 words - break; - default: - break; - } - NVIC_SetPriority(I2S_IRQn, 0); - NVIC_EnableIRQ(I2S_IRQn); //enable I2S interrupt in the NVIC -} -/****************************************************** - * Function name: stop() - * - * Description: detach streamOut_ from ticker - * - * Parameters: none - * Returns: none -******************************************************/ -void I2SSlave::stop(void){ - NVIC_DisableIRQ(I2S_IRQn); -} -/****************************************************** - * Function name: read() - * - * Description: reads FIFORX buffer into [int32_t rxBuffer[8]] - * - * Parameters: none - * Returns: none -******************************************************/ -void I2SSlave::read(void){ - rxBuffer[0] = LPC_I2S->I2SRXFIFO; - rxBuffer[1] = LPC_I2S->I2SRXFIFO; - rxBuffer[2] = LPC_I2S->I2SRXFIFO; - rxBuffer[3] = LPC_I2S->I2SRXFIFO; -} -/****************************************************** - * Function name: status_() - * - * Description: Read I2SSTATE register - * - * Parameters: none - * Returns: int -******************************************************/ -int I2SSlave::status(void){ - return LPC_I2S->I2SSTATE; -} -//Private functions -/****************************************************** - * Function name: initialize() - * - * Description: initialises I2S port - * - * Parameters: PinName tx_sda, PinName tx_ws, PinName clk, PinName rx_sda, PinName rx_ws - * Returns: 0 = successful initialisation - -1 = initialisation failure -******************************************************/ -int I2SSlave::initialize_(PinName tx_sda, PinName tx_ws, PinName clk, PinName rx_sda, PinName rx_ws){ - setPins_(tx_sda, tx_ws, clk, rx_sda, rx_ws); //designate pins - LPC_SC->PCONP |= (1 << 27); - //configure input/output register - format_(bit_, mode_); - //set mbed as SLAVE - LPC_I2S->I2SDAO |= (1 << 5); - LPC_I2S->I2SDAI |= (1 << 5); - //clock mode - setClocks_(4); - //set slave mode - modeConfig_(); - //set receiver mode - LPC_I2S->I2SRXMODE |= (1 << 1); - //slave mode - LPC_I2S->I2STXRATE = 0; - LPC_I2S->I2SRXRATE = 0; - //Start - LPC_I2S->I2SDAO |= (0 << 3); - LPC_I2S->I2SDAI |= (0 << 3); - LPC_I2S->I2SDAO |= (0 << 4); - LPC_I2S->I2SDAI |= (0 << 4); - LPC_I2S->I2SDAO |= (0 << 15); - return 0; -} -/****************************************************** - * Function name: setClocks_() - * - * Description: Set the division setting on the internal clocks - * - * Parameters: int divideBy - * Returns: nothing -******************************************************/ -void I2SSlave::setClocks_(int divideBy){ - switch(divideBy){ - case 1: - LPC_SC->PCLKSEL1 |= (1 << 22); - LPC_SC->PCLKSEL1 |= (0 << 23); - break; - case 2: - LPC_SC->PCLKSEL1 |= (0 << 22); - LPC_SC->PCLKSEL1 |= (1 << 23); - break; - case 4: - LPC_SC->PCLKSEL1 |= (0 << 22); - LPC_SC->PCLKSEL1 |= (0 << 23); - break; - case 8: - LPC_SC->PCLKSEL1 |= (1 << 22); - LPC_SC->PCLKSEL1 |= (1 << 23); - break; - default: - break; - } -} -/****************************************************** - * Function name: setPins_() - * - * Description: set external pin configuration - * - * Parameters: PinName tx_sda, PinName tx_ws, PinName clk, PinName rx_sda, PinName rx_ws - * Returns: none -******************************************************/ -void I2SSlave::setPins_(PinName tx_sda, PinName tx_ws, PinName clk, PinName rx_sda, PinName rx_ws){ - if(rx_ws == p29){ - LPC_PINCON->PINSEL0 |= (1 << 10); //set p29 as receive word select line - } else { - LPC_PINCON->PINSEL1 |= (2 << 16); //set p16 as receive word select line - } - if(rx_sda == p8){ - LPC_PINCON->PINSEL0 |= (1 << 12); //set p8 as receive serial data line - } else { - LPC_PINCON->PINSEL1 |= (2 << 18); //set p17 as receive serial data line - } - LPC_PINCON->PINSEL0 |= (1 << 14); //set p7 as transmit clock line (only one of these) - LPC_PINCON->PINSEL0 |= (1 << 16); //set p6 as word select line (only one of these) - LPC_PINCON->PINSEL0 |= (1 << 18); //set p5 as transmit serial data line (only one of these) - LPC_PINCON->PINSEL0 |= (0 << 8); //clear rx_clk -} -/****************************************************** - * Function name: format_() - * - * Description: sets the bit length for writing and stereo or mono mode - * - * Parameters: int bit, bool mode - * Returns: none -******************************************************/ -void I2SSlave::format_(int bit, bool mode){ - uint32_t bps= ((bit+1)*8)-1; - LPC_I2S->I2SDAO &= (0x00 << 6); - LPC_I2S->I2SDAO |= (bps << 6); - //set bit length - switch(bit){ - case 8: - LPC_I2S->I2SDAO &= 0xfffffffc; - break; - case 16: - LPC_I2S->I2SDAO &= (0 << 1); - LPC_I2S->I2SDAO |= (1 << 0); - break; - case 32: - LPC_I2S->I2SDAO &= (0 << 1); - LPC_I2S->I2SDAO |= (3 << 0); - break; - default: - break; - } - //set audio mode - if(mode == STEREO){ - LPC_I2S->I2SDAO |= (0 << 2); - } else { - LPC_I2S->I2SDAO |= (1 << 2); - } - //set transmitter and receiver setting to be the same - LPC_I2S->I2SDAI &= (0x00 << 6); - LPC_I2S->I2SDAI |= (bps << 6); - //set bit length - switch(bit){ - case 8: - LPC_I2S->I2SDAI &= 0xfffffffc; - break; - case 16: - LPC_I2S->I2SDAI &= (0 << 1); - LPC_I2S->I2SDAI |= (1 << 0); - break; - case 32: - LPC_I2S->I2SDAI &= (0 << 1); - LPC_I2S->I2SDAI |= (3 << 0); - break; - default: - break; - } - //set audio mode - if(mode == STEREO){ - LPC_I2S->I2SDAI |= (0 << 2); - } else { - LPC_I2S->I2SDAI |= (1 << 2); - } -} -/****************************************************** - * Function name: modeConfig_() - * - * Description: Set slave mode - * - * Parameters: none - * Returns: none -******************************************************/ -void I2SSlave::modeConfig_(void){ - LPC_I2S->I2STXMODE |= (0x0 << 0); - LPC_I2S->I2SRXMODE |= (0x0 << 0); -} -/****************************************************** - * Function name: storePins_() - * - * Description: set external pin configuration - * - * Parameters: PinName tx_sda, PinName tx_ws, PinName clk, PinName rx_sda, PinName rx_ws - * Returns: none -******************************************************/ -void I2SSlave::storePins_(PinName tx_sda, PinName tx_ws, PinName clk, PinName rx_sda, PinName rx_ws){ - tx_sda_ = tx_sda; - tx_ws_ = tx_ws; - clk_ = clk; - rx_sda_ = rx_sda; - rx_ws_ = rx_ws; -} \ No newline at end of file
diff -r 3d6892f6384f -r 9ea0cc2fa567 I2SSlave/I2SSlave.h --- a/I2SSlave/I2SSlave.h Fri Aug 05 10:07:47 2011 +0000 +++ /dev/null Thu Jan 01 00:00:00 1970 +0000 @@ -1,170 +0,0 @@ -/****************************************************** - * I2SSlave.h: I2S port abstraction library header file for NXP LPC1768 - * - * Written by: - * mbed Team - 15th July 2011 - * Daniel Worrall - * - * History - * version 1.31 -******************************************************/ - -#include "mbed.h" -#include "math.h" - -#ifndef __MBED_I2SSLAVE_H__ -#define __MBED_I2SSLAVE_H__ - -/** I2S class defined on the LPC1768 port - * - */ -extern FunctionPointer akjnh3489v8ncv; -class I2SSlave{ - - public: - //Constructor - /** Create an I2S object - * - * @param tx_sda Transmitter serial data line - * @param tx_ws Transmitter word select line - * @param clk Shared transmitter/receiver clock line - * @param rx_sda Receiver serial data line - * @param rx_ws Receiver word select line - */ - I2SSlave(PinName tx_sda, PinName tx_ws, PinName clk, PinName rx_sda, PinName rx_ws); - /** Set the data transmission format - * - * @param bit Set the number of bits per write - * @param mode Set STEREO (0) or MONO (1) mode - */ - void format(int bit, bool mode); - /** Write a buffer to the I2S port - * - * @param buffer Address of buffer to pass to I2S port - * @param from Start position in buffer to read from - * @param length Length of buffer (MUST not exceed 8 words, each 32 bits long) - * - * Note: sending 8 words to the TXFIFO will trigger an interrupt! - */ - void write(int* buffer, int from, int length); - /** Activate I2S port for data streaming - * - * @param mode Mode to enable - NONE, TRANSMIT only, RECEIVE only, BOTH - * Enables tx/rx interrupts - */ - void start(int mode); - /** Deactivate I2S port from data streaming - * - * Disable all interrupts - */ - void stop(void); - /** Load receive FIFO data into receiver buffer - * - */ - void read(void); - /** Attach a void/void function or void/void static memeber function to an interrupt generated by the I2SxxFIFOs - * - * @param function Function to attach - * - * e.g. myI2sObject.attach(&myfunction); - * OR myI2sObject.attach(&myClass::myStaticMemberFunction); - */ - void attach(void(*fptr)(void)){ - akjnh3489v8ncv.attach(fptr); - } - /** Attach a nonstatic void/void member function to an interrupt generated by the I2SxxFIFOs - * - * @param tptr Object pointer - * @param mptr Member function pointer - * - * e.g. myI2sObject.attach(&myObject, &myClass::myNonstaticMemberFunction); where myObject is an object of myClass - */ - template<typename T> - void attach(T *tptr, void(T::*mptr)(void)){ - akjnh3489v8ncv.attach(tptr, mptr); - } - /** Return contents of I2S status register - * - * @returns Content of I2SSTATE register - * - * bit0: receive/transmit interrupt active - * bit1: receive/transmit DMA request 1 - * bit2: receive/transmit DMA request 2 - * bit[11:8]: receive FIFO level - * bit[19:16]: transmit FIFO level - */ - int status(void); - - //Receiver buffer - int rxBuffer[4]; - //defines - #define STEREO 0 - #define MONO 1 - - #define I2SFIFO_EMPTY 0 - #define I2SFIFO_FULL 8 - - #define RAM_LENGTH 1024 - #define RAM_LIMIT (RAM_LENGTH - 1) - #define PTR_MAX ((RAM_LENGTH / 8) - 1) - - #define NONE 0 - #define TRANSMIT 1 - #define RECEIVE 2 - #define BOTH 3 - - private: - /** I2S intitalize function - * - * @param tx_sda Transmitter serial data line - * @param tx_ws Transmitter word select line - * @param clk Shared transmitter/receiver clock line - * @param rx_sda Receiver serial data line - * @param rx_ws Receiver word select line - * @return Returns 0 for successful initialisation, -1 for an error - */ - int initialize_(PinName tx_sda, PinName tx_ws, PinName clk, PinName rx_sda, PinName rx_ws); - /** Set internal clock divide by rate - * - * @param divideBy Divide by 1, 2, 4 or 8 - */ - void setClocks_(int divideBy); - /** Set up the pins on the processor itself - * - * @param tx_sda Transmitter serial data line - * @param tx_ws Transmitter word select line - * @param clk Shared transmitter/receiver clock line - * @param rx_sda Receiver serial data line - * @param rx_ws Receiver word select line - */ - void setPins_(PinName tx_sda, PinName tx_ws, PinName clk, PinName rx_sda, PinName rx_ws); - /** Set the data transmission format - * - * @param bit Set the number of bits per write - * @param mode Set STEREO (0) or MONO (1) mode - */ - void format_(int bit, bool mode); - /** Set slave mode - * - */ - void modeConfig_(void); - /** Store PinName values - * - * @param tx_sda Transmitter serial data line - * @param tx_ws Transmitter word select line - * @param clk Shared transmitter/receiver clock line - * @param rx_sda Receiver serial data line - * @param rx_ws Receiver word select line - */ - void storePins_(PinName tx_sda, PinName tx_ws, PinName clk, PinName rx_sda, PinName rx_ws); - //variables - int bit_; - bool mode_; - PinName tx_sda_; - PinName tx_ws_; - PinName clk_; - PinName rx_sda_; - PinName rx_ws_; -}; - -#endif /*__MBED_I2S_H__*/ \ No newline at end of file
diff -r 3d6892f6384f -r 9ea0cc2fa567 TLV320.lib --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/TLV320.lib Fri Aug 05 10:12:21 2011 +0000 @@ -0,0 +1,1 @@ +http://mbed.org/users/d_worrall/code/TLV320/#7e76c6f56169
diff -r 3d6892f6384f -r 9ea0cc2fa567 TLV320/TLV320.cpp --- a/TLV320/TLV320.cpp Fri Aug 05 10:07:47 2011 +0000 +++ /dev/null Thu Jan 01 00:00:00 1970 +0000 @@ -1,344 +0,0 @@ - /****************************************************** - * TLV320.cpp: Texas instruments TLV320AIC23B library NXP LPC1768 - * - * Written by: - * mbed Team - * Ioannis Kedros - 10th January 2011 - * (basic functionality incurred) - * Daniel Worrall - 15th July 2011 - * (I2SSlave implementation and API restructuring) - * - * History - * version 2.29 -******************************************************/ -#include "mbed.h" -#include "TLV320.h" - -TLV320::TLV320(PinName sda, PinName scl, int addr, PinName tx_sda, PinName tx_ws, PinName clk, PinName rx_sda, PinName rx_ws) - : mAddr(addr), mI2c_(sda, scl), mI2s_(tx_sda, tx_ws, clk, rx_sda, rx_ws){ - mI2c_.frequency(150000); - reset(); //TLV resets - power(0x07); //Power Up the TLV320, but not the MIC, ADC and LINE - format(16, STEREO); //16Bit I2S protocol format, STEREO - frequency(44100); //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.6, 0.6); //Headphone volume to the default state - rxBuffer = &mI2s_.rxBuffer[0]; -} -//Public Functions -/****************************************************** - * Function name: inputVolume() - * - * Description: set line in volume for left and right channels - * - * Parameters: float leftVolumeIn, float rightVolumeIn - * 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; -} -/****************************************************** - * Function name: outputVolume() - * - * Description: Set headphone (line out) volume for left an right channels - * - * Parameters: float leftVolumeOut, float rightVolumeOut - * 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; -} -/****************************************************** - * Function name: bypass() - * - * Description: Send TLV320 into bypass mode, i.e. connect input to output - * - * Parameters: bool bypassVar - * Returns: none -******************************************************/ -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 -} -/****************************************************** - * Function name: mute() - * - * Description: Send TLV320 into mute mode - * - * Parameters: bool softMute - * Returns: none -******************************************************/ -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 -} -/****************************************************** - * Function name: power() - * - * Description: Switch TLV320 on/off - * - * Parameters: bool powerUp - * Returns: none -******************************************************/ -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 -} -/****************************************************** - * Function name: power() - * - * Description: Switch on individual devices on TLV320 - * - * Parameters: int device - * Returns: none -******************************************************/ -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 -} -/****************************************************** - * Function name: format() - * - * Description: Set interface format - * - * Parameters: char length, bool mode - * Returns: none -******************************************************/ -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 -} -/****************************************************** - * Function name: frequency() - * - * Description: Set sample frequency - * - * Parameters: int hz - * Returns: int 0 (success), -1 (value not recognised) -******************************************************/ -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); - - 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; -} -/****************************************************** - * Function name: reset() - * - * Description: Reset TLV320 - * - * Parameters: none - * Returns: none -******************************************************/ -void TLV320::reset(void){ - cmd[0] = RESET_REGISTER; //set address - cmd[1] = 0x00; //this resets the entire device - mI2c_.write(mAddr, cmd, 2); -} -/****************************************************** - * Function name: start() - * - * Description: Enable interrupts on the I2S port - * - * Parameters: int mode - * Returns: none -******************************************************/ -void TLV320::start(int mode){ - mI2s_.start(mode); -} -/****************************************************** - * Function name: stop() - * - * Description: Disable interrupts on the I2S port - * - * Parameters: none - * Returns: none -******************************************************/ -void TLV320::stop(void){ - mI2s_.stop(); -} -/****************************************************** - * Function name: write() - * - * Description: Write (part of) a buffer to the I2S port - * - * Parameters: int *buffer, int from, int length - * Returns: none -******************************************************/ -void TLV320::write(int *buffer, int from, int length){ - mI2s_.write(buffer, from, length); -} -/****************************************************** - * Function name: read() - * - * Description: Place I2SRXFIFO in rxBuffer - * - * Parameters: none - * Returns: none -******************************************************/ -void TLV320::read(void){ - mI2s_.read(); -} -/****************************************************** - * Function name: attach() - * - * Description: Attach a void/void function or void/void static member function to IRQHandler - * - * Parameters: none - * Returns: none -******************************************************/ -void TLV320::attach(void(*fptr)(void)){ - mI2s_.attach(fptr); -} -//Private Functions -/****************************************************** - * Function name: setSampleRate_() - * - * Description: Clocking control - * - * Parameters: char rate, bool clockIn, bool clockMode, bool bOSR - * Returns: none -******************************************************/ -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 -} -/****************************************************** - * Function name: activateDigitalInterface_() - * - * Description: Activate digital part of chip - * - * Parameters: none - * Returns: none -******************************************************/ -void TLV320::activateDigitalInterface_(void){ - cmd[1] = 0x01; //Activate - cmd[0] = DIGITAL_INTERFACE_ACTIVATION; //set address - mI2c_.write(mAddr, cmd, 2); //send -} -/****************************************************** - * Function name: deactivateDigitalInterface_ - * - * Description: Deactivate digital part of chip - * - * Parameters: none - * Returns: none -******************************************************/ -//Digital interface deactivation -void TLV320::deactivateDigitalInterface_(void){ - cmd[1] = 0x00; //Deactivate - cmd[0] = DIGITAL_INTERFACE_ACTIVATION; //set address - mI2c_.write(mAddr, cmd, 2); //send -} -
diff -r 3d6892f6384f -r 9ea0cc2fa567 TLV320/TLV320.h --- a/TLV320/TLV320.h Fri Aug 05 10:07:47 2011 +0000 +++ /dev/null Thu Jan 01 00:00:00 1970 +0000 @@ -1,187 +0,0 @@ - /****************************************************** - * TLV320.h: Texas instruments TLV320AIC23B library NXP LPC1768 - * - * Written by: - * mbed Team - * Ioannis Kedros - 10th January 2011 - * (basic functionality incurred) - * Daniel Worrall - 15th July 2011 - * (I2SSlave implementation and API restructuring) - * - * History - * version 2.29 -******************************************************/ - -#ifndef MBED_TLV320_H -#define MBED_TLV320_H - -#include "mbed.h" -#include "I2SSlave.h" - -/** TLV320 class, defined on the I2C master bus -* -*/ - -class TLV320 -{ - public: - //constructor - /** Create a TLV320 object defined on the I2C port - * - * @param sda Serial data pin (p9 or p28) - * @param scl Serial clock pin (p10 or p27) - * @param addr Object address - */ - TLV320(PinName sda, PinName scl, int addr, PinName tx_sda, PinName tx_ws, PinName clk, PinName rx_sda, PinName rx_ws); - /** Power up/down - * - * @param powerUp 0 = power down, 1 = power up - */ - void power(bool powerUp); - /** Overloaded power() function - * - * @param device Call individual devices to power up/down - * Device power 0x00 = On 0x80 = Off - * Clock 0x00 = On 0x40 = Off - * Oscillator 0x00 = On 0x20 = Off - * Outputs 0x00 = On 0x10 = Off - * DAC 0x00 = On 0x08 = Off - * ADC 0x00 = On 0x04 = Off - * Microphone input 0x00 = On 0x02 = Off - * Line input 0x00 = On 0x01 = Off - */ - void power(int device); - /** Set I2S interface bit length and mode - * - * @param length Set bit length to 16, 20, 24 or 32 bits - * @param mode Set STEREO (0), MONO (1) - */ - void format(char length, bool mode); - /** Set sample frequency - * - * @param frequency Sample frequency of data in Hz - * @return Returns an integer 0 = success, -1 = unrecognnised frequency - * - * The TLV320 supports the following frequencies: 8kHz, 8.021kHz, 32kHz, 44.1kHz, 48kHz, 88.2kHz, 96kHz - * Default is 44.1kHz - */ - int frequency(int hz); - /** Reset TLV320 - * - */ - void reset(void); - /** Start streaming i.e. enable interrupts - * - * @param mode Enable interrupts for NONE, TRANSMIT only, RECEIVE only, BOTH - */ - void start(int mode); - /** Stop streaming i.e. disable all interrupts - * - */ - void stop(void); - /** Write [length] 32 bit words in buffer to I2S port - * - * @param *buffer Address of buffer to be written - * @param from Start position in buffer to read from - * @param length Number of words to be written (MUST not exceed 4) - */ - void write(int *buffer, int from, int length); - /** Read 4 x (32bit) words into rxBuffer - * - */ - void read(void); - /** Attach a void/void function or void/void static member funciton to an interrupt generated by the I2SxxFIFOs - * - * @param function Function to attach - * - * e.g. myTlv320Object.attach(&myfunction); - * OR myTlv320Object.attach(&myClass::myStaticMemberFunction); - */ - void attach(void(*fptr)(void)); - /** Attach a nonstatic void/void member function to an interrupt generated by the I2SxxFIFOs - * - * @param tptr Object pointer - * @param mptr Member function pointer - * - * e.g. myTlv320Object.attach(&myObject, &myClass::myNonstaticMemberFunction); where myObject is an object of myClass - */ - template<typename T> - void attach(T *tptr, void(T::*mptr)(void)){ - mI2s_.attach(tptr, mptr); - } - /** Line in volume control i.e. record volume - * - * @param leftVolumeIn Left line-in volume - * @param rightVolumeIn Right line-in volume - * @return Returns 0 for success, -1 if parameters are out of range - * Parameters accept a value, where 0.0 < parameter < 1.0 and where 0.0 maps to -34.5dB - * and 1.0 maps to +12dB (0.74 = 0 dB default). - */ - int inputVolume(float leftVolumeIn, float rightVolumeIn); - /** Headphone out volume control - * - * @param leftVolumeOut Left line-out volume - * @param rightVolumeOut Right line-out volume - * @return Returns 0 for success, -1 if parameters are out of range - * Parameters accept a value, where 0.0 < parameter < 1.0 and where 0.0 maps to -73dB (mute) - * and 1.0 maps to +6dB (0.5 = default) - */ - int outputVolume(float leftVolumeOut, float rightVolumeOut); - /** Analog audio path control - * - * @param bypassVar Route analogue audio direct from line in to headphone out - */ - void bypass(bool bypassVar); - /**Digital audio path control - * - * @param softMute Mute output - */ - void mute(bool softMute); - //Receive buffer - - int *rxBuffer; - - protected: - char cmd[2]; //the address and command for TLV320 internal registers - int mAddr; //register write address - private: - I2C mI2c_; //MUST use the I2C port - I2SSlave mI2s_; - Ticker I2sTick; - void io(void); - /** Sample rate control - * - * @param rate Set the sampling rate as per datasheet section 3.3.2 - * @param clockIn Set the clock in divider MCLK, MCLK_DIV2 - * @param clockMode Set clock mode CLOCK_NORMAL, CLOCK_USB - */ - void setSampleRate_(char rate, bool clockIn, bool mode, bool bOSR); - /** Digital interface activation - * - */ - void activateDigitalInterface_(void); - /** Digital interface deactivation - * - */ - void deactivateDigitalInterface_(void); - - //TLV320AIC23B register addresses as defined in the TLV320AIC23B datasheet - #define LEFT_LINE_INPUT_CHANNEL_VOLUME_CONTROL (0x00 << 1) - #define RIGHT_LINE_INPUT_CHANNEL_VOLUME_CONTROL (0x01 << 1) - #define LEFT_CHANNEL_HEADPHONE_VOLUME_CONTROL (0x02 << 1) - #define RIGHT_CHANNEL_HEADPHONE_VOLUME_CONTROL (0x03 << 1) - #define ANALOG_AUDIO_PATH_CONTROL (0x04 << 1) - #define DIGITAL_AUDIO_PATH_CONTROL (0x05 << 1) - #define POWER_DOWN_CONTROL (0x06 << 1) - #define DIGITAL_AUDIO_INTERFACE_FORMAT (0x07 << 1) - #define SAMPLE_RATE_CONTROL (0x08 << 1) - #define DIGITAL_INTERFACE_ACTIVATION (0x09 << 1) - #define RESET_REGISTER (0x0F << 1) - - #define CLOCK_NORMAL 0 - #define CLOCK_USB 1 - #define MCLK 0 - #define MCLK_DIV2 1 -}; - -#endif \ No newline at end of file