More readable TLV320 Lib

Dependents:   TalkThrough

Committer:
hollegha
Date:
Wed Oct 22 09:23:47 2014 +0000
Revision:
0:808bb0b9cf45
More readable TLV320-Lib

Who changed what in which revision?

UserRevisionLine numberNew 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