More readable TLV320 Lib
I2SSlaveHL.cpp@0:808bb0b9cf45, 2014-10-22 (annotated)
- Committer:
- hollegha
- Date:
- Wed Oct 22 09:23:47 2014 +0000
- Revision:
- 0:808bb0b9cf45
More readable TLV320-Lib
Who changed what in which revision?
User | Revision | Line number | New contents of line |
---|---|---|---|
hollegha | 0:808bb0b9cf45 | 1 | |
hollegha | 0:808bb0b9cf45 | 2 | #include "I2SSlaveHL.h" |
hollegha | 0:808bb0b9cf45 | 3 | |
hollegha | 0:808bb0b9cf45 | 4 | FunctionPointer akjnh3489v8ncv; |
hollegha | 0:808bb0b9cf45 | 5 | |
hollegha | 0:808bb0b9cf45 | 6 | extern "C" void I2S_IRQHandler(void) { |
hollegha | 0:808bb0b9cf45 | 7 | akjnh3489v8ncv.call(); |
hollegha | 0:808bb0b9cf45 | 8 | } |
hollegha | 0:808bb0b9cf45 | 9 | |
hollegha | 0:808bb0b9cf45 | 10 | #undef MBV |
hollegha | 0:808bb0b9cf45 | 11 | #define MBV(num) (1<<num) |
hollegha | 0:808bb0b9cf45 | 12 | |
hollegha | 0:808bb0b9cf45 | 13 | I2SSlave::I2SSlave(PinName tx_sda, PinName tx_ws, PinName clk, PinName rx_sda, PinName rx_ws) |
hollegha | 0:808bb0b9cf45 | 14 | { |
hollegha | 0:808bb0b9cf45 | 15 | storePins_(tx_sda, tx_ws, clk, rx_sda, rx_ws); |
hollegha | 0:808bb0b9cf45 | 16 | format(16, STEREO); |
hollegha | 0:808bb0b9cf45 | 17 | } |
hollegha | 0:808bb0b9cf45 | 18 | |
hollegha | 0:808bb0b9cf45 | 19 | void I2SSlave::format(int bit, bool mode) |
hollegha | 0:808bb0b9cf45 | 20 | { |
hollegha | 0:808bb0b9cf45 | 21 | bit_ = bit; |
hollegha | 0:808bb0b9cf45 | 22 | mode_ = mode; |
hollegha | 0:808bb0b9cf45 | 23 | initialize_(tx_sda_, tx_ws_, clk_, rx_sda_, rx_ws_); |
hollegha | 0:808bb0b9cf45 | 24 | } |
hollegha | 0:808bb0b9cf45 | 25 | |
hollegha | 0:808bb0b9cf45 | 26 | |
hollegha | 0:808bb0b9cf45 | 27 | void I2SSlave::Write(int32_t aLeft, int32_t aRight) |
hollegha | 0:808bb0b9cf45 | 28 | { |
hollegha | 0:808bb0b9cf45 | 29 | int32_t lr = (aRight << 16) + aLeft; |
hollegha | 0:808bb0b9cf45 | 30 | LPC_I2S->I2STXFIFO = lr; |
hollegha | 0:808bb0b9cf45 | 31 | } |
hollegha | 0:808bb0b9cf45 | 32 | |
hollegha | 0:808bb0b9cf45 | 33 | void I2SSlave::Read(int32_t* aLeft, int32_t* aRight) |
hollegha | 0:808bb0b9cf45 | 34 | { |
hollegha | 0:808bb0b9cf45 | 35 | int32_t v32 = LPC_I2S->I2SRXFIFO; |
hollegha | 0:808bb0b9cf45 | 36 | *aLeft = (int16_t)v32; |
hollegha | 0:808bb0b9cf45 | 37 | *aRight = (int16_t)(v32 >> 16); |
hollegha | 0:808bb0b9cf45 | 38 | } |
hollegha | 0:808bb0b9cf45 | 39 | |
hollegha | 0:808bb0b9cf45 | 40 | |
hollegha | 0:808bb0b9cf45 | 41 | |
hollegha | 0:808bb0b9cf45 | 42 | void I2SSlave::start(int mode) |
hollegha | 0:808bb0b9cf45 | 43 | { |
hollegha | 0:808bb0b9cf45 | 44 | switch(mode){ |
hollegha | 0:808bb0b9cf45 | 45 | case(0): |
hollegha | 0:808bb0b9cf45 | 46 | LPC_I2S->I2SIRQ |= (0 << 0); //disable receive interrupt |
hollegha | 0:808bb0b9cf45 | 47 | LPC_I2S->I2SIRQ |= (0 << 1); //disable transmit interrupt |
hollegha | 0:808bb0b9cf45 | 48 | break; |
hollegha | 0:808bb0b9cf45 | 49 | case(1): |
hollegha | 0:808bb0b9cf45 | 50 | LPC_I2S->I2SIRQ |= (0 << 0); //disable receive interrupt |
hollegha | 0:808bb0b9cf45 | 51 | LPC_I2S->I2SIRQ |= (1 << 1); //enable transmit interrupt |
hollegha | 0:808bb0b9cf45 | 52 | LPC_I2S->I2SIRQ |= (0 << 16); //set I2STXFIFO depth to 0 words |
hollegha | 0:808bb0b9cf45 | 53 | break; |
hollegha | 0:808bb0b9cf45 | 54 | case(2): |
hollegha | 0:808bb0b9cf45 | 55 | LPC_I2S->I2SIRQ |= (1 << 0); //enable receive interrupt |
hollegha | 0:808bb0b9cf45 | 56 | LPC_I2S->I2SIRQ |= (0 << 1); //disable transmit interrupt |
hollegha | 0:808bb0b9cf45 | 57 | LPC_I2S->I2SIRQ |= (4 << 8); //set I2SRXFIFO depth to 4 words |
hollegha | 0:808bb0b9cf45 | 58 | break; |
hollegha | 0:808bb0b9cf45 | 59 | case(3): |
hollegha | 0:808bb0b9cf45 | 60 | LPC_I2S->I2SIRQ |= (1 << 0); //enable receive interrupt |
hollegha | 0:808bb0b9cf45 | 61 | LPC_I2S->I2SIRQ |= (4 << 8); //set I2SRXFIFO depth to 4 words |
hollegha | 0:808bb0b9cf45 | 62 | LPC_I2S->I2SIRQ |= (1 << 1); //enable transmit interrupt |
hollegha | 0:808bb0b9cf45 | 63 | LPC_I2S->I2SIRQ |= (0 << 16); //set I2STXFIFO depth to 0 words |
hollegha | 0:808bb0b9cf45 | 64 | break; |
hollegha | 0:808bb0b9cf45 | 65 | default: |
hollegha | 0:808bb0b9cf45 | 66 | break; |
hollegha | 0:808bb0b9cf45 | 67 | } |
hollegha | 0:808bb0b9cf45 | 68 | NVIC_SetPriority(I2S_IRQn, 0); |
hollegha | 0:808bb0b9cf45 | 69 | NVIC_EnableIRQ(I2S_IRQn); //enable I2S interrupt in the NVIC |
hollegha | 0:808bb0b9cf45 | 70 | } |
hollegha | 0:808bb0b9cf45 | 71 | |
hollegha | 0:808bb0b9cf45 | 72 | void I2SSlave::Start() |
hollegha | 0:808bb0b9cf45 | 73 | { |
hollegha | 0:808bb0b9cf45 | 74 | LPC_I2S->I2SIRQ = 0; |
hollegha | 0:808bb0b9cf45 | 75 | LPC_I2S->I2SIRQ |= MBV(0); // ena RecvIRQ |
hollegha | 0:808bb0b9cf45 | 76 | // LPC_I2S->I2SIRQ |= MBV(8); // Rx-Level=1 |
hollegha | 0:808bb0b9cf45 | 77 | LPC_I2S->I2SIRQ |= MBV(11); // Rx-Level=8 |
hollegha | 0:808bb0b9cf45 | 78 | NVIC_SetPriority(I2S_IRQn, 0); |
hollegha | 0:808bb0b9cf45 | 79 | NVIC_EnableIRQ(I2S_IRQn); |
hollegha | 0:808bb0b9cf45 | 80 | } |
hollegha | 0:808bb0b9cf45 | 81 | |
hollegha | 0:808bb0b9cf45 | 82 | void I2SSlave::Stop() |
hollegha | 0:808bb0b9cf45 | 83 | { |
hollegha | 0:808bb0b9cf45 | 84 | NVIC_DisableIRQ(I2S_IRQn); |
hollegha | 0:808bb0b9cf45 | 85 | } |
hollegha | 0:808bb0b9cf45 | 86 | |
hollegha | 0:808bb0b9cf45 | 87 | int I2SSlave::status(void) |
hollegha | 0:808bb0b9cf45 | 88 | { |
hollegha | 0:808bb0b9cf45 | 89 | return LPC_I2S->I2SSTATE; |
hollegha | 0:808bb0b9cf45 | 90 | } |
hollegha | 0:808bb0b9cf45 | 91 | |
hollegha | 0:808bb0b9cf45 | 92 | int I2SSlave::GetRxLevel() |
hollegha | 0:808bb0b9cf45 | 93 | { |
hollegha | 0:808bb0b9cf45 | 94 | int val = LPC_I2S->I2SSTATE >> 8; |
hollegha | 0:808bb0b9cf45 | 95 | return (0x0000000F & val); |
hollegha | 0:808bb0b9cf45 | 96 | } |
hollegha | 0:808bb0b9cf45 | 97 | |
hollegha | 0:808bb0b9cf45 | 98 | int I2SSlave::GetTxLevel() |
hollegha | 0:808bb0b9cf45 | 99 | { |
hollegha | 0:808bb0b9cf45 | 100 | int val = LPC_I2S->I2SSTATE >> 16; |
hollegha | 0:808bb0b9cf45 | 101 | return (0x0000000F & val); |
hollegha | 0:808bb0b9cf45 | 102 | } |
hollegha | 0:808bb0b9cf45 | 103 | |
hollegha | 0:808bb0b9cf45 | 104 | |
hollegha | 0:808bb0b9cf45 | 105 | int I2SSlave::initialize_(PinName tx_sda, PinName tx_ws, PinName clk, PinName rx_sda, PinName rx_ws) |
hollegha | 0:808bb0b9cf45 | 106 | { |
hollegha | 0:808bb0b9cf45 | 107 | setPins_(tx_sda, tx_ws, clk, rx_sda, rx_ws); // designate pins |
hollegha | 0:808bb0b9cf45 | 108 | LPC_SC->PCONP |= (1 << 27); |
hollegha | 0:808bb0b9cf45 | 109 | //configure input/output register |
hollegha | 0:808bb0b9cf45 | 110 | format_(bit_, mode_); |
hollegha | 0:808bb0b9cf45 | 111 | //set mbed as SLAVE |
hollegha | 0:808bb0b9cf45 | 112 | LPC_I2S->I2SDAO |= (1 << 5); |
hollegha | 0:808bb0b9cf45 | 113 | LPC_I2S->I2SDAI |= (1 << 5); |
hollegha | 0:808bb0b9cf45 | 114 | //clock mode |
hollegha | 0:808bb0b9cf45 | 115 | setClocks_(4); |
hollegha | 0:808bb0b9cf45 | 116 | //set slave mode |
hollegha | 0:808bb0b9cf45 | 117 | modeConfig_(); |
hollegha | 0:808bb0b9cf45 | 118 | //set receiver mode |
hollegha | 0:808bb0b9cf45 | 119 | LPC_I2S->I2SRXMODE |= (1 << 1); |
hollegha | 0:808bb0b9cf45 | 120 | //slave mode |
hollegha | 0:808bb0b9cf45 | 121 | LPC_I2S->I2STXRATE = 0; |
hollegha | 0:808bb0b9cf45 | 122 | LPC_I2S->I2SRXRATE = 0; |
hollegha | 0:808bb0b9cf45 | 123 | //Start |
hollegha | 0:808bb0b9cf45 | 124 | LPC_I2S->I2SDAO |= (0 << 3); |
hollegha | 0:808bb0b9cf45 | 125 | LPC_I2S->I2SDAI |= (0 << 3); |
hollegha | 0:808bb0b9cf45 | 126 | LPC_I2S->I2SDAO |= (0 << 4); |
hollegha | 0:808bb0b9cf45 | 127 | LPC_I2S->I2SDAI |= (0 << 4); |
hollegha | 0:808bb0b9cf45 | 128 | LPC_I2S->I2SDAO |= (0 << 15); |
hollegha | 0:808bb0b9cf45 | 129 | return 0; |
hollegha | 0:808bb0b9cf45 | 130 | } |
hollegha | 0:808bb0b9cf45 | 131 | |
hollegha | 0:808bb0b9cf45 | 132 | // Set the division setting on the internal clocks |
hollegha | 0:808bb0b9cf45 | 133 | void I2SSlave::setClocks_(int divideBy) |
hollegha | 0:808bb0b9cf45 | 134 | { |
hollegha | 0:808bb0b9cf45 | 135 | switch(divideBy){ |
hollegha | 0:808bb0b9cf45 | 136 | case 1: |
hollegha | 0:808bb0b9cf45 | 137 | LPC_SC->PCLKSEL1 |= (1 << 22); |
hollegha | 0:808bb0b9cf45 | 138 | LPC_SC->PCLKSEL1 |= (0 << 23); |
hollegha | 0:808bb0b9cf45 | 139 | break; |
hollegha | 0:808bb0b9cf45 | 140 | case 2: |
hollegha | 0:808bb0b9cf45 | 141 | LPC_SC->PCLKSEL1 |= (0 << 22); |
hollegha | 0:808bb0b9cf45 | 142 | LPC_SC->PCLKSEL1 |= (1 << 23); |
hollegha | 0:808bb0b9cf45 | 143 | break; |
hollegha | 0:808bb0b9cf45 | 144 | case 4: |
hollegha | 0:808bb0b9cf45 | 145 | LPC_SC->PCLKSEL1 |= (0 << 22); |
hollegha | 0:808bb0b9cf45 | 146 | LPC_SC->PCLKSEL1 |= (0 << 23); |
hollegha | 0:808bb0b9cf45 | 147 | break; |
hollegha | 0:808bb0b9cf45 | 148 | case 8: |
hollegha | 0:808bb0b9cf45 | 149 | LPC_SC->PCLKSEL1 |= (1 << 22); |
hollegha | 0:808bb0b9cf45 | 150 | LPC_SC->PCLKSEL1 |= (1 << 23); |
hollegha | 0:808bb0b9cf45 | 151 | break; |
hollegha | 0:808bb0b9cf45 | 152 | default: |
hollegha | 0:808bb0b9cf45 | 153 | break; |
hollegha | 0:808bb0b9cf45 | 154 | } |
hollegha | 0:808bb0b9cf45 | 155 | } |
hollegha | 0:808bb0b9cf45 | 156 | |
hollegha | 0:808bb0b9cf45 | 157 | void I2SSlave::setPins_(PinName tx_sda, PinName tx_ws, PinName clk, PinName rx_sda, PinName rx_ws) |
hollegha | 0:808bb0b9cf45 | 158 | { |
hollegha | 0:808bb0b9cf45 | 159 | if(rx_ws == p29){ |
hollegha | 0:808bb0b9cf45 | 160 | LPC_PINCON->PINSEL0 |= (1 << 10); //set p29 as receive word select line |
hollegha | 0:808bb0b9cf45 | 161 | } else { |
hollegha | 0:808bb0b9cf45 | 162 | LPC_PINCON->PINSEL1 |= (2 << 16); //set p16 as receive word select line |
hollegha | 0:808bb0b9cf45 | 163 | } |
hollegha | 0:808bb0b9cf45 | 164 | if(rx_sda == p8){ |
hollegha | 0:808bb0b9cf45 | 165 | LPC_PINCON->PINSEL0 |= (1 << 12); //set p8 as receive serial data line |
hollegha | 0:808bb0b9cf45 | 166 | } else { |
hollegha | 0:808bb0b9cf45 | 167 | LPC_PINCON->PINSEL1 |= (2 << 18); //set p17 as receive serial data line |
hollegha | 0:808bb0b9cf45 | 168 | } |
hollegha | 0:808bb0b9cf45 | 169 | LPC_PINCON->PINSEL0 |= (1 << 14); //set p7 as transmit clock line (only one of these) |
hollegha | 0:808bb0b9cf45 | 170 | LPC_PINCON->PINSEL0 |= (1 << 16); //set p6 as word select line (only one of these) |
hollegha | 0:808bb0b9cf45 | 171 | LPC_PINCON->PINSEL0 |= (1 << 18); //set p5 as transmit serial data line (only one of these) |
hollegha | 0:808bb0b9cf45 | 172 | LPC_PINCON->PINSEL0 |= (0 << 8); //clear rx_clk |
hollegha | 0:808bb0b9cf45 | 173 | } |
hollegha | 0:808bb0b9cf45 | 174 | |
hollegha | 0:808bb0b9cf45 | 175 | |
hollegha | 0:808bb0b9cf45 | 176 | void I2SSlave::format_(int bit, bool mode) |
hollegha | 0:808bb0b9cf45 | 177 | { |
hollegha | 0:808bb0b9cf45 | 178 | uint32_t bps= ((bit+1)*8)-1; |
hollegha | 0:808bb0b9cf45 | 179 | LPC_I2S->I2SDAO &= (0x00 << 6); |
hollegha | 0:808bb0b9cf45 | 180 | LPC_I2S->I2SDAO |= (bps << 6); |
hollegha | 0:808bb0b9cf45 | 181 | //set bit length |
hollegha | 0:808bb0b9cf45 | 182 | switch(bit){ |
hollegha | 0:808bb0b9cf45 | 183 | case 8: |
hollegha | 0:808bb0b9cf45 | 184 | LPC_I2S->I2SDAO &= 0xfffffffc; |
hollegha | 0:808bb0b9cf45 | 185 | break; |
hollegha | 0:808bb0b9cf45 | 186 | case 16: |
hollegha | 0:808bb0b9cf45 | 187 | LPC_I2S->I2SDAO &= (0 << 1); |
hollegha | 0:808bb0b9cf45 | 188 | LPC_I2S->I2SDAO |= (1 << 0); |
hollegha | 0:808bb0b9cf45 | 189 | break; |
hollegha | 0:808bb0b9cf45 | 190 | case 32: |
hollegha | 0:808bb0b9cf45 | 191 | LPC_I2S->I2SDAO &= (0 << 1); |
hollegha | 0:808bb0b9cf45 | 192 | LPC_I2S->I2SDAO |= (3 << 0); |
hollegha | 0:808bb0b9cf45 | 193 | break; |
hollegha | 0:808bb0b9cf45 | 194 | default: |
hollegha | 0:808bb0b9cf45 | 195 | break; |
hollegha | 0:808bb0b9cf45 | 196 | } |
hollegha | 0:808bb0b9cf45 | 197 | //set audio mode |
hollegha | 0:808bb0b9cf45 | 198 | if(mode == STEREO){ |
hollegha | 0:808bb0b9cf45 | 199 | LPC_I2S->I2SDAO |= (0 << 2); |
hollegha | 0:808bb0b9cf45 | 200 | } else { |
hollegha | 0:808bb0b9cf45 | 201 | LPC_I2S->I2SDAO |= (1 << 2); |
hollegha | 0:808bb0b9cf45 | 202 | } |
hollegha | 0:808bb0b9cf45 | 203 | //set transmitter and receiver setting to be the same |
hollegha | 0:808bb0b9cf45 | 204 | LPC_I2S->I2SDAI &= (0x00 << 6); |
hollegha | 0:808bb0b9cf45 | 205 | LPC_I2S->I2SDAI |= (bps << 6); |
hollegha | 0:808bb0b9cf45 | 206 | //set bit length |
hollegha | 0:808bb0b9cf45 | 207 | switch(bit){ |
hollegha | 0:808bb0b9cf45 | 208 | case 8: |
hollegha | 0:808bb0b9cf45 | 209 | LPC_I2S->I2SDAI &= 0xfffffffc; |
hollegha | 0:808bb0b9cf45 | 210 | break; |
hollegha | 0:808bb0b9cf45 | 211 | case 16: |
hollegha | 0:808bb0b9cf45 | 212 | LPC_I2S->I2SDAI &= (0 << 1); |
hollegha | 0:808bb0b9cf45 | 213 | LPC_I2S->I2SDAI |= (1 << 0); |
hollegha | 0:808bb0b9cf45 | 214 | break; |
hollegha | 0:808bb0b9cf45 | 215 | case 32: |
hollegha | 0:808bb0b9cf45 | 216 | LPC_I2S->I2SDAI &= (0 << 1); |
hollegha | 0:808bb0b9cf45 | 217 | LPC_I2S->I2SDAI |= (3 << 0); |
hollegha | 0:808bb0b9cf45 | 218 | break; |
hollegha | 0:808bb0b9cf45 | 219 | default: |
hollegha | 0:808bb0b9cf45 | 220 | break; |
hollegha | 0:808bb0b9cf45 | 221 | } |
hollegha | 0:808bb0b9cf45 | 222 | //set audio mode |
hollegha | 0:808bb0b9cf45 | 223 | if(mode == STEREO){ |
hollegha | 0:808bb0b9cf45 | 224 | LPC_I2S->I2SDAI |= (0 << 2); |
hollegha | 0:808bb0b9cf45 | 225 | } else { |
hollegha | 0:808bb0b9cf45 | 226 | LPC_I2S->I2SDAI |= (1 << 2); |
hollegha | 0:808bb0b9cf45 | 227 | } |
hollegha | 0:808bb0b9cf45 | 228 | } |
hollegha | 0:808bb0b9cf45 | 229 | |
hollegha | 0:808bb0b9cf45 | 230 | |
hollegha | 0:808bb0b9cf45 | 231 | void I2SSlave::modeConfig_(void) |
hollegha | 0:808bb0b9cf45 | 232 | { |
hollegha | 0:808bb0b9cf45 | 233 | LPC_I2S->I2STXMODE |= (0x0 << 0); |
hollegha | 0:808bb0b9cf45 | 234 | LPC_I2S->I2SRXMODE |= (0x0 << 0); |
hollegha | 0:808bb0b9cf45 | 235 | } |
hollegha | 0:808bb0b9cf45 | 236 | |
hollegha | 0:808bb0b9cf45 | 237 | |
hollegha | 0:808bb0b9cf45 | 238 | void I2SSlave::storePins_(PinName tx_sda, PinName tx_ws, PinName clk, PinName rx_sda, PinName rx_ws) |
hollegha | 0:808bb0b9cf45 | 239 | { |
hollegha | 0:808bb0b9cf45 | 240 | tx_sda_ = tx_sda; |
hollegha | 0:808bb0b9cf45 | 241 | tx_ws_ = tx_ws; |
hollegha | 0:808bb0b9cf45 | 242 | clk_ = clk; |
hollegha | 0:808bb0b9cf45 | 243 | rx_sda_ = rx_sda; |
hollegha | 0:808bb0b9cf45 | 244 | rx_ws_ = rx_ws; |
hollegha | 0:808bb0b9cf45 | 245 | } |
hollegha | 0:808bb0b9cf45 | 246 | |
hollegha | 0:808bb0b9cf45 | 247 |