AnsweredAssumed Answered

Glitches with SAI/SPDIF. Different behaviour on L/R channels

Question asked by fourneron.jean_marc on Nov 20, 2016
Latest reply on Nov 22, 2016 by waclawek.jan
Dear all,

I have a issue with SPDIF_TX on a nucleo F746ZG. Working on this since some days and can't identify the problem. I have some hearable "glitches" in an otherway working operation. A frequency sweep signal allows to reproduce those glitches on a regular basis. I recorded the output of the DAC/Amp and you can see in the attachment the visualization of the glitches: 4 ms amplitude "dents" in the signal. The 3 files attached allow to precisely visualize the issue. Please have a look. What is odd is that there is still the expected signal oscillation, but the amplitude is reduced for about 4ms or what looks like of multiple of 4 ms.
The upper part of the dataflow that prepares the data for the SAI has been well tested on a stm32F4 Discovery with I2S and onboard DAC without showing such a behaviour.

I prepare a buffer that is read by DMA (circular mode) to feed the SAI configured for SPDIF protocol. As SPDIF data are fixed in Stm32 to 24 bits for SPDIF, I prepare a buffer of int32 that I fill with int16 shifted by 8 bits (<<8). I alternate Left and Right music samples.

I noticed that I don't have the same result in the 3 below cases:
- 0 for Left channel and music for Right: music and glitches in Right channel, silence on left channel
- music (same data) in Left and Right channels: glitches in Left and right channels,
- strange: - Music for Left channel and 0 for Right: music and NO glitches in Left channel, silence on right channel !!!!

So feeding the SAI with comparable data does not give the same result:  0=>L/Music=>R different from  0=>R/Music=>L

I have tried to play with:
- length of the buffer: no effect,
- amplitude of the signal: no effect,
- frequency: the pure frequency signals that I tried doesn't seems to exhibit the glitches...
- and the signal that continues to oscillate during the glitch, with a suddenly wrong amplitude.

Problem of DMA configuration?
Problem of SAI configuration?

Note: I have to set the hsai_BlockB1.Init.AudioFrequency= SAI_AUDIO_FREQUENCY_96K to efectively have 48k recognized by my DAC. With this setting, I can play music at the right pace. 

DMA is set to work with WORDS (I believe) as: 
hdma_sai1_a.Instance = DMA2_Stream1;
hdma_sai1_a.Init.Channel = DMA_CHANNEL_0;
hdma_sai1_a.Init.Direction = DMA_MEMORY_TO_PERIPH;
hdma_sai1_a.Init.PeriphInc = DMA_PINC_DISABLE; hdma_sai1_a.Init.MemInc = DMA_MINC_ENABLE;
hdma_sai1_a.Init.PeriphDataAlignment = DMA_PDATAALIGN_WORD;
hdma_sai1_a.Init.MemDataAlignment = DMA_MDATAALIGN_WORD;
hdma_sai1_a.Init.Mode = DMA_CIRCULAR;
hdma_sai1_a.Init.Priority = DMA_PRIORITY_HIGH;
hdma_sai1_a.Init.FIFOMode = DMA_FIFOMODE_ENABLE;
hdma_sai1_a.Init.FIFOThreshold = DMA_FIFO_THRESHOLD_FULL;
hdma_sai1_a.Init.MemBurst = DMA_MBURST_SINGLE;
hdma_sai1_a.Init.PeriphBurst = DMA_PBURST_SINGLE;

SAI is configured as:
hsai_BlockB1.Instance= SAI1_Block_B;
hsai_BlockB1.Init.Protocol= SAI_SPDIF_PROTOCOL;
hsai_BlockB1.Init.AudioMode= SAI_MODEMASTER_TX;
hsai_BlockB1.Init.Synchro= SAI_ASYNCHRONOUS;
hsai_BlockB1.Init.OutputDrive= SAI_OUTPUTDRIVE_DISABLE;
hsai_BlockB1.Init.AudioFrequency= SAI_AUDIO_FREQUENCY_96K;
hsai_BlockB1.Init.SynchroExt= SAI_SYNCEXT_DISABLE;
hsai_BlockB1.Init.MonoStereoMode= SAI_STEREOMODE;
hsai_BlockB1.Init.CompandingMode= SAI_NOCOMPANDING;

Start of the SAI is done with:
HAL_SAI_Transmit_DMA(&hsai_BlockA1, (uint8_t*)Audio_output_bufferA, AUDIO_OUTPUT_BUF_SIZE*2);