Skip to content

Jira566: I2S DMA implement: supplement library and example #240

New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Closed
wants to merge 1 commit into from
Closed
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
Original file line number Diff line number Diff line change
Expand Up @@ -25,7 +25,7 @@ uint32_t dataBuff[BUFF_SIZE+OFFSET]; // extra 2 buffer is for the padding zero
uint8_t start_flag = 0;
uint8_t done_flag = 0;
uint32_t loop_count = 0;

uint32_t shift_count = 0;
void setup()
{
Serial.begin(115200);
Expand All @@ -46,32 +46,45 @@ void setup()

void loop()
{
int status = CurieI2SDMA.transRX(dataBuff,sizeof(dataBuff));
int status = CurieI2SDMA.transRX(dataBuff,sizeof(dataBuff),sizeof(uint32_t));
if(status)
return;

// find out first non-zero
shift_count = 0;
for(uint32_t i = 0;i <= OFFSET;++i)
{
if(dataBuff[i] == 0)
shift_count++;
else
break;
}
if(shift_count > OFFSET)
return;

if(start_flag)
{
if((dataBuff[OFFSET]>>16) != loop_count+1)
if((dataBuff[shift_count]>>16) != loop_count+1)
Serial.println("+++ loop_count jump +++");
}
else
{
start_flag = 1;
}
loop_count = (dataBuff[OFFSET] >> 16);

loop_count = (dataBuff[shift_count] >> 16);

// check data
done_flag = 1;
for(uint32_t i = 0 ;i < BUFF_SIZE;++i)
{
//Serial.println(dataBuff[i+OFFSET],HEX);
if ((dataBuff[i+OFFSET] & 0XFFFF0000) == (loop_count <<16)
&& (dataBuff[i+OFFSET] & 0XFFFF) == (i+1))
//Serial.println(dataBuff[i+shift_count],HEX);
if ((dataBuff[i+shift_count] & 0XFFFF0000) == (loop_count <<16)
&& (dataBuff[i+shift_count] & 0XFFFF) == (i+1))
;
else
{
done_flag = 0;
Serial.println(dataBuff[i+OFFSET],HEX);
Serial.println(dataBuff[i+shift_count],HEX);
Serial.println("ERROR");
break;
}
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -38,7 +38,7 @@ void loop()
dataBuff[i] = i + 1 + (loop_count<<16);
}
loop_count++;
int status = CurieI2SDMA.transTX(dataBuff,sizeof(dataBuff));
int status = CurieI2SDMA.transTX(dataBuff,sizeof(dataBuff),sizeof(uint32_t));
if(status)
return;

Expand Down
93 changes: 70 additions & 23 deletions libraries/CurieI2S/src/CurieI2SDMA.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -36,10 +36,11 @@ volatile uint8_t txerror_flag = 0;

volatile uint8_t rxdone_flag = 0;
volatile uint8_t rxerror_flag = 0;

uint8_t frameDelay = 0;

static void txi2s_done(void* x)
{
CurieI2SDMA.lastFrameDelay();
txdone_flag = 1;

return;
Expand Down Expand Up @@ -76,6 +77,11 @@ Curie_I2SDMA::Curie_I2SDMA()
{
}

void Curie_I2SDMA::lastFrameDelay()
{
delay(frameDelay);
}

int Curie_I2SDMA::iniTX()
{
muxTX(1);
Expand Down Expand Up @@ -154,8 +160,8 @@ int Curie_I2SDMA::beginTX(uint16_t sample_rate,uint8_t resolution,uint8_t master
txcfg.cb_err = txi2s_err;
txdone_flag = 0;
txerror_flag = 0;
frameDelay = 5;
soc_i2s_config(I2S_CHANNEL_TX, &txcfg);

return I2S_DMA_OK;
}

Expand Down Expand Up @@ -195,10 +201,11 @@ int Curie_I2SDMA::beginRX(uint16_t sample_rate,uint8_t resolution,uint8_t master
return I2S_DMA_OK;
}

int Curie_I2SDMA::transTX(uint32_t* buf_TX,uint32_t len)
int Curie_I2SDMA::transTX(void* buf_TX,uint32_t len,uint32_t len_per_data)
{
soc_i2s_stream(buf_TX, len,0);

int status = soc_i2s_stream(buf_TX, len,len_per_data,0);
if(status)
return I2S_DMA_FAIL;
while (1)
{
// check the DMA and I2S status
Expand All @@ -215,9 +222,11 @@ int Curie_I2SDMA::transTX(uint32_t* buf_TX,uint32_t len)
}
}

int Curie_I2SDMA::transRX(uint32_t* buf_RX,uint32_t len)
int Curie_I2SDMA::transRX(void* buf_RX,uint32_t len,uint32_t len_per_data)
{
soc_i2s_listen(buf_RX, len ,0);
int status = soc_i2s_listen(buf_RX, len ,len_per_data,0);
if(status)
return I2S_DMA_FAIL;

while (1)
{
Expand Down Expand Up @@ -248,28 +257,66 @@ void Curie_I2SDMA::stopRX()
muxRX(0);
}

int Curie_I2SDMA::mergeData(uint32_t* buf_left,uint32_t* buf_right,uint32_t* buf_TX)
int Curie_I2SDMA::mergeData(void* buf_left,void* buf_right,void* buf_TX,uint32_t length_TX,uint32_t len_per_data)
{
int length = (int)(sizeof(buf_left) / sizeof(buf_left[0]));
for(int i = 0; i < length;++i)
if(len_per_data == 1)
{
buf_TX[2*i] = buf_left[i];
buf_TX[2*i+1] = buf_right[i];
for(uint32_t i = 0; i < length_TX/2;++i)
{
*((uint8_t *)buf_TX+2*i) = *((uint8_t *)buf_left+i);
*((uint8_t *)buf_TX+2*i+1) = *((uint8_t *)buf_right+i);
}
}
else if(len_per_data == 2)
{
for(uint32_t i = 0; i < length_TX/2;++i)
{
*((uint16_t *)buf_TX+2*i) = *((uint16_t *)buf_left+i);
*((uint16_t *)buf_TX+2*i+1) = *((uint16_t *)buf_right+i);
}
}
else if(len_per_data == 4)
{
for(uint32_t i = 0; i < length_TX/2;++i)
{
*((uint32_t *)buf_TX+2*i) = *((uint32_t *)buf_left+i);
*((uint32_t *)buf_TX+2*i+1) = *((uint32_t *)buf_right+i);
}
}
else
return I2S_DMA_FAIL;

return I2S_DMA_OK;
return I2S_DMA_OK;
}

int Curie_I2SDMA::separateData(uint32_t* buf_left,uint32_t* buf_right,uint32_t* buf_RX)
{
int length1 = (int)( sizeof(buf_RX) / sizeof(buf_RX[0])/2 );
int length2 = (int)( sizeof(buf_left) / sizeof(buf_left[0]) );
int length = length1 < length2 ? length1 : length2;

for(int i = 0; i < length;++i)
int Curie_I2SDMA::separateData(void* buf_left,void* buf_right,void* buf_RX,uint32_t length_RX,uint32_t len_per_data)
{
if(len_per_data == 1)
{
for(uint32_t i = 0; i < length_RX/2;++i)
{
*((uint8_t *)buf_left+i) = *((uint8_t *)buf_RX+2*i);
*((uint8_t *)buf_right+i) = *((uint8_t *)buf_RX+2*i+1);
}
}
else if(len_per_data == 2)
{
buf_left[i] = buf_RX[2*i];
buf_right[i] = buf_RX[2*i+1];
for(uint32_t i = 0; i < length_RX/2;++i)
{
*((uint16_t *)buf_left+i) = *((uint16_t *)buf_RX+2*i);
*((uint16_t *)buf_right+i) = *((uint16_t *)buf_RX+2*i+1);
}
}
return I2S_DMA_OK;
else if(len_per_data == 4)
{
for(uint32_t i = 0; i < length_RX/2;++i)
{
*((uint32_t *)buf_left+i) = *((uint32_t *)buf_RX+2*i);
*((uint32_t *)buf_right+i) = *((uint32_t *)buf_RX+2*i+1);
}
}
else
return I2S_DMA_FAIL;

return I2S_DMA_OK;
}
10 changes: 6 additions & 4 deletions libraries/CurieI2S/src/CurieI2SDMA.h
Original file line number Diff line number Diff line change
Expand Up @@ -47,6 +47,8 @@ class Curie_I2SDMA
public:
Curie_I2SDMA();

void lastFrameDelay();

//
int beginTX(uint16_t sample_rate,uint8_t resolution,uint8_t master,uint8_t mode);
//
Expand All @@ -58,16 +60,16 @@ class Curie_I2SDMA
int iniRX();

// starts transmission of data to the tx channel
int transTX(uint32_t* buf_TX,uint32_t len);
int transTX(void* buf_TX,uint32_t len,uint32_t len_per_data);

// starts listening to the rx channel
int transRX(uint32_t* buf_RX,uint32_t len);
int transRX(void* buf_RX,uint32_t len,uint32_t len_per_data);

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

// seperate the data to left and right channl
int separateData(uint32_t* buf_left,uint32_t* buf_right,uint32_t* buf_RX);
int separateData(void* buf_left,void* buf_right,void* buf_RX,uint32_t length_RX,uint32_t len_per_data);

//
void stopTX();
Expand Down
Loading