@@ -36,10 +36,11 @@ volatile uint8_t txerror_flag = 0;
36
36
37
37
volatile uint8_t rxdone_flag = 0 ;
38
38
volatile uint8_t rxerror_flag = 0 ;
39
-
39
+ uint8_t frameDelay = 0 ;
40
40
41
41
static void txi2s_done (void * x)
42
42
{
43
+ CurieI2SDMA.lastFrameDelay ();
43
44
txdone_flag = 1 ;
44
45
45
46
return ;
@@ -76,6 +77,11 @@ Curie_I2SDMA::Curie_I2SDMA()
76
77
{
77
78
}
78
79
80
+ void Curie_I2SDMA::lastFrameDelay ()
81
+ {
82
+ delay (frameDelay);
83
+ }
84
+
79
85
int Curie_I2SDMA::iniTX ()
80
86
{
81
87
muxTX (1 );
@@ -154,8 +160,8 @@ int Curie_I2SDMA::beginTX(uint16_t sample_rate,uint8_t resolution,uint8_t master
154
160
txcfg.cb_err = txi2s_err;
155
161
txdone_flag = 0 ;
156
162
txerror_flag = 0 ;
163
+ frameDelay = 5 ;
157
164
soc_i2s_config (I2S_CHANNEL_TX, &txcfg);
158
-
159
165
return I2S_DMA_OK;
160
166
}
161
167
@@ -195,10 +201,11 @@ int Curie_I2SDMA::beginRX(uint16_t sample_rate,uint8_t resolution,uint8_t master
195
201
return I2S_DMA_OK;
196
202
}
197
203
198
- int Curie_I2SDMA::transTX (uint32_t * buf_TX,uint32_t len)
204
+ int Curie_I2SDMA::transTX (void * buf_TX,uint32_t len, uint32_t len_per_data )
199
205
{
200
- soc_i2s_stream (buf_TX, len,0 );
201
-
206
+ int status = soc_i2s_stream (buf_TX, len,len_per_data,0 );
207
+ if (status)
208
+ return I2S_DMA_FAIL;
202
209
while (1 )
203
210
{
204
211
// check the DMA and I2S status
@@ -215,9 +222,11 @@ int Curie_I2SDMA::transTX(uint32_t* buf_TX,uint32_t len)
215
222
}
216
223
}
217
224
218
- int Curie_I2SDMA::transRX (uint32_t * buf_RX,uint32_t len)
225
+ int Curie_I2SDMA::transRX (void * buf_RX,uint32_t len, uint32_t len_per_data )
219
226
{
220
- soc_i2s_listen (buf_RX, len ,0 );
227
+ int status = soc_i2s_listen (buf_RX, len ,len_per_data,0 );
228
+ if (status)
229
+ return I2S_DMA_FAIL;
221
230
222
231
while (1 )
223
232
{
@@ -248,28 +257,66 @@ void Curie_I2SDMA::stopRX()
248
257
muxRX (0 );
249
258
}
250
259
251
- int Curie_I2SDMA::mergeData (uint32_t * buf_left,uint32_t * buf_right,uint32_t * buf_TX)
260
+ int Curie_I2SDMA::mergeData (void * buf_left,void * buf_right,void * buf_TX, uint32_t length_TX, uint32_t len_per_data )
252
261
{
253
- int length = (int )(sizeof (buf_left) / sizeof (buf_left[0 ]));
254
- for (int i = 0 ; i < length;++i)
262
+ if (len_per_data == 1 )
255
263
{
256
- buf_TX[2 *i] = buf_left[i];
257
- buf_TX[2 *i+1 ] = buf_right[i];
264
+ for (uint32_t i = 0 ; i < length_TX/2 ;++i)
265
+ {
266
+ *((uint8_t *)buf_TX+2 *i) = *((uint8_t *)buf_left+i);
267
+ *((uint8_t *)buf_TX+2 *i+1 ) = *((uint8_t *)buf_right+i);
268
+ }
258
269
}
270
+ else if (len_per_data == 2 )
271
+ {
272
+ for (uint32_t i = 0 ; i < length_TX/2 ;++i)
273
+ {
274
+ *((uint16_t *)buf_TX+2 *i) = *((uint16_t *)buf_left+i);
275
+ *((uint16_t *)buf_TX+2 *i+1 ) = *((uint16_t *)buf_right+i);
276
+ }
277
+ }
278
+ else if (len_per_data == 4 )
279
+ {
280
+ for (uint32_t i = 0 ; i < length_TX/2 ;++i)
281
+ {
282
+ *((uint32_t *)buf_TX+2 *i) = *((uint32_t *)buf_left+i);
283
+ *((uint32_t *)buf_TX+2 *i+1 ) = *((uint32_t *)buf_right+i);
284
+ }
285
+ }
286
+ else
287
+ return I2S_DMA_FAIL;
259
288
260
- return I2S_DMA_OK;
289
+ return I2S_DMA_OK;
261
290
}
262
291
263
- int Curie_I2SDMA::separateData (uint32_t * buf_left,uint32_t * buf_right,uint32_t * buf_RX)
264
- {
265
- int length1 = (int )( sizeof (buf_RX) / sizeof (buf_RX[0 ])/2 );
266
- int length2 = (int )( sizeof (buf_left) / sizeof (buf_left[0 ]) );
267
- int length = length1 < length2 ? length1 : length2;
268
-
269
- for (int i = 0 ; i < length;++i)
292
+ int Curie_I2SDMA::separateData (void * buf_left,void * buf_right,void * buf_RX,uint32_t length_RX,uint32_t len_per_data)
293
+ {
294
+ if (len_per_data == 1 )
295
+ {
296
+ for (uint32_t i = 0 ; i < length_RX/2 ;++i)
297
+ {
298
+ *((uint8_t *)buf_left+i) = *((uint8_t *)buf_RX+2 *i);
299
+ *((uint8_t *)buf_right+i) = *((uint8_t *)buf_RX+2 *i+1 );
300
+ }
301
+ }
302
+ else if (len_per_data == 2 )
270
303
{
271
- buf_left[i] = buf_RX[2 *i];
272
- buf_right[i] = buf_RX[2 *i+1 ];
304
+ for (uint32_t i = 0 ; i < length_RX/2 ;++i)
305
+ {
306
+ *((uint16_t *)buf_left+i) = *((uint16_t *)buf_RX+2 *i);
307
+ *((uint16_t *)buf_right+i) = *((uint16_t *)buf_RX+2 *i+1 );
308
+ }
273
309
}
274
- return I2S_DMA_OK;
310
+ else if (len_per_data == 4 )
311
+ {
312
+ for (uint32_t i = 0 ; i < length_RX/2 ;++i)
313
+ {
314
+ *((uint32_t *)buf_left+i) = *((uint32_t *)buf_RX+2 *i);
315
+ *((uint32_t *)buf_right+i) = *((uint32_t *)buf_RX+2 *i+1 );
316
+ }
317
+ }
318
+ else
319
+ return I2S_DMA_FAIL;
320
+
321
+ return I2S_DMA_OK;
275
322
}
0 commit comments