Dependents:   playback FTSESpeech i2s_audio_echo i2s_audio_sampler ... more

Committer:
d_worrall
Date:
Fri Aug 05 10:10:07 2011 +0000
Revision:
4:aa3e863920d2
Parent:
3:5a09a8df83b1

        

Who changed what in which revision?

UserRevisionLine numberNew contents of line
d_worrall 0:e62e06e11575 1 /**
d_worrall 0:e62e06e11575 2 * @author Daniel Worrall
d_worrall 0:e62e06e11575 3 *
d_worrall 0:e62e06e11575 4 * @section LICENSE
d_worrall 0:e62e06e11575 5 *
d_worrall 0:e62e06e11575 6 * Copyright (c) 2011 mbed
d_worrall 0:e62e06e11575 7 *
d_worrall 0:e62e06e11575 8 * Permission is hereby granted, free of charge, to any person obtaining a copy
d_worrall 0:e62e06e11575 9 * of this software and associated documentation files (the "Software"), to deal
d_worrall 0:e62e06e11575 10 * in the Software without restriction, including without limitation the rights
d_worrall 0:e62e06e11575 11 * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
d_worrall 0:e62e06e11575 12 * copies of the Software, and to permit persons to whom the Software is
d_worrall 0:e62e06e11575 13 * furnished to do so, subject to the following conditions:
d_worrall 0:e62e06e11575 14 *
d_worrall 0:e62e06e11575 15 * The above copyright notice and this permission notice shall be included in
d_worrall 0:e62e06e11575 16 * all copies or substantial portions of the Software.
d_worrall 0:e62e06e11575 17 *
d_worrall 0:e62e06e11575 18 * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
d_worrall 0:e62e06e11575 19 * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
d_worrall 0:e62e06e11575 20 * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
d_worrall 0:e62e06e11575 21 * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
d_worrall 0:e62e06e11575 22 * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
d_worrall 0:e62e06e11575 23 * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
d_worrall 0:e62e06e11575 24 * THE SOFTWARE.
d_worrall 0:e62e06e11575 25 *
d_worrall 0:e62e06e11575 26 * @section DESCRIPTION
d_worrall 4:aa3e863920d2 27 * I2S port abstraction library h file for NXP LPC1768
d_worrall 0:e62e06e11575 28 *
d_worrall 0:e62e06e11575 29 */
d_worrall 0:e62e06e11575 30
d_worrall 0:e62e06e11575 31 #include "mbed.h"
d_worrall 0:e62e06e11575 32 #include "math.h"
d_worrall 0:e62e06e11575 33
d_worrall 0:e62e06e11575 34 #ifndef __MBED_I2SSLAVE_H__
d_worrall 0:e62e06e11575 35 #define __MBED_I2SSLAVE_H__
d_worrall 0:e62e06e11575 36
d_worrall 1:1c6ab181537f 37 extern FunctionPointer akjnh3489v8ncv;
d_worrall 1:1c6ab181537f 38
d_worrall 0:e62e06e11575 39 /** I2S class defined on the LPC1768 port
d_worrall 0:e62e06e11575 40 *
d_worrall 0:e62e06e11575 41 */
d_worrall 0:e62e06e11575 42 class I2SSlave{
d_worrall 0:e62e06e11575 43
d_worrall 0:e62e06e11575 44 public:
d_worrall 0:e62e06e11575 45 //Constructor
d_worrall 0:e62e06e11575 46 /** Create an I2S object
d_worrall 0:e62e06e11575 47 *
d_worrall 0:e62e06e11575 48 * @param tx_sda Transmitter serial data line
d_worrall 0:e62e06e11575 49 * @param tx_ws Transmitter word select line
d_worrall 0:e62e06e11575 50 * @param clk Shared transmitter/receiver clock line
d_worrall 0:e62e06e11575 51 * @param rx_sda Receiver serial data line
d_worrall 0:e62e06e11575 52 * @param rx_ws Receiver word select line
d_worrall 0:e62e06e11575 53 */
d_worrall 0:e62e06e11575 54 I2SSlave(PinName tx_sda, PinName tx_ws, PinName clk, PinName rx_sda, PinName rx_ws);
d_worrall 0:e62e06e11575 55 /** Set the data transmission format
d_worrall 0:e62e06e11575 56 *
d_worrall 0:e62e06e11575 57 * @param bit Set the number of bits per write
d_worrall 0:e62e06e11575 58 * @param mode Set STEREO (0) or MONO (1) mode
d_worrall 0:e62e06e11575 59 */
d_worrall 0:e62e06e11575 60 void format(int bit, bool mode);
d_worrall 0:e62e06e11575 61 /** Write a buffer to the I2S port
d_worrall 0:e62e06e11575 62 *
d_worrall 0:e62e06e11575 63 * @param buffer Address of buffer to pass to I2S port
d_worrall 0:e62e06e11575 64 * @param from Start position in buffer to read from
d_worrall 0:e62e06e11575 65 * @param length Length of buffer (MUST not exceed 8 words, each 32 bits long)
d_worrall 0:e62e06e11575 66 *
d_worrall 0:e62e06e11575 67 * Note: sending 8 words to the TXFIFO will trigger an interrupt!
d_worrall 0:e62e06e11575 68 */
d_worrall 0:e62e06e11575 69 void write(int* buffer, int from, int length);
d_worrall 0:e62e06e11575 70 /** Activate I2S port for data streaming
d_worrall 0:e62e06e11575 71 *
d_worrall 0:e62e06e11575 72 * @param mode Mode to enable - NONE, TRANSMIT only, RECEIVE only, BOTH
d_worrall 0:e62e06e11575 73 * Enables tx/rx interrupts
d_worrall 0:e62e06e11575 74 */
d_worrall 0:e62e06e11575 75 void start(int mode);
d_worrall 0:e62e06e11575 76 /** Deactivate I2S port from data streaming
d_worrall 0:e62e06e11575 77 *
d_worrall 0:e62e06e11575 78 * Disable all interrupts
d_worrall 0:e62e06e11575 79 */
d_worrall 0:e62e06e11575 80 void stop(void);
d_worrall 0:e62e06e11575 81 /** Load receive FIFO data into receiver buffer
d_worrall 0:e62e06e11575 82 *
d_worrall 0:e62e06e11575 83 */
d_worrall 0:e62e06e11575 84 void read(void);
d_worrall 0:e62e06e11575 85 /** Attach a void/void function or void/void static memeber function to an interrupt generated by the I2SxxFIFOs
d_worrall 0:e62e06e11575 86 *
d_worrall 0:e62e06e11575 87 * @param function Function to attach
d_worrall 0:e62e06e11575 88 *
d_worrall 3:5a09a8df83b1 89 * <code> myI2sObject.attach(&myfunction); </code>
d_worrall 3:5a09a8df83b1 90 * OR <code> myI2sObject.attach(&myClass::myStaticMemberFunction); </code>
d_worrall 0:e62e06e11575 91 */
d_worrall 0:e62e06e11575 92 void attach(void(*fptr)(void)){
d_worrall 0:e62e06e11575 93 akjnh3489v8ncv.attach(fptr);
d_worrall 0:e62e06e11575 94 }
d_worrall 0:e62e06e11575 95 /** Attach a nonstatic void/void member function to an interrupt generated by the I2SxxFIFOs
d_worrall 0:e62e06e11575 96 *
d_worrall 0:e62e06e11575 97 * @param tptr Object pointer
d_worrall 0:e62e06e11575 98 * @param mptr Member function pointer
d_worrall 0:e62e06e11575 99 *
d_worrall 3:5a09a8df83b1 100 * e.g. <code>myI2sObject.attach(&myObject, &myClass::myNonstaticMemberFunction); </code>where myObject is an object of myClass
d_worrall 0:e62e06e11575 101 */
d_worrall 0:e62e06e11575 102 template<typename T>
d_worrall 0:e62e06e11575 103 void attach(T *tptr, void(T::*mptr)(void)){
d_worrall 0:e62e06e11575 104 akjnh3489v8ncv.attach(tptr, mptr);
d_worrall 0:e62e06e11575 105 }
d_worrall 0:e62e06e11575 106 /** Return contents of I2S status register
d_worrall 0:e62e06e11575 107 *
d_worrall 0:e62e06e11575 108 * @returns Content of I2SSTATE register
d_worrall 0:e62e06e11575 109 *
d_worrall 0:e62e06e11575 110 * bit0: receive/transmit interrupt active
d_worrall 0:e62e06e11575 111 * bit1: receive/transmit DMA request 1
d_worrall 0:e62e06e11575 112 * bit2: receive/transmit DMA request 2
d_worrall 0:e62e06e11575 113 * bit[11:8]: receive FIFO level
d_worrall 0:e62e06e11575 114 * bit[19:16]: transmit FIFO level
d_worrall 0:e62e06e11575 115 */
d_worrall 0:e62e06e11575 116 int status(void);
d_worrall 0:e62e06e11575 117
d_worrall 0:e62e06e11575 118 //Receiver buffer
d_worrall 0:e62e06e11575 119 int rxBuffer[4];
d_worrall 0:e62e06e11575 120 //defines
d_worrall 0:e62e06e11575 121 #define STEREO 0
d_worrall 0:e62e06e11575 122 #define MONO 1
d_worrall 0:e62e06e11575 123
d_worrall 0:e62e06e11575 124 #define I2SFIFO_EMPTY 0
d_worrall 0:e62e06e11575 125 #define I2SFIFO_FULL 8
d_worrall 0:e62e06e11575 126
d_worrall 0:e62e06e11575 127 #define RAM_LENGTH 1024
d_worrall 0:e62e06e11575 128 #define RAM_LIMIT (RAM_LENGTH - 1)
d_worrall 0:e62e06e11575 129 #define PTR_MAX ((RAM_LENGTH / 8) - 1)
d_worrall 0:e62e06e11575 130
d_worrall 0:e62e06e11575 131 #define NONE 0
d_worrall 0:e62e06e11575 132 #define TRANSMIT 1
d_worrall 0:e62e06e11575 133 #define RECEIVE 2
d_worrall 0:e62e06e11575 134 #define BOTH 3
d_worrall 0:e62e06e11575 135
d_worrall 0:e62e06e11575 136 private:
d_worrall 0:e62e06e11575 137 /** I2S intitalize function
d_worrall 0:e62e06e11575 138 *
d_worrall 0:e62e06e11575 139 * @param tx_sda Transmitter serial data line
d_worrall 0:e62e06e11575 140 * @param tx_ws Transmitter word select line
d_worrall 0:e62e06e11575 141 * @param clk Shared transmitter/receiver clock line
d_worrall 0:e62e06e11575 142 * @param rx_sda Receiver serial data line
d_worrall 0:e62e06e11575 143 * @param rx_ws Receiver word select line
d_worrall 0:e62e06e11575 144 * @return Returns 0 for successful initialisation, -1 for an error
d_worrall 0:e62e06e11575 145 */
d_worrall 0:e62e06e11575 146 int initialize_(PinName tx_sda, PinName tx_ws, PinName clk, PinName rx_sda, PinName rx_ws);
d_worrall 0:e62e06e11575 147 /** Set internal clock divide by rate
d_worrall 0:e62e06e11575 148 *
d_worrall 0:e62e06e11575 149 * @param divideBy Divide by 1, 2, 4 or 8
d_worrall 0:e62e06e11575 150 */
d_worrall 0:e62e06e11575 151 void setClocks_(int divideBy);
d_worrall 0:e62e06e11575 152 /** Set up the pins on the processor itself
d_worrall 0:e62e06e11575 153 *
d_worrall 0:e62e06e11575 154 * @param tx_sda Transmitter serial data line
d_worrall 0:e62e06e11575 155 * @param tx_ws Transmitter word select line
d_worrall 0:e62e06e11575 156 * @param clk Shared transmitter/receiver clock line
d_worrall 0:e62e06e11575 157 * @param rx_sda Receiver serial data line
d_worrall 0:e62e06e11575 158 * @param rx_ws Receiver word select line
d_worrall 0:e62e06e11575 159 */
d_worrall 0:e62e06e11575 160 void setPins_(PinName tx_sda, PinName tx_ws, PinName clk, PinName rx_sda, PinName rx_ws);
d_worrall 0:e62e06e11575 161 /** Set the data transmission format
d_worrall 0:e62e06e11575 162 *
d_worrall 0:e62e06e11575 163 * @param bit Set the number of bits per write
d_worrall 0:e62e06e11575 164 * @param mode Set STEREO (0) or MONO (1) mode
d_worrall 0:e62e06e11575 165 */
d_worrall 0:e62e06e11575 166 void format_(int bit, bool mode);
d_worrall 0:e62e06e11575 167 /** Set slave mode
d_worrall 0:e62e06e11575 168 *
d_worrall 0:e62e06e11575 169 */
d_worrall 0:e62e06e11575 170 void modeConfig_(void);
d_worrall 0:e62e06e11575 171 /** Store PinName values
d_worrall 0:e62e06e11575 172 *
d_worrall 0:e62e06e11575 173 * @param tx_sda Transmitter serial data line
d_worrall 0:e62e06e11575 174 * @param tx_ws Transmitter word select line
d_worrall 0:e62e06e11575 175 * @param clk Shared transmitter/receiver clock line
d_worrall 0:e62e06e11575 176 * @param rx_sda Receiver serial data line
d_worrall 0:e62e06e11575 177 * @param rx_ws Receiver word select line
d_worrall 0:e62e06e11575 178 */
d_worrall 0:e62e06e11575 179 void storePins_(PinName tx_sda, PinName tx_ws, PinName clk, PinName rx_sda, PinName rx_ws);
d_worrall 0:e62e06e11575 180 //variables
d_worrall 0:e62e06e11575 181 int bit_;
d_worrall 0:e62e06e11575 182 bool mode_;
d_worrall 0:e62e06e11575 183 PinName tx_sda_;
d_worrall 0:e62e06e11575 184 PinName tx_ws_;
d_worrall 0:e62e06e11575 185 PinName clk_;
d_worrall 0:e62e06e11575 186 PinName rx_sda_;
d_worrall 0:e62e06e11575 187 PinName rx_ws_;
d_worrall 0:e62e06e11575 188 };
d_worrall 0:e62e06e11575 189
d_worrall 0:e62e06e11575 190 #endif /*__MBED_I2S_H__*/