![](/media/cache/img/default_profile.jpg.50x50_q85.jpg)
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
I2SSlave/I2SSlave.h@0:3d6892f6384f, 2011-08-05 (annotated)
- Committer:
- d_worrall
- Date:
- Fri Aug 05 10:07:47 2011 +0000
- Revision:
- 0:3d6892f6384f
version 2.0
Who changed what in which revision?
User | Revision | Line number | New 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__*/ |