2017-02-06 02:24 PM
Hello,
I collect the ADC data through the I2S1 peripheral using DMA2
Once
1) i collected certain amount of results,
2) the reception is paused with:
HAL_I2S_DMAPause(&hi2s1);
3) I send the data through UART
4) then the reception is resumed with:
HAL_I2S_DMAResume(&hi2s1);
then this mechanism can be started again from point 1).
What i observed is that somehow (not always, but ~8/10 times) the L and R channels have been swapped. I attached a figure of the results.
(I inferred on the swapping based on that the ADC sends ch1 and ch2 results one after another, and the voltage on ch1 is approximately 10 times bigger then on ch2)
Is there anyone who could give me a tip what is the problem?
Thank you very much in advance.
Best regards.
#stm32-i2s-dma #programming-i2s #i2s-dma #stm32-i2s #i2s-channel-side-issue #i2s2017-02-06 03:42 PM
I don't know what is your target mcu, but I looked into the F4 Cube's HAL_I2S_DMAResume() and it's barely more than simply setting the DMA-enable flags in I2S. There's no LR-sync mechanism in that; as the Rx flag is surely already set, DMA will immediately transfer whatever it finds in the data register, and then all subsequent data.
Generally, it's a bad idea to try to pause I2S. Stop it completely if you must, and then restart. Or, better, devise a scheme which does not require to stop I2S to be able to pick some of the data and transmit through USART (e.g. using double-buffer DMA, and redirecting the buffers to another buffer-pair).
JW
2017-02-07 05:16 AM
Thank you for your response.
But. Does the HAL_I2S_Receive_DMA function have the LR-sync mechanis??. I mean.
First) i setup the MCO and PLL
Second) i setup the I2S with HAL_I2S_Init which produces stable LR clock
Third) i initialize the ADC
Fourth) i have other peripherals to be set up, and also some calculations and just then in the
Fifth step) i call the HAL_I2S_Receive_DMA function.
Will the
HAL_I2S_Receive_DMA sync the DMA with L/R clock? e.g. following the aforementioned step will the array (that the dma fills) be well ordered (ch1-ch2-ch1-ch2-ch1-ch2....) or could the swapping happen?
Thanks a lot in advance.
2017-02-07 05:54 AM
I don't Cube and I won't investigate it, sorry. You can look it up yourselves, the sources are open.
Note, that particular device and whether it's used as slave or master may make difference in determining what's the proper method of synchronization, see e.g. STM32F40x errata rev.8, erratum 2.6.1.
JW
2017-02-07 06:20 AM
Hi,
Just a thought about your problem. Here I don't think it is swapped, but rather be stopped in the middle of a pair, and then started from that point again, i.e. ch1:ch2-ch1:ch2-ch1:DMA_PAUSE-do your stuff-DMA_RESTART-ch2-ch1:ch2-ch1 and so on. I believe that was what Jan was explaining.
so maybe you lose 1 sample in the process and this is why it appears swapped.
2017-02-07 06:23 AM
Hello,
Yes! Now i realized that i did not use the right title for the description of the problem, but indeed that is the situation.