Skip to content

Commit b8162e9

Browse files
Christa03sys_maker
authored and
sys_maker
committed
Jira566: I2S DMA implement: supplement library and example
1 parent c59e280 commit b8162e9

File tree

6 files changed

+155
-95
lines changed

6 files changed

+155
-95
lines changed

libraries/CurieI2S/examples/I2SDMA_RXCallBack/I2SDMA_RXCallBack.ino

Lines changed: 22 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -25,7 +25,7 @@ uint32_t dataBuff[BUFF_SIZE+OFFSET]; // extra 2 buffer is for the padding zero
2525
uint8_t start_flag = 0;
2626
uint8_t done_flag = 0;
2727
uint32_t loop_count = 0;
28-
28+
uint32_t shift_count = 0;
2929
void setup()
3030
{
3131
Serial.begin(115200);
@@ -46,32 +46,45 @@ void setup()
4646

4747
void loop()
4848
{
49-
int status = CurieI2SDMA.transRX(dataBuff,sizeof(dataBuff));
49+
int status = CurieI2SDMA.transRX(dataBuff,sizeof(dataBuff),sizeof(uint32_t));
5050
if(status)
5151
return;
5252

53+
// find out first non-zero
54+
shift_count = 0;
55+
for(uint32_t i = 0;i <= OFFSET;++i)
56+
{
57+
if(dataBuff[i] == 0)
58+
shift_count++;
59+
else
60+
break;
61+
}
62+
if(shift_count > OFFSET)
63+
return;
64+
5365
if(start_flag)
5466
{
55-
if((dataBuff[OFFSET]>>16) != loop_count+1)
67+
if((dataBuff[shift_count]>>16) != loop_count+1)
5668
Serial.println("+++ loop_count jump +++");
5769
}
5870
else
5971
{
6072
start_flag = 1;
6173
}
62-
loop_count = (dataBuff[OFFSET] >> 16);
63-
74+
loop_count = (dataBuff[shift_count] >> 16);
75+
76+
// check data
6477
done_flag = 1;
6578
for(uint32_t i = 0 ;i < BUFF_SIZE;++i)
6679
{
67-
//Serial.println(dataBuff[i+OFFSET],HEX);
68-
if ((dataBuff[i+OFFSET] & 0XFFFF0000) == (loop_count <<16)
69-
&& (dataBuff[i+OFFSET] & 0XFFFF) == (i+1))
80+
//Serial.println(dataBuff[i+shift_count],HEX);
81+
if ((dataBuff[i+shift_count] & 0XFFFF0000) == (loop_count <<16)
82+
&& (dataBuff[i+shift_count] & 0XFFFF) == (i+1))
7083
;
7184
else
7285
{
7386
done_flag = 0;
74-
Serial.println(dataBuff[i+OFFSET],HEX);
87+
Serial.println(dataBuff[i+shift_count],HEX);
7588
Serial.println("ERROR");
7689
break;
7790
}

libraries/CurieI2S/examples/I2SDMA_TXCallBack/I2SDMA_TXCallBack.ino

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -38,7 +38,7 @@ void loop()
3838
dataBuff[i] = i + 1 + (loop_count<<16);
3939
}
4040
loop_count++;
41-
int status = CurieI2SDMA.transTX(dataBuff,sizeof(dataBuff));
41+
int status = CurieI2SDMA.transTX(dataBuff,sizeof(dataBuff),sizeof(uint32_t));
4242
if(status)
4343
return;
4444

libraries/CurieI2S/src/CurieI2SDMA.cpp

Lines changed: 70 additions & 23 deletions
Original file line numberDiff line numberDiff line change
@@ -36,10 +36,11 @@ volatile uint8_t txerror_flag = 0;
3636

3737
volatile uint8_t rxdone_flag = 0;
3838
volatile uint8_t rxerror_flag = 0;
39-
39+
uint8_t frameDelay = 0;
4040

4141
static 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+
7985
int 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
}

libraries/CurieI2S/src/CurieI2SDMA.h

Lines changed: 6 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -47,6 +47,8 @@ class Curie_I2SDMA
4747
public:
4848
Curie_I2SDMA();
4949

50+
void lastFrameDelay();
51+
5052
//
5153
int beginTX(uint16_t sample_rate,uint8_t resolution,uint8_t master,uint8_t mode);
5254
//
@@ -58,16 +60,16 @@ class Curie_I2SDMA
5860
int iniRX();
5961

6062
// starts transmission of data to the tx channel
61-
int transTX(uint32_t* buf_TX,uint32_t len);
63+
int transTX(void* buf_TX,uint32_t len,uint32_t len_per_data);
6264

6365
// starts listening to the rx channel
64-
int transRX(uint32_t* buf_RX,uint32_t len);
66+
int transRX(void* buf_RX,uint32_t len,uint32_t len_per_data);
6567

6668
// merge data of left and right channel into one buffer
67-
int mergeData(uint32_t* buf_left,uint32_t* buf_right,uint32_t* buf_TX);
69+
int mergeData(void* buf_left,void* buf_right,void* buf_TX,uint32_t length_TX,uint32_t len_per_data);
6870

6971
// seperate the data to left and right channl
70-
int separateData(uint32_t* buf_left,uint32_t* buf_right,uint32_t* buf_RX);
72+
int separateData(void* buf_left,void* buf_right,void* buf_RX,uint32_t length_RX,uint32_t len_per_data);
7173

7274
//
7375
void stopTX();

0 commit comments

Comments
 (0)