Add LRCLK High width issue in TDM
Posted: Fri Jul 27, 2018 11:01 am
Dear all,
In order to drive external DAC board, which required TDM16 (16 channels) LRCLK HIGH WIDTH more than one BCLK,
I'd tried to add LRCLK High width, change the following yellow code from 0x80000000 to 0xF0000000 (can add 3 BCLKs width) in audio.xc
but we can't loopback audio data from audio in 1 port to audio out 1 port on demo board(XCORE-200 MC AUDIO), ( if setting to p_lrclk <: 0x80000000; it can loopback).
if set to 0x80000000, please check work_well.png
set 0 0xf0000000 ,plese review work_wrong.png
would you please give us some suggestions about it?
what shall i do if want to meet this project requiremet?
Thanks!
#if (I2S_CHANS_ADC != 0)
index = 0;
/* Channels 0, 2, 4.. on each line */
#pragma loop unroll
for(int i = 0; i < I2S_CHANS_ADC; i += I2S_CHANS_PER_FRAME)
{
/* Manual IN instruction since compiler generates an extra setc per IN (bug #15256) */
unsigned sample;
asm volatile("in %0, res[%1]" : "=r"(sample) : "r"(p_i2s_adc[index++]));
if(buffIndex)
samplesIn_1[((frameCount-1)&(I2S_CHANS_PER_FRAME-1))+i] = bitrev(sample); // channels 1, 3, 5.. on each line.
else
samplesIn_0[((frameCount-1)&(I2S_CHANS_PER_FRAME-1))+i] = bitrev(sample); // channels 1, 3, 5.. on each line.
}
#ifdef SU1_ADC_ENABLE
{
unsigned x;
x = inuint(c_adc);
inct(c_adc);
asm volatile("stw %0, dp[g_adcVal]"::"r"(x));
}
#endif
#endif
#ifndef CODEC_MASTER
#ifdef I2S_MODE_TDM
if(frameCount == (I2S_CHANS_PER_FRAME-2))
// p_lrclk <: 0x80000000;
p_lrclk <: 0xc0000000;
else
p_lrclk <: 0x00000000;
#else
p_lrclk <: 0x7FFFFFFF;
#endif
#endif
index = 0;
#pragma xta endpoint "i2s_output_r"
#if (I2S_CHANS_DAC != 0) && (NUM_USB_CHAN_OUT != 0)
/* Output "odd" channel to DAC (i.e. right) */
#pragma loop unroll
for(int i = 1; i < I2S_CHANS_DAC; i+=I2S_CHANS_PER_FRAME)
{
p_i2s_dac[index++] <: bitrev(samplesOut[frameCount + i]);
}
#endif
#ifndef CODEC_MASTER
doI2SClocks(divide);
#endif
In order to drive external DAC board, which required TDM16 (16 channels) LRCLK HIGH WIDTH more than one BCLK,
I'd tried to add LRCLK High width, change the following yellow code from 0x80000000 to 0xF0000000 (can add 3 BCLKs width) in audio.xc
but we can't loopback audio data from audio in 1 port to audio out 1 port on demo board(XCORE-200 MC AUDIO), ( if setting to p_lrclk <: 0x80000000; it can loopback).
if set to 0x80000000, please check work_well.png
set 0 0xf0000000 ,plese review work_wrong.png
would you please give us some suggestions about it?
what shall i do if want to meet this project requiremet?
Thanks!
#if (I2S_CHANS_ADC != 0)
index = 0;
/* Channels 0, 2, 4.. on each line */
#pragma loop unroll
for(int i = 0; i < I2S_CHANS_ADC; i += I2S_CHANS_PER_FRAME)
{
/* Manual IN instruction since compiler generates an extra setc per IN (bug #15256) */
unsigned sample;
asm volatile("in %0, res[%1]" : "=r"(sample) : "r"(p_i2s_adc[index++]));
if(buffIndex)
samplesIn_1[((frameCount-1)&(I2S_CHANS_PER_FRAME-1))+i] = bitrev(sample); // channels 1, 3, 5.. on each line.
else
samplesIn_0[((frameCount-1)&(I2S_CHANS_PER_FRAME-1))+i] = bitrev(sample); // channels 1, 3, 5.. on each line.
}
#ifdef SU1_ADC_ENABLE
{
unsigned x;
x = inuint(c_adc);
inct(c_adc);
asm volatile("stw %0, dp[g_adcVal]"::"r"(x));
}
#endif
#endif
#ifndef CODEC_MASTER
#ifdef I2S_MODE_TDM
if(frameCount == (I2S_CHANS_PER_FRAME-2))
// p_lrclk <: 0x80000000;
p_lrclk <: 0xc0000000;
else
p_lrclk <: 0x00000000;
#else
p_lrclk <: 0x7FFFFFFF;
#endif
#endif
index = 0;
#pragma xta endpoint "i2s_output_r"
#if (I2S_CHANS_DAC != 0) && (NUM_USB_CHAN_OUT != 0)
/* Output "odd" channel to DAC (i.e. right) */
#pragma loop unroll
for(int i = 1; i < I2S_CHANS_DAC; i+=I2S_CHANS_PER_FRAME)
{
p_i2s_dac[index++] <: bitrev(samplesOut[frameCount + i]);
}
#endif
#ifndef CODEC_MASTER
doI2SClocks(divide);
#endif