Thi s library works either for lpc1768 or lpc4088 QSB
Fork of I2SSlave by
I2SSlave.h@4:aa3e863920d2, 2011-08-05 (annotated)
- Committer:
- d_worrall
- Date:
- Fri Aug 05 10:10:07 2011 +0000
- Revision:
- 4:aa3e863920d2
- Parent:
- 3:5a09a8df83b1
Who changed what in which revision?
User | Revision | Line number | New 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__*/ |