cancel
Showing results for 
Search instead for 
Did you mean: 

STM32MP157F Fast ADC reading artifacts in triggered buffer mode

jromanki
Associate
Spoiler
 

Hello,

I am trying to configure an ADC channel using IIO library to work in triggered buffer with high frequency (preferably more than 100kHz). I configured ADC and timers as described here (including trigger configuration in kernel device tree) and tested the its performance:

https://wiki.st.com/stm32mpu/wiki/How_to_use_the_IIO_user_space_interface

 

Testing Method

I tested the configuration by measuring 100Hz sinusoidal signal made with a function generator at different sampling frequencies. The sampling frequency value was set to 10000Hz in iio user space as displayed in iio_info (important later):

attr 0: sampling_frequency value: 10000

The signal was measured with the iio_readdev | hexdump command and ploted on a graph 

100Hz-10kHz-100s.png

Blue is 100Hz, 1Vpp amplitude, 1V DC offset sine (ignore orange).

The sine looks good and it takes 10kHz/100Hz=100 samples to display a full sine period, so everything works correctly.

 

The Problem

The sampling rate was then set to 100kHz (which should be achievable) and the same 100Hz signal was measured. While setting the frequency, a weird iio_info output was observed (set frequency 100037 instead of 100000):

attr 0: sampling_frequency value: 100037

While measuring and plotting with with the iio_readdev | hexdump the iio library returned this message:

WARNING: High-speed mode not enabled

100Hz-100kHz-1000s-artefakty.png

Blue is 100Hz, 1Vpp amplitude, 1V DC offset sine (ignore orange).

In the correct signal, one sine period should take 100Khz/100Hz=1000 samples. Here, it takes around 500 so it's around 50kHz. The other problem of my approach is the visible sample skipping artifacts (for example around 800th sample).

 

Questions

My question is how can i solve this issue? I imagine this low sample rate limit is caused by some performance bottleneck somewhere in the reading of my buffer. Is it because the iio driver isnt actually using dma to transfer samples like explained here?

https://ez.analog.com/linux-software-drivers/f/q-a/561766/warning-high-speed-mode-not-enabled

Could someone please hint me how can I enable high speed mode or increase the drivers performance? I tried to upgrade my IIO driver from 0.15 > 0.21 the issue with sample skipping was less present but the frequency limit was still there. I also tried to use the library with python wrapper with no effect. Maybe i need to upgrade of my OpenSTLinux kernel or the dma has to be configured differently in the devicetree? Thanks in advance.

 

Technical details

Board: Octavo Systems OSD32MP157F

100kHz iio_info:

Library version: 0.15 (git tag: 6ecff5d)
Compiled with backends: local xml ip usb
IIO context created with local backend.
Backend version: 0.15 (git tag: 6ecff5d)
Backend description string: Linux osd32mp1-brk 5.10.10 #1 SMP PREEMPT Sat Jan 23 15:04:06 UTC 2021 armv7l
IIO context has 1 attributes:
local,kernel: 5.10.10
IIO context has 9 devices:
trigger5: tim1_ch4
0 channels found:
iio:device1: 48003000.adc:adc@0 (buffer capable)
1 channels found:
voltage0: (input, index: 0, format: le:U16/16>>0)
3 channel-specific attributes found:
attr 0: raw ERROR: Device or resource busy (-16)
attr 1: offset value: 0
attr 2: scale value: 0.044250488
2 device-specific attributes found:
attr 0: trigger_polarity value: rising-edge
attr 1: trigger_polarity_available value: rising-edge falling-edge both-edges
2 buffer-specific attributes found:
attr 0: watermark value: 1
attr 1: data_available value: 0
1 debug attributes found:
debug attr 0: direct_reg_access value: 0x1000
Current trigger: trigger1(tim1_trgo2)
trigger3: tim1_ch2
0 channels found:
trigger1: tim1_trgo2
0 channels found:
3 device-specific attributes found:
attr 0: sampling_frequency value: 100037
attr 1: master_mode value: reset
attr 2: master_mode_available value: reset enable update compare_pulse OC1REF OC2REF OC3REF OC4REF OC5REF OC6REF compare_pulse_OC4REF compare_pulse_OC6REF compare_pulse_OC4REF_r_or_OC6REF_r compare_pulse_OC4REF_r_or_OC6REF_f compare_pulse_OC5REF_r_or_OC6REF_r compare_pulse_OC5REF_r_or_OC6REF_f
iio:device2: 48003000.adc:adc@100 (buffer capable)
1 channels found:
voltage1: (input, index: 0, format: le:U16/16>>0)
3 channel-specific attributes found:
attr 0: raw ERROR: Device or resource busy (-16)
attr 1: offset value: 0
attr 2: scale value: 0.044250488
2 device-specific attributes found:
attr 0: trigger_polarity value: rising-edge
attr 1: trigger_polarity_available value: rising-edge falling-edge both-edges
2 buffer-specific attributes found:
attr 0: watermark value: 1
attr 1: data_available value: 0
1 debug attributes found:
debug attr 0: direct_reg_access value: 0x1000
Current trigger: trigger1(tim1_trgo2)
trigger4: tim1_ch3
0 channels found:
iio:device0: 44000000.timer:timer@0
1 channels found:
count0: (input)
8 channel-specific attributes found:
attr 0: enable_mode value: always
attr 1: preset value: 2087
attr 2: trigger_mode ERROR: Invalid argument (-22)
attr 3: en value: 1
attr 4: raw value: 11
attr 5: scale value: 1.000000000
attr 6: trigger_mode_available value: trigger
attr 7: enable_mode_available value: always gated triggered
trigger2: tim1_ch1
0 channels found:
trigger0: tim1_trgo
0 channels found:
3 device-specific attributes found:
attr 0: sampling_frequency value: 100037
attr 1: master_mode value: update
attr 2: master_mode_available value: reset enable update compare_pulse OC1REF OC2REF OC3REF OC4REF

 

I also attached my device tree

1 REPLY 1
Olivier GALLIEN
ST Employee

Hi @jromanki 

 

Since you are using Octavo Systems OSD32MP157F did you already try to contact Octavo support ? 

 

Thanks

 

Olivier 

Olivier GALLIEN
In order to give better visibility on the answered topics, please click on 'Accept as Solution' on the reply which solved your issue or answered your question.