Dependents: playback FTSESpeech i2s_audio_echo i2s_audio_sampler ... more
I2SSlave.cpp@2:f25201f154d0, 2011-08-04 (annotated)
- Committer:
- d_worrall
- Date:
- Thu Aug 04 14:58:11 2011 +0000
- Revision:
- 2:f25201f154d0
- Parent:
- 0:e62e06e11575
version 2.32
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 | 0:e62e06e11575 | 27 | * I2S port abstraction library cpp file for NXP LPC1768 |
d_worrall | 0:e62e06e11575 | 28 | * |
d_worrall | 0:e62e06e11575 | 29 | */ |
d_worrall | 0:e62e06e11575 | 30 | #include "I2SSlave.h" |
d_worrall | 0:e62e06e11575 | 31 | /*Global Functions*/ |
d_worrall | 0:e62e06e11575 | 32 | FunctionPointer akjnh3489v8ncv; |
d_worrall | 0:e62e06e11575 | 33 | |
d_worrall | 0:e62e06e11575 | 34 | extern "C" void I2S_IRQHandler(void){ //this is a very special function so can remain outside |
d_worrall | 0:e62e06e11575 | 35 | akjnh3489v8ncv.call(); |
d_worrall | 0:e62e06e11575 | 36 | } |
d_worrall | 0:e62e06e11575 | 37 | /****************************************************** |
d_worrall | 0:e62e06e11575 | 38 | * Function name: I2SSlave |
d_worrall | 0:e62e06e11575 | 39 | * |
d_worrall | 0:e62e06e11575 | 40 | * Description: class constructor |
d_worrall | 0:e62e06e11575 | 41 | * |
d_worrall | 0:e62e06e11575 | 42 | * Parameters: PinName tx_sda, PinName tx_ws, PinName clk, PinName rx_sda, PinName rx_ws |
d_worrall | 0:e62e06e11575 | 43 | * Returns: none |
d_worrall | 0:e62e06e11575 | 44 | ******************************************************/ |
d_worrall | 0:e62e06e11575 | 45 | //Constructor |
d_worrall | 0:e62e06e11575 | 46 | I2SSlave::I2SSlave(PinName tx_sda, PinName tx_ws, PinName clk, PinName rx_sda, PinName rx_ws){ |
d_worrall | 0:e62e06e11575 | 47 | storePins_(tx_sda, tx_ws, clk, rx_sda, rx_ws); |
d_worrall | 0:e62e06e11575 | 48 | format(16, STEREO); //this also invokes initialize so no need to call it twice |
d_worrall | 0:e62e06e11575 | 49 | } |
d_worrall | 0:e62e06e11575 | 50 | //Public functions |
d_worrall | 0:e62e06e11575 | 51 | /****************************************************** |
d_worrall | 0:e62e06e11575 | 52 | * Function name: format() |
d_worrall | 0:e62e06e11575 | 53 | * |
d_worrall | 0:e62e06e11575 | 54 | * Description: sets the bit length for writing and stereo or mono mode |
d_worrall | 0:e62e06e11575 | 55 | * |
d_worrall | 0:e62e06e11575 | 56 | * Parameters: int bit, bool mode |
d_worrall | 0:e62e06e11575 | 57 | * Returns: none |
d_worrall | 0:e62e06e11575 | 58 | ******************************************************/ |
d_worrall | 0:e62e06e11575 | 59 | void I2SSlave::format(int bit, bool mode){ |
d_worrall | 0:e62e06e11575 | 60 | bit_ = bit; |
d_worrall | 0:e62e06e11575 | 61 | mode_ = mode; |
d_worrall | 0:e62e06e11575 | 62 | initialize_(tx_sda_, tx_ws_, clk_, rx_sda_, rx_ws_); |
d_worrall | 0:e62e06e11575 | 63 | } |
d_worrall | 0:e62e06e11575 | 64 | /****************************************************** |
d_worrall | 0:e62e06e11575 | 65 | * Function name: write() |
d_worrall | 0:e62e06e11575 | 66 | * |
d_worrall | 0:e62e06e11575 | 67 | * Description: load buffer to write to I2S port |
d_worrall | 0:e62e06e11575 | 68 | * |
d_worrall | 0:e62e06e11575 | 69 | * Parameters: long *buffer |
d_worrall | 0:e62e06e11575 | 70 | * Returns: none |
d_worrall | 0:e62e06e11575 | 71 | ******************************************************/ |
d_worrall | 0:e62e06e11575 | 72 | void I2SSlave::write(int* buffer, int from, int length){ |
d_worrall | 0:e62e06e11575 | 73 | int to = from + length; |
d_worrall | 0:e62e06e11575 | 74 | for(int i = from; i < to; ++i){ |
d_worrall | 0:e62e06e11575 | 75 | LPC_I2S->I2STXFIFO = buffer[i]; |
d_worrall | 0:e62e06e11575 | 76 | } |
d_worrall | 0:e62e06e11575 | 77 | } |
d_worrall | 0:e62e06e11575 | 78 | /****************************************************** |
d_worrall | 0:e62e06e11575 | 79 | * Function name: start() |
d_worrall | 0:e62e06e11575 | 80 | * |
d_worrall | 0:e62e06e11575 | 81 | * Description: attach streamOut_ function to ticker interrupt |
d_worrall | 0:e62e06e11575 | 82 | * |
d_worrall | 0:e62e06e11575 | 83 | * Parameters: none |
d_worrall | 0:e62e06e11575 | 84 | * Returns: none |
d_worrall | 0:e62e06e11575 | 85 | ******************************************************/ |
d_worrall | 0:e62e06e11575 | 86 | void I2SSlave::start(int mode){ |
d_worrall | 0:e62e06e11575 | 87 | switch(mode){ |
d_worrall | 0:e62e06e11575 | 88 | case(0): |
d_worrall | 0:e62e06e11575 | 89 | LPC_I2S->I2SIRQ |= (0 << 0); //disable receive interrupt |
d_worrall | 0:e62e06e11575 | 90 | LPC_I2S->I2SIRQ |= (0 << 1); //disable transmit interrupt |
d_worrall | 0:e62e06e11575 | 91 | break; |
d_worrall | 0:e62e06e11575 | 92 | case(1): |
d_worrall | 0:e62e06e11575 | 93 | LPC_I2S->I2SIRQ |= (0 << 0); //disable receive interrupt |
d_worrall | 0:e62e06e11575 | 94 | LPC_I2S->I2SIRQ |= (1 << 1); //enable transmit interrupt |
d_worrall | 0:e62e06e11575 | 95 | LPC_I2S->I2SIRQ |= (0 << 16); //set I2STXFIFO depth to 0 words |
d_worrall | 0:e62e06e11575 | 96 | break; |
d_worrall | 0:e62e06e11575 | 97 | case(2): |
d_worrall | 0:e62e06e11575 | 98 | LPC_I2S->I2SIRQ |= (1 << 0); //enable receive interrupt |
d_worrall | 0:e62e06e11575 | 99 | LPC_I2S->I2SIRQ |= (0 << 1); //disable transmit interrupt |
d_worrall | 0:e62e06e11575 | 100 | LPC_I2S->I2SIRQ |= (4 << 8); //set I2SRXFIFO depth to 4 words |
d_worrall | 0:e62e06e11575 | 101 | break; |
d_worrall | 0:e62e06e11575 | 102 | case(3): |
d_worrall | 0:e62e06e11575 | 103 | LPC_I2S->I2SIRQ |= (1 << 0); //enable receive interrupt |
d_worrall | 0:e62e06e11575 | 104 | LPC_I2S->I2SIRQ |= (4 << 8); //set I2SRXFIFO depth to 4 words |
d_worrall | 0:e62e06e11575 | 105 | LPC_I2S->I2SIRQ |= (1 << 1); //enable transmit interrupt |
d_worrall | 0:e62e06e11575 | 106 | LPC_I2S->I2SIRQ |= (0 << 16); //set I2STXFIFO depth to 0 words |
d_worrall | 0:e62e06e11575 | 107 | break; |
d_worrall | 0:e62e06e11575 | 108 | default: |
d_worrall | 0:e62e06e11575 | 109 | break; |
d_worrall | 0:e62e06e11575 | 110 | } |
d_worrall | 0:e62e06e11575 | 111 | NVIC_SetPriority(I2S_IRQn, 0); |
d_worrall | 0:e62e06e11575 | 112 | NVIC_EnableIRQ(I2S_IRQn); //enable I2S interrupt in the NVIC |
d_worrall | 0:e62e06e11575 | 113 | } |
d_worrall | 0:e62e06e11575 | 114 | /****************************************************** |
d_worrall | 0:e62e06e11575 | 115 | * Function name: stop() |
d_worrall | 0:e62e06e11575 | 116 | * |
d_worrall | 0:e62e06e11575 | 117 | * Description: detach streamOut_ from ticker |
d_worrall | 0:e62e06e11575 | 118 | * |
d_worrall | 0:e62e06e11575 | 119 | * Parameters: none |
d_worrall | 0:e62e06e11575 | 120 | * Returns: none |
d_worrall | 0:e62e06e11575 | 121 | ******************************************************/ |
d_worrall | 0:e62e06e11575 | 122 | void I2SSlave::stop(void){ |
d_worrall | 0:e62e06e11575 | 123 | NVIC_DisableIRQ(I2S_IRQn); |
d_worrall | 0:e62e06e11575 | 124 | } |
d_worrall | 0:e62e06e11575 | 125 | /****************************************************** |
d_worrall | 0:e62e06e11575 | 126 | * Function name: read() |
d_worrall | 0:e62e06e11575 | 127 | * |
d_worrall | 0:e62e06e11575 | 128 | * Description: reads FIFORX buffer into [int32_t rxBuffer[8]] |
d_worrall | 0:e62e06e11575 | 129 | * |
d_worrall | 0:e62e06e11575 | 130 | * Parameters: none |
d_worrall | 0:e62e06e11575 | 131 | * Returns: none |
d_worrall | 0:e62e06e11575 | 132 | ******************************************************/ |
d_worrall | 0:e62e06e11575 | 133 | void I2SSlave::read(void){ |
d_worrall | 0:e62e06e11575 | 134 | rxBuffer[0] = LPC_I2S->I2SRXFIFO; |
d_worrall | 0:e62e06e11575 | 135 | rxBuffer[1] = LPC_I2S->I2SRXFIFO; |
d_worrall | 0:e62e06e11575 | 136 | rxBuffer[2] = LPC_I2S->I2SRXFIFO; |
d_worrall | 0:e62e06e11575 | 137 | rxBuffer[3] = LPC_I2S->I2SRXFIFO; |
d_worrall | 0:e62e06e11575 | 138 | } |
d_worrall | 0:e62e06e11575 | 139 | /****************************************************** |
d_worrall | 0:e62e06e11575 | 140 | * Function name: status_() |
d_worrall | 0:e62e06e11575 | 141 | * |
d_worrall | 0:e62e06e11575 | 142 | * Description: Read I2SSTATE register |
d_worrall | 0:e62e06e11575 | 143 | * |
d_worrall | 0:e62e06e11575 | 144 | * Parameters: none |
d_worrall | 0:e62e06e11575 | 145 | * Returns: int |
d_worrall | 0:e62e06e11575 | 146 | ******************************************************/ |
d_worrall | 0:e62e06e11575 | 147 | int I2SSlave::status(void){ |
d_worrall | 0:e62e06e11575 | 148 | return LPC_I2S->I2SSTATE; |
d_worrall | 0:e62e06e11575 | 149 | } |
d_worrall | 0:e62e06e11575 | 150 | //Private functions |
d_worrall | 0:e62e06e11575 | 151 | /****************************************************** |
d_worrall | 0:e62e06e11575 | 152 | * Function name: initialize() |
d_worrall | 0:e62e06e11575 | 153 | * |
d_worrall | 0:e62e06e11575 | 154 | * Description: initialises I2S port |
d_worrall | 0:e62e06e11575 | 155 | * |
d_worrall | 0:e62e06e11575 | 156 | * Parameters: PinName tx_sda, PinName tx_ws, PinName clk, PinName rx_sda, PinName rx_ws |
d_worrall | 0:e62e06e11575 | 157 | * Returns: 0 = successful initialisation |
d_worrall | 0:e62e06e11575 | 158 | -1 = initialisation failure |
d_worrall | 0:e62e06e11575 | 159 | ******************************************************/ |
d_worrall | 0:e62e06e11575 | 160 | int I2SSlave::initialize_(PinName tx_sda, PinName tx_ws, PinName clk, PinName rx_sda, PinName rx_ws){ |
d_worrall | 0:e62e06e11575 | 161 | setPins_(tx_sda, tx_ws, clk, rx_sda, rx_ws); //designate pins |
d_worrall | 0:e62e06e11575 | 162 | LPC_SC->PCONP |= (1 << 27); |
d_worrall | 0:e62e06e11575 | 163 | //configure input/output register |
d_worrall | 0:e62e06e11575 | 164 | format_(bit_, mode_); |
d_worrall | 0:e62e06e11575 | 165 | //set mbed as SLAVE |
d_worrall | 0:e62e06e11575 | 166 | LPC_I2S->I2SDAO |= (1 << 5); |
d_worrall | 0:e62e06e11575 | 167 | LPC_I2S->I2SDAI |= (1 << 5); |
d_worrall | 0:e62e06e11575 | 168 | //clock mode |
d_worrall | 0:e62e06e11575 | 169 | setClocks_(4); |
d_worrall | 0:e62e06e11575 | 170 | //set slave mode |
d_worrall | 0:e62e06e11575 | 171 | modeConfig_(); |
d_worrall | 0:e62e06e11575 | 172 | //set receiver mode |
d_worrall | 0:e62e06e11575 | 173 | LPC_I2S->I2SRXMODE |= (1 << 1); |
d_worrall | 0:e62e06e11575 | 174 | //slave mode |
d_worrall | 0:e62e06e11575 | 175 | LPC_I2S->I2STXRATE = 0; |
d_worrall | 0:e62e06e11575 | 176 | LPC_I2S->I2SRXRATE = 0; |
d_worrall | 0:e62e06e11575 | 177 | //Start |
d_worrall | 0:e62e06e11575 | 178 | LPC_I2S->I2SDAO |= (0 << 3); |
d_worrall | 0:e62e06e11575 | 179 | LPC_I2S->I2SDAI |= (0 << 3); |
d_worrall | 0:e62e06e11575 | 180 | LPC_I2S->I2SDAO |= (0 << 4); |
d_worrall | 0:e62e06e11575 | 181 | LPC_I2S->I2SDAI |= (0 << 4); |
d_worrall | 0:e62e06e11575 | 182 | LPC_I2S->I2SDAO |= (0 << 15); |
d_worrall | 0:e62e06e11575 | 183 | return 0; |
d_worrall | 0:e62e06e11575 | 184 | } |
d_worrall | 0:e62e06e11575 | 185 | /****************************************************** |
d_worrall | 0:e62e06e11575 | 186 | * Function name: setClocks_() |
d_worrall | 0:e62e06e11575 | 187 | * |
d_worrall | 0:e62e06e11575 | 188 | * Description: Set the division setting on the internal clocks |
d_worrall | 0:e62e06e11575 | 189 | * |
d_worrall | 0:e62e06e11575 | 190 | * Parameters: int divideBy |
d_worrall | 0:e62e06e11575 | 191 | * Returns: nothing |
d_worrall | 0:e62e06e11575 | 192 | ******************************************************/ |
d_worrall | 0:e62e06e11575 | 193 | void I2SSlave::setClocks_(int divideBy){ |
d_worrall | 0:e62e06e11575 | 194 | switch(divideBy){ |
d_worrall | 0:e62e06e11575 | 195 | case 1: |
d_worrall | 0:e62e06e11575 | 196 | LPC_SC->PCLKSEL1 |= (1 << 22); |
d_worrall | 0:e62e06e11575 | 197 | LPC_SC->PCLKSEL1 |= (0 << 23); |
d_worrall | 0:e62e06e11575 | 198 | break; |
d_worrall | 0:e62e06e11575 | 199 | case 2: |
d_worrall | 0:e62e06e11575 | 200 | LPC_SC->PCLKSEL1 |= (0 << 22); |
d_worrall | 0:e62e06e11575 | 201 | LPC_SC->PCLKSEL1 |= (1 << 23); |
d_worrall | 0:e62e06e11575 | 202 | break; |
d_worrall | 0:e62e06e11575 | 203 | case 4: |
d_worrall | 0:e62e06e11575 | 204 | LPC_SC->PCLKSEL1 |= (0 << 22); |
d_worrall | 0:e62e06e11575 | 205 | LPC_SC->PCLKSEL1 |= (0 << 23); |
d_worrall | 0:e62e06e11575 | 206 | break; |
d_worrall | 0:e62e06e11575 | 207 | case 8: |
d_worrall | 0:e62e06e11575 | 208 | LPC_SC->PCLKSEL1 |= (1 << 22); |
d_worrall | 0:e62e06e11575 | 209 | LPC_SC->PCLKSEL1 |= (1 << 23); |
d_worrall | 0:e62e06e11575 | 210 | break; |
d_worrall | 0:e62e06e11575 | 211 | default: |
d_worrall | 0:e62e06e11575 | 212 | break; |
d_worrall | 0:e62e06e11575 | 213 | } |
d_worrall | 0:e62e06e11575 | 214 | } |
d_worrall | 0:e62e06e11575 | 215 | /****************************************************** |
d_worrall | 0:e62e06e11575 | 216 | * Function name: setPins_() |
d_worrall | 0:e62e06e11575 | 217 | * |
d_worrall | 0:e62e06e11575 | 218 | * Description: set external pin configuration |
d_worrall | 0:e62e06e11575 | 219 | * |
d_worrall | 0:e62e06e11575 | 220 | * Parameters: PinName tx_sda, PinName tx_ws, PinName clk, PinName rx_sda, PinName rx_ws |
d_worrall | 0:e62e06e11575 | 221 | * Returns: none |
d_worrall | 0:e62e06e11575 | 222 | ******************************************************/ |
d_worrall | 0:e62e06e11575 | 223 | void I2SSlave::setPins_(PinName tx_sda, PinName tx_ws, PinName clk, PinName rx_sda, PinName rx_ws){ |
d_worrall | 0:e62e06e11575 | 224 | if(rx_ws == p29){ |
d_worrall | 0:e62e06e11575 | 225 | LPC_PINCON->PINSEL0 |= (1 << 10); //set p29 as receive word select line |
d_worrall | 0:e62e06e11575 | 226 | } else { |
d_worrall | 0:e62e06e11575 | 227 | LPC_PINCON->PINSEL1 |= (2 << 16); //set p16 as receive word select line |
d_worrall | 0:e62e06e11575 | 228 | } |
d_worrall | 0:e62e06e11575 | 229 | if(rx_sda == p8){ |
d_worrall | 0:e62e06e11575 | 230 | LPC_PINCON->PINSEL0 |= (1 << 12); //set p8 as receive serial data line |
d_worrall | 0:e62e06e11575 | 231 | } else { |
d_worrall | 0:e62e06e11575 | 232 | LPC_PINCON->PINSEL1 |= (2 << 18); //set p17 as receive serial data line |
d_worrall | 0:e62e06e11575 | 233 | } |
d_worrall | 0:e62e06e11575 | 234 | LPC_PINCON->PINSEL0 |= (1 << 14); //set p7 as transmit clock line (only one of these) |
d_worrall | 0:e62e06e11575 | 235 | LPC_PINCON->PINSEL0 |= (1 << 16); //set p6 as word select line (only one of these) |
d_worrall | 0:e62e06e11575 | 236 | LPC_PINCON->PINSEL0 |= (1 << 18); //set p5 as transmit serial data line (only one of these) |
d_worrall | 0:e62e06e11575 | 237 | LPC_PINCON->PINSEL0 |= (0 << 8); //clear rx_clk |
d_worrall | 0:e62e06e11575 | 238 | } |
d_worrall | 0:e62e06e11575 | 239 | /****************************************************** |
d_worrall | 0:e62e06e11575 | 240 | * Function name: format_() |
d_worrall | 0:e62e06e11575 | 241 | * |
d_worrall | 0:e62e06e11575 | 242 | * Description: sets the bit length for writing and stereo or mono mode |
d_worrall | 0:e62e06e11575 | 243 | * |
d_worrall | 0:e62e06e11575 | 244 | * Parameters: int bit, bool mode |
d_worrall | 0:e62e06e11575 | 245 | * Returns: none |
d_worrall | 0:e62e06e11575 | 246 | ******************************************************/ |
d_worrall | 0:e62e06e11575 | 247 | void I2SSlave::format_(int bit, bool mode){ |
d_worrall | 0:e62e06e11575 | 248 | uint32_t bps= ((bit+1)*8)-1; |
d_worrall | 0:e62e06e11575 | 249 | LPC_I2S->I2SDAO &= (0x00 << 6); |
d_worrall | 0:e62e06e11575 | 250 | LPC_I2S->I2SDAO |= (bps << 6); |
d_worrall | 0:e62e06e11575 | 251 | //set bit length |
d_worrall | 0:e62e06e11575 | 252 | switch(bit){ |
d_worrall | 0:e62e06e11575 | 253 | case 8: |
d_worrall | 0:e62e06e11575 | 254 | LPC_I2S->I2SDAO &= 0xfffffffc; |
d_worrall | 0:e62e06e11575 | 255 | break; |
d_worrall | 0:e62e06e11575 | 256 | case 16: |
d_worrall | 0:e62e06e11575 | 257 | LPC_I2S->I2SDAO &= (0 << 1); |
d_worrall | 0:e62e06e11575 | 258 | LPC_I2S->I2SDAO |= (1 << 0); |
d_worrall | 0:e62e06e11575 | 259 | break; |
d_worrall | 0:e62e06e11575 | 260 | case 32: |
d_worrall | 0:e62e06e11575 | 261 | LPC_I2S->I2SDAO &= (0 << 1); |
d_worrall | 0:e62e06e11575 | 262 | LPC_I2S->I2SDAO |= (3 << 0); |
d_worrall | 0:e62e06e11575 | 263 | break; |
d_worrall | 0:e62e06e11575 | 264 | default: |
d_worrall | 0:e62e06e11575 | 265 | break; |
d_worrall | 0:e62e06e11575 | 266 | } |
d_worrall | 0:e62e06e11575 | 267 | //set audio mode |
d_worrall | 0:e62e06e11575 | 268 | if(mode == STEREO){ |
d_worrall | 0:e62e06e11575 | 269 | LPC_I2S->I2SDAO |= (0 << 2); |
d_worrall | 0:e62e06e11575 | 270 | } else { |
d_worrall | 0:e62e06e11575 | 271 | LPC_I2S->I2SDAO |= (1 << 2); |
d_worrall | 0:e62e06e11575 | 272 | } |
d_worrall | 0:e62e06e11575 | 273 | //set transmitter and receiver setting to be the same |
d_worrall | 0:e62e06e11575 | 274 | LPC_I2S->I2SDAI &= (0x00 << 6); |
d_worrall | 0:e62e06e11575 | 275 | LPC_I2S->I2SDAI |= (bps << 6); |
d_worrall | 0:e62e06e11575 | 276 | //set bit length |
d_worrall | 0:e62e06e11575 | 277 | switch(bit){ |
d_worrall | 0:e62e06e11575 | 278 | case 8: |
d_worrall | 0:e62e06e11575 | 279 | LPC_I2S->I2SDAI &= 0xfffffffc; |
d_worrall | 0:e62e06e11575 | 280 | break; |
d_worrall | 0:e62e06e11575 | 281 | case 16: |
d_worrall | 0:e62e06e11575 | 282 | LPC_I2S->I2SDAI &= (0 << 1); |
d_worrall | 0:e62e06e11575 | 283 | LPC_I2S->I2SDAI |= (1 << 0); |
d_worrall | 0:e62e06e11575 | 284 | break; |
d_worrall | 0:e62e06e11575 | 285 | case 32: |
d_worrall | 0:e62e06e11575 | 286 | LPC_I2S->I2SDAI &= (0 << 1); |
d_worrall | 0:e62e06e11575 | 287 | LPC_I2S->I2SDAI |= (3 << 0); |
d_worrall | 0:e62e06e11575 | 288 | break; |
d_worrall | 0:e62e06e11575 | 289 | default: |
d_worrall | 0:e62e06e11575 | 290 | break; |
d_worrall | 0:e62e06e11575 | 291 | } |
d_worrall | 0:e62e06e11575 | 292 | //set audio mode |
d_worrall | 0:e62e06e11575 | 293 | if(mode == STEREO){ |
d_worrall | 0:e62e06e11575 | 294 | LPC_I2S->I2SDAI |= (0 << 2); |
d_worrall | 0:e62e06e11575 | 295 | } else { |
d_worrall | 0:e62e06e11575 | 296 | LPC_I2S->I2SDAI |= (1 << 2); |
d_worrall | 0:e62e06e11575 | 297 | } |
d_worrall | 0:e62e06e11575 | 298 | } |
d_worrall | 0:e62e06e11575 | 299 | /****************************************************** |
d_worrall | 0:e62e06e11575 | 300 | * Function name: modeConfig_() |
d_worrall | 0:e62e06e11575 | 301 | * |
d_worrall | 0:e62e06e11575 | 302 | * Description: Set slave mode |
d_worrall | 0:e62e06e11575 | 303 | * |
d_worrall | 0:e62e06e11575 | 304 | * Parameters: none |
d_worrall | 0:e62e06e11575 | 305 | * Returns: none |
d_worrall | 0:e62e06e11575 | 306 | ******************************************************/ |
d_worrall | 0:e62e06e11575 | 307 | void I2SSlave::modeConfig_(void){ |
d_worrall | 0:e62e06e11575 | 308 | LPC_I2S->I2STXMODE |= (0x0 << 0); |
d_worrall | 0:e62e06e11575 | 309 | LPC_I2S->I2SRXMODE |= (0x0 << 0); |
d_worrall | 0:e62e06e11575 | 310 | } |
d_worrall | 0:e62e06e11575 | 311 | /****************************************************** |
d_worrall | 0:e62e06e11575 | 312 | * Function name: storePins_() |
d_worrall | 0:e62e06e11575 | 313 | * |
d_worrall | 0:e62e06e11575 | 314 | * Description: set external pin configuration |
d_worrall | 0:e62e06e11575 | 315 | * |
d_worrall | 0:e62e06e11575 | 316 | * Parameters: PinName tx_sda, PinName tx_ws, PinName clk, PinName rx_sda, PinName rx_ws |
d_worrall | 0:e62e06e11575 | 317 | * Returns: none |
d_worrall | 0:e62e06e11575 | 318 | ******************************************************/ |
d_worrall | 0:e62e06e11575 | 319 | void I2SSlave::storePins_(PinName tx_sda, PinName tx_ws, PinName clk, PinName rx_sda, PinName rx_ws){ |
d_worrall | 0:e62e06e11575 | 320 | tx_sda_ = tx_sda; |
d_worrall | 0:e62e06e11575 | 321 | tx_ws_ = tx_ws; |
d_worrall | 0:e62e06e11575 | 322 | clk_ = clk; |
d_worrall | 0:e62e06e11575 | 323 | rx_sda_ = rx_sda; |
d_worrall | 0:e62e06e11575 | 324 | rx_ws_ = rx_ws; |
d_worrall | 0:e62e06e11575 | 325 | } |