AnsweredAssumed Answered

I2S3 48KHz16bit Extended data format issue

Question asked by Rajesh Gali on Nov 22, 2017
Latest reply on Nov 22, 2017 by waclawek.jan

I am trying to configure I2S3 in Fullduplex Master RX mode, 48KHz sample rate. Hal Configuration is as shown below

hAudioFDI2s.Init.AudioFreq = AudioFreq;
hAudioFDI2s.Init.ClockSource = I2S_CLOCK_PLL;
hAudioFDI2s.Init.CPOL = I2S_CPOL_LOW;
hAudioFDI2s.Init.DataFormat = I2S_DATAFORMAT_16B;
hAudioFDI2s.Init.MCLKOutput = I2S_MCLKOUTPUT_DISABLE;
hAudioFDI2s.Init.Mode = I2S_MODE_MASTER_RX;
hAudioFDI2s.Init.Standard = I2S_STANDARD;
hAudioFDI2s.Init.FullDuplexMode = I2S_FULLDUPLEXMODE_ENABLE;

 

I2S PLLs are configured successfully for 48KHz sample rate, I confirmed it by probing the WS and BCLK pins 

WS: 48KHz

Bit Clock: 3.072Mhz ( 48 * 16bit * 2ch*)*2 (for extended mode) = 3.072KHz, and I have connected this to an external codec configured to receive I2S signals from ST. 

 

However, the problem I am facing is I get distorted audio in only left channel. And above setup works well with the 16KHz no distortion in both channels. I confirmed the same behavior with different codec too. So, I don't think this is a misconfiguration in codec. 

 

I am using DMA to transmit data over I2S 

 

hdma_i2sRx.Init.Channel DMA_CHANNEL_0;
hdma_i2sRx.Init.Direction = DMA_PERIPH_TO_MEMORY;
hdma_i2sRx.Init.PeriphInc = DMA_PINC_DISABLE;
hdma_i2sRx.Init.MemInc = DMA_MINC_ENABLE;
hdma_i2sRx.Init.PeriphDataAlignment DMA_PDATAALIGN_HALFWORD;
hdma_i2sRx.Init.MemDataAlignment = DMA_MDATAALIGN_HALFWORD;
hdma_i2sRx.Init.Mode = DMA_NORMAL;
hdma_i2sRx.Init.Priority = DMA_PRIORITY_HIGH;
hdma_i2sRx.Init.FIFOMode = DMA_FIFOMODE_ENABLE;
hdma_i2sRx.Init.FIFOThreshold = DMA_FIFO_THRESHOLD_FULL;
hdma_i2sRx.Init.MemBurst = DMA_MBURST_SINGLE;
hdma_i2sRx.Init.PeriphBurst = DMA_PBURST_SINGLE;

hdma_i2sRx.Instance = DMA1_Stream0
Tx configuration:
hdma_i2s_ext_tx.Init.Channel = DMA_CHANNEL_2;
hdma_i2s_ext_tx.Init.Direction = DMA_MEMORY_TO_PERIPH;
hdma_i2s_ext_tx.Init.PeriphInc = DMA_PINC_DISABLE;
hdma_i2s_ext_tx.Init.MemInc = DMA_MINC_ENABLE;
hdma_i2s_ext_tx.Init.PeriphDataAlignment DMA_PDATAALIGN_HALFWORD;
hdma_i2s_ext_tx.Init.MemDataAlignment = DMA_MDATAALIGN_HALFWORD;
hdma_i2s_ext_tx.Init.Mode = DMA_NORMAL;
hdma_i2s_ext_tx.Init.Priority = DMA_PRIORITY_HIGH;
hdma_i2s_ext_tx.Init.FIFOMode = DMA_FIFOMODE_ENABLE;
hdma_i2s_ext_tx.Init.FIFOThreshold = DMA_FIFO_THRESHOLD_FULL;
hdma_i2s_ext_tx.Init.MemBurst = DMA_MBURST_SINGLE;
hdma_i2s_ext_tx.Init.PeriphBurst = DMA_PBURST_SINGLE;

hdma_i2s_ext_tx.Instance DMA1_Stream5;

 

I was wondering is there any known issues with the I2S3 in extended mode? or Am I configuring it wrongly?

 

 

Thank you,

Raj

Outcomes