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

Committer:
d_worrall
Date:
Fri Aug 05 10:07:47 2011 +0000
Revision:
0:3d6892f6384f
version 2.0

Who changed what in which revision?

UserRevisionLine numberNew contents of line
d_worrall 0:3d6892f6384f 1 /******************************************************
d_worrall 0:3d6892f6384f 2 * I2SSlave.h: I2S port abstraction library header file for NXP LPC1768
d_worrall 0:3d6892f6384f 3 *
d_worrall 0:3d6892f6384f 4 * Written by:
d_worrall 0:3d6892f6384f 5 * mbed Team - 15th July 2011
d_worrall 0:3d6892f6384f 6 * Daniel Worrall
d_worrall 0:3d6892f6384f 7 *
d_worrall 0:3d6892f6384f 8 * History
d_worrall 0:3d6892f6384f 9 * version 1.31
d_worrall 0:3d6892f6384f 10 ******************************************************/
d_worrall 0:3d6892f6384f 11
d_worrall 0:3d6892f6384f 12 #include "mbed.h"
d_worrall 0:3d6892f6384f 13 #include "math.h"
d_worrall 0:3d6892f6384f 14
d_worrall 0:3d6892f6384f 15 #ifndef __MBED_I2SSLAVE_H__
d_worrall 0:3d6892f6384f 16 #define __MBED_I2SSLAVE_H__
d_worrall 0:3d6892f6384f 17
d_worrall 0:3d6892f6384f 18 /** I2S class defined on the LPC1768 port
d_worrall 0:3d6892f6384f 19 *
d_worrall 0:3d6892f6384f 20 */
d_worrall 0:3d6892f6384f 21 extern FunctionPointer akjnh3489v8ncv;
d_worrall 0:3d6892f6384f 22 class I2SSlave{
d_worrall 0:3d6892f6384f 23
d_worrall 0:3d6892f6384f 24 public:
d_worrall 0:3d6892f6384f 25 //Constructor
d_worrall 0:3d6892f6384f 26 /** Create an I2S object
d_worrall 0:3d6892f6384f 27 *
d_worrall 0:3d6892f6384f 28 * @param tx_sda Transmitter serial data line
d_worrall 0:3d6892f6384f 29 * @param tx_ws Transmitter word select line
d_worrall 0:3d6892f6384f 30 * @param clk Shared transmitter/receiver clock line
d_worrall 0:3d6892f6384f 31 * @param rx_sda Receiver serial data line
d_worrall 0:3d6892f6384f 32 * @param rx_ws Receiver word select line
d_worrall 0:3d6892f6384f 33 */
d_worrall 0:3d6892f6384f 34 I2SSlave(PinName tx_sda, PinName tx_ws, PinName clk, PinName rx_sda, PinName rx_ws);
d_worrall 0:3d6892f6384f 35 /** Set the data transmission format
d_worrall 0:3d6892f6384f 36 *
d_worrall 0:3d6892f6384f 37 * @param bit Set the number of bits per write
d_worrall 0:3d6892f6384f 38 * @param mode Set STEREO (0) or MONO (1) mode
d_worrall 0:3d6892f6384f 39 */
d_worrall 0:3d6892f6384f 40 void format(int bit, bool mode);
d_worrall 0:3d6892f6384f 41 /** Write a buffer to the I2S port
d_worrall 0:3d6892f6384f 42 *
d_worrall 0:3d6892f6384f 43 * @param buffer Address of buffer to pass to I2S port
d_worrall 0:3d6892f6384f 44 * @param from Start position in buffer to read from
d_worrall 0:3d6892f6384f 45 * @param length Length of buffer (MUST not exceed 8 words, each 32 bits long)
d_worrall 0:3d6892f6384f 46 *
d_worrall 0:3d6892f6384f 47 * Note: sending 8 words to the TXFIFO will trigger an interrupt!
d_worrall 0:3d6892f6384f 48 */
d_worrall 0:3d6892f6384f 49 void write(int* buffer, int from, int length);
d_worrall 0:3d6892f6384f 50 /** Activate I2S port for data streaming
d_worrall 0:3d6892f6384f 51 *
d_worrall 0:3d6892f6384f 52 * @param mode Mode to enable - NONE, TRANSMIT only, RECEIVE only, BOTH
d_worrall 0:3d6892f6384f 53 * Enables tx/rx interrupts
d_worrall 0:3d6892f6384f 54 */
d_worrall 0:3d6892f6384f 55 void start(int mode);
d_worrall 0:3d6892f6384f 56 /** Deactivate I2S port from data streaming
d_worrall 0:3d6892f6384f 57 *
d_worrall 0:3d6892f6384f 58 * Disable all interrupts
d_worrall 0:3d6892f6384f 59 */
d_worrall 0:3d6892f6384f 60 void stop(void);
d_worrall 0:3d6892f6384f 61 /** Load receive FIFO data into receiver buffer
d_worrall 0:3d6892f6384f 62 *
d_worrall 0:3d6892f6384f 63 */
d_worrall 0:3d6892f6384f 64 void read(void);
d_worrall 0:3d6892f6384f 65 /** Attach a void/void function or void/void static memeber function to an interrupt generated by the I2SxxFIFOs
d_worrall 0:3d6892f6384f 66 *
d_worrall 0:3d6892f6384f 67 * @param function Function to attach
d_worrall 0:3d6892f6384f 68 *
d_worrall 0:3d6892f6384f 69 * e.g. myI2sObject.attach(&myfunction);
d_worrall 0:3d6892f6384f 70 * OR myI2sObject.attach(&myClass::myStaticMemberFunction);
d_worrall 0:3d6892f6384f 71 */
d_worrall 0:3d6892f6384f 72 void attach(void(*fptr)(void)){
d_worrall 0:3d6892f6384f 73 akjnh3489v8ncv.attach(fptr);
d_worrall 0:3d6892f6384f 74 }
d_worrall 0:3d6892f6384f 75 /** Attach a nonstatic void/void member function to an interrupt generated by the I2SxxFIFOs
d_worrall 0:3d6892f6384f 76 *
d_worrall 0:3d6892f6384f 77 * @param tptr Object pointer
d_worrall 0:3d6892f6384f 78 * @param mptr Member function pointer
d_worrall 0:3d6892f6384f 79 *
d_worrall 0:3d6892f6384f 80 * e.g. myI2sObject.attach(&myObject, &myClass::myNonstaticMemberFunction); where myObject is an object of myClass
d_worrall 0:3d6892f6384f 81 */
d_worrall 0:3d6892f6384f 82 template<typename T>
d_worrall 0:3d6892f6384f 83 void attach(T *tptr, void(T::*mptr)(void)){
d_worrall 0:3d6892f6384f 84 akjnh3489v8ncv.attach(tptr, mptr);
d_worrall 0:3d6892f6384f 85 }
d_worrall 0:3d6892f6384f 86 /** Return contents of I2S status register
d_worrall 0:3d6892f6384f 87 *
d_worrall 0:3d6892f6384f 88 * @returns Content of I2SSTATE register
d_worrall 0:3d6892f6384f 89 *
d_worrall 0:3d6892f6384f 90 * bit0: receive/transmit interrupt active
d_worrall 0:3d6892f6384f 91 * bit1: receive/transmit DMA request 1
d_worrall 0:3d6892f6384f 92 * bit2: receive/transmit DMA request 2
d_worrall 0:3d6892f6384f 93 * bit[11:8]: receive FIFO level
d_worrall 0:3d6892f6384f 94 * bit[19:16]: transmit FIFO level
d_worrall 0:3d6892f6384f 95 */
d_worrall 0:3d6892f6384f 96 int status(void);
d_worrall 0:3d6892f6384f 97
d_worrall 0:3d6892f6384f 98 //Receiver buffer
d_worrall 0:3d6892f6384f 99 int rxBuffer[4];
d_worrall 0:3d6892f6384f 100 //defines
d_worrall 0:3d6892f6384f 101 #define STEREO 0
d_worrall 0:3d6892f6384f 102 #define MONO 1
d_worrall 0:3d6892f6384f 103
d_worrall 0:3d6892f6384f 104 #define I2SFIFO_EMPTY 0
d_worrall 0:3d6892f6384f 105 #define I2SFIFO_FULL 8
d_worrall 0:3d6892f6384f 106
d_worrall 0:3d6892f6384f 107 #define RAM_LENGTH 1024
d_worrall 0:3d6892f6384f 108 #define RAM_LIMIT (RAM_LENGTH - 1)
d_worrall 0:3d6892f6384f 109 #define PTR_MAX ((RAM_LENGTH / 8) - 1)
d_worrall 0:3d6892f6384f 110
d_worrall 0:3d6892f6384f 111 #define NONE 0
d_worrall 0:3d6892f6384f 112 #define TRANSMIT 1
d_worrall 0:3d6892f6384f 113 #define RECEIVE 2
d_worrall 0:3d6892f6384f 114 #define BOTH 3
d_worrall 0:3d6892f6384f 115
d_worrall 0:3d6892f6384f 116 private:
d_worrall 0:3d6892f6384f 117 /** I2S intitalize function
d_worrall 0:3d6892f6384f 118 *
d_worrall 0:3d6892f6384f 119 * @param tx_sda Transmitter serial data line
d_worrall 0:3d6892f6384f 120 * @param tx_ws Transmitter word select line
d_worrall 0:3d6892f6384f 121 * @param clk Shared transmitter/receiver clock line
d_worrall 0:3d6892f6384f 122 * @param rx_sda Receiver serial data line
d_worrall 0:3d6892f6384f 123 * @param rx_ws Receiver word select line
d_worrall 0:3d6892f6384f 124 * @return Returns 0 for successful initialisation, -1 for an error
d_worrall 0:3d6892f6384f 125 */
d_worrall 0:3d6892f6384f 126 int initialize_(PinName tx_sda, PinName tx_ws, PinName clk, PinName rx_sda, PinName rx_ws);
d_worrall 0:3d6892f6384f 127 /** Set internal clock divide by rate
d_worrall 0:3d6892f6384f 128 *
d_worrall 0:3d6892f6384f 129 * @param divideBy Divide by 1, 2, 4 or 8
d_worrall 0:3d6892f6384f 130 */
d_worrall 0:3d6892f6384f 131 void setClocks_(int divideBy);
d_worrall 0:3d6892f6384f 132 /** Set up the pins on the processor itself
d_worrall 0:3d6892f6384f 133 *
d_worrall 0:3d6892f6384f 134 * @param tx_sda Transmitter serial data line
d_worrall 0:3d6892f6384f 135 * @param tx_ws Transmitter word select line
d_worrall 0:3d6892f6384f 136 * @param clk Shared transmitter/receiver clock line
d_worrall 0:3d6892f6384f 137 * @param rx_sda Receiver serial data line
d_worrall 0:3d6892f6384f 138 * @param rx_ws Receiver word select line
d_worrall 0:3d6892f6384f 139 */
d_worrall 0:3d6892f6384f 140 void setPins_(PinName tx_sda, PinName tx_ws, PinName clk, PinName rx_sda, PinName rx_ws);
d_worrall 0:3d6892f6384f 141 /** Set the data transmission format
d_worrall 0:3d6892f6384f 142 *
d_worrall 0:3d6892f6384f 143 * @param bit Set the number of bits per write
d_worrall 0:3d6892f6384f 144 * @param mode Set STEREO (0) or MONO (1) mode
d_worrall 0:3d6892f6384f 145 */
d_worrall 0:3d6892f6384f 146 void format_(int bit, bool mode);
d_worrall 0:3d6892f6384f 147 /** Set slave mode
d_worrall 0:3d6892f6384f 148 *
d_worrall 0:3d6892f6384f 149 */
d_worrall 0:3d6892f6384f 150 void modeConfig_(void);
d_worrall 0:3d6892f6384f 151 /** Store PinName values
d_worrall 0:3d6892f6384f 152 *
d_worrall 0:3d6892f6384f 153 * @param tx_sda Transmitter serial data line
d_worrall 0:3d6892f6384f 154 * @param tx_ws Transmitter word select line
d_worrall 0:3d6892f6384f 155 * @param clk Shared transmitter/receiver clock line
d_worrall 0:3d6892f6384f 156 * @param rx_sda Receiver serial data line
d_worrall 0:3d6892f6384f 157 * @param rx_ws Receiver word select line
d_worrall 0:3d6892f6384f 158 */
d_worrall 0:3d6892f6384f 159 void storePins_(PinName tx_sda, PinName tx_ws, PinName clk, PinName rx_sda, PinName rx_ws);
d_worrall 0:3d6892f6384f 160 //variables
d_worrall 0:3d6892f6384f 161 int bit_;
d_worrall 0:3d6892f6384f 162 bool mode_;
d_worrall 0:3d6892f6384f 163 PinName tx_sda_;
d_worrall 0:3d6892f6384f 164 PinName tx_ws_;
d_worrall 0:3d6892f6384f 165 PinName clk_;
d_worrall 0:3d6892f6384f 166 PinName rx_sda_;
d_worrall 0:3d6892f6384f 167 PinName rx_ws_;
d_worrall 0:3d6892f6384f 168 };
d_worrall 0:3d6892f6384f 169
d_worrall 0:3d6892f6384f 170 #endif /*__MBED_I2S_H__*/