@@ -36,10 +36,11 @@ volatile uint8_t txerror_flag = 0;
3636
3737volatile uint8_t rxdone_flag = 0 ;
3838volatile uint8_t rxerror_flag = 0 ;
39-
39+ uint8_t frameDelay = 0 ;
4040
4141static void txi2s_done (void * x)
4242{
43+ CurieI2SDMA.lastFrameDelay ();
4344 txdone_flag = 1 ;
4445
4546 return ;
@@ -76,6 +77,11 @@ Curie_I2SDMA::Curie_I2SDMA()
7677{
7778}
7879
80+ void Curie_I2SDMA::lastFrameDelay ()
81+ {
82+ delay (frameDelay);
83+ }
84+
7985int Curie_I2SDMA::iniTX ()
8086{
8187 muxTX (1 );
@@ -154,8 +160,8 @@ int Curie_I2SDMA::beginTX(uint16_t sample_rate,uint8_t resolution,uint8_t master
154160 txcfg.cb_err = txi2s_err;
155161 txdone_flag = 0 ;
156162 txerror_flag = 0 ;
163+ frameDelay = 5 ;
157164 soc_i2s_config (I2S_CHANNEL_TX, &txcfg);
158-
159165 return I2S_DMA_OK;
160166}
161167
@@ -195,10 +201,11 @@ int Curie_I2SDMA::beginRX(uint16_t sample_rate,uint8_t resolution,uint8_t master
195201 return I2S_DMA_OK;
196202}
197203
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 )
199205{
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;
202209 while (1 )
203210 {
204211 // check the DMA and I2S status
@@ -215,9 +222,11 @@ int Curie_I2SDMA::transTX(uint32_t* buf_TX,uint32_t len)
215222 }
216223}
217224
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 )
219226{
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;
221230
222231 while (1 )
223232 {
@@ -248,28 +257,66 @@ void Curie_I2SDMA::stopRX()
248257 muxRX (0 );
249258}
250259
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 )
252261{
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 )
255263 {
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+ }
258269 }
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;
259288
260- return I2S_DMA_OK;
289+ return I2S_DMA_OK;
261290}
262291
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 )
270303 {
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+ }
273309 }
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;
275322}
0 commit comments