Post Go back to editing

Error -22 writing to channel "sampling_frequency" value may not be supported.

Hello,

I have used two examples https://github.com/analogdevicesinc/libad9361-iio/blob/master/ad9361_baseband_auto_rate.c and https://github.com/analogdevicesinc/libiio/blob/master/examples/ad9361-iiostream.c to load custom FIR and get samples with lowest sampling rate. My FIR config with taps from Matlab ADI Wizard is:

RX 3 GAIN -12 DEC 4 TX 3 GAIN -12 INT 4 RRX 800000000 25000000 8333333 4166666 2083333 520833 RTX 800000000 25000000 8333333 4166666 2083333 520833 BWRX 433256 BWTX 433256 114,114 -98,-98 157,157 -154,-154 -23,-23 -330,-330 -346,-346 -619,-619 -656,-656 -791,-791 -692,-692 -598,-598 -315,-315 -59,-59 257,257 440,440 542,542 443,443 239,239 -85,-85 -378,-378 -605,-605 -637,-637 -491,-491 -156,-156 245,245 625,625 830,830 803,803 502,502 17,17 -538,-538 -971,-971 -1147,-1147 -962,-962 -451,-451 273,273 987,987 1470,1470 1525,1525 1092,1092 241,241 -792,-792 -1704,-1704 -2172,-2172 -1990,-1990 -1118,-1118 250,250 1749,1749 2901,2901 3276,3276 2610,2610 932,932 -1410,-1410 -3790,-3790 -5440,-5440 -5628,-5628 -3869,-3869 -64,-64 5417,5417 11790,11790 17991,17991 22911,22911 25630,25630 25630,25630 22911,22911 17991,17991 11790,11790 5417,5417 -64,-64 -3869,-3869 -5628,-5628 -5440,-5440 -3790,-3790 -1410,-1410 932,932 2610,2610 3276,3276 2901,2901 1749,1749 250,250 -1118,-1118 -1990,-1990 -2172,-2172 -1704,-1704 -792,-792 241,241 1092,1092 1525,1525 1470,1470 987,987 273,273 -451,-451 -962,-962 -1147,-1147 -971,-971 -538,-538 17,17 502,502 803,803 830,830 625,625 245,245 -156,-156 -491,-491 -637,-637 -605,-605 -378,-378 -85,-85 239,239 443,443 542,542 440,440 257,257 -59,-59 -315,-315 -598,-598 -692,-692 -791,-791 -656,-656 -619,-619 -346,-346 -330,-330 -23,-23 -154,-154 157,157 -98,-98 114,114

The config loads just fine, I can see filter enabled and all settings as expected in:

root@analog:/sys/bus/iio/devices/iio:device2# cat in_voltage_sampling_frequency

520833

BUT: setting channel sampling frequency fails:

ret = iio_channel_attr_write_longlong(chan, "sampling_frequency", rate);

if (ret < 0) { printf("* Can't write sampling frequency: %d.\n", ret); return ret;

}

results in:

* Can't write sampling frequency: -22.

or:

// Configure phy and lo channels printf("* Acquiring AD9361 phy channel %d\n", chid);

if (!get_phy_chan(ctx, type, chid, &chn)) { return false; }

wr_ch_str(chn, "rf_port_select", cfg->rfport);

wr_ch_lli(chn, "rf_bandwidth", cfg->bw_hz);

wr_ch_lli(chn, "sampling_frequency", cfg->fs_hz);

in:

Error -22 writing to channel "sampling_frequency" value may not be supported.

What I am missing ?  Thanks !



Added second code example.
[edited by: MichalM at 11:02 PM (GMT 0) on 9 Mar 2020]
Parents Reply Children
  • RX 3 GAIN -12 DEC 4
    TX 3 GAIN -12 INT 4
    RRX 800000000 25000000 8333333 4166666 2083333 520833
    RTX 800000000 25000000 8333333 4166666 2083333 520833
    BWRX 433256
    BWTX 433256
    114,114
    -98,-98
    157,157
    -154,-154
    -23,-23
    -330,-330
    -346,-346
    -619,-619
    -656,-656
    -791,-791
    -692,-692
    -598,-598
    -315,-315
    -59,-59
    257,257
    440,440
    542,542
    443,443
    239,239
    -85,-85
    -378,-378
    -605,-605
    -637,-637
    -491,-491
    -156,-156
    245,245
    625,625
    830,830
    803,803
    502,502
    17,17
    -538,-538
    -971,-971
    -1147,-1147
    -962,-962
    -451,-451
    273,273
    987,987
    1470,1470
    1525,1525
    1092,1092
    241,241
    -792,-792
    -1704,-1704
    -2172,-2172
    -1990,-1990
    -1118,-1118
    250,250
    1749,1749
    2901,2901
    3276,3276
    2610,2610
    932,932
    -1410,-1410
    -3790,-3790
    -5440,-5440
    -5628,-5628
    -3869,-3869
    -64,-64
    5417,5417
    11790,11790
    17991,17991
    22911,22911
    25630,25630
    25630,25630
    22911,22911
    17991,17991
    11790,11790
    5417,5417
    -64,-64
    -3869,-3869
    -5628,-5628
    -5440,-5440
    -3790,-3790
    -1410,-1410
    932,932
    2610,2610
    3276,3276
    2901,2901
    1749,1749
    250,250
    -1118,-1118
    -1990,-1990
    -2172,-2172
    -1704,-1704
    -792,-792
    241,241
    1092,1092
    1525,1525
    1470,1470
    987,987
    273,273
    -451,-451
    -962,-962
    -1147,-1147
    -971,-971
    -538,-538
    17,17
    502,502
    803,803
    830,830
    625,625
    245,245
    -156,-156
    -491,-491
    -637,-637
    -605,-605
    -378,-378
    -85,-85
    239,239
    443,443
    542,542
    440,440
    257,257
    -59,-59
    -315,-315
    -598,-598
    -692,-692
    -791,-791
    -656,-656
    -619,-619
    -346,-346
    -330,-330
    -23,-23
    -154,-154
    157,157
    -98,-98
    114,114

    uploaded

  • For some reason ADI Wizard do not allow me to save FIR file, I can only export to Matlab workspace.

  • Did you design TX and RX? Both must be designed before export is possible.

    -Travis

  • This is very good point ! I just wanted RX, but it seems I need both ? Also the example was saying it is better to enable both directions. Let me try it.

  • # Generated with AD9361 Filter Design Wizard 16.1.3
    # MATLAB 9.7.0.1296695 (R2019b) Update 4, 09-Mar-2020 17:12:10
    # Inputs:
    # Data Sample Frequency = 520833 Hz
    TX 3 GAIN 0 INT 4
    RX 3 GAIN -12 DEC 4
    RTX 800000000 25000000 8333333 4166667 2083333 520833
    RRX 800000000 25000000 8333333 4166667 2083333 520833
    BWTX 1253607
    BWRX 434750
    25,115
    -88,-99
    -26,157
    -226,-154
    -252,-24
    -473,-330
    -566,-346
    -744,-620
    -781,-657
    -803,-792
    -669,-693
    -483,-598
    -189,-315
    96,-59
    368,257
    518,440
    547,543
    408,443
    163,239
    -153,-85
    -428,-379
    -602,-605
    -594,-637
    -410,-492
    -76,-156
    304,245
    629,626
    781,831
    706,804
    394,502
    -70,17
    -565,-538
    -927,-971
    -1035,-1147
    -819,-963
    -319,-451
    342,274
    966,988
    1353,1471
    1345,1525
    902,1092
    110,242
    -815,-792
    -1595,-1704
    -1956,-2172
    -1726,-1990
    -896,-1119
    350,250
    1671,1749
    2647,2901
    2907,3276
    2238,2610
    689,932
    -1415,-1411
    -3504,-3791
    -4897,-5440
    -4957,-5629
    -3268,-3869
    237,-64
    5216,5418
    10960,11790
    16526,17992
    20930,22912
    23360,25630
    23360,25630
    20930,22912
    16526,17992
    10960,11790
    5216,5418
    237,-64
    -3268,-3869
    -4957,-5629
    -4897,-5440
    -3504,-3791
    -1415,-1411
    689,932
    2238,2610
    2907,3276
    2647,2901
    1671,1749
    350,250
    -896,-1119
    -1726,-1990
    -1956,-2172
    -1595,-1704
    -815,-792
    110,242
    902,1092
    1345,1525
    1353,1471
    966,988
    342,274
    -319,-451
    -819,-963
    -1035,-1147
    -927,-971
    -565,-538
    -70,17
    394,502
    706,804
    781,831
    629,626
    304,245
    -76,-156
    -410,-492
    -594,-637
    -602,-605
    -428,-379
    -153,-85
    163,239
    408,443
    547,543
    518,440
    368,257
    96,-59
    -189,-315
    -483,-598
    -669,-693
    -803,-792
    -781,-657
    -744,-620
    -566,-346
    -473,-330
    -252,-24
    -226,-154
    -26,157
    -88,-99
    25,115
    
    The TX looks diffrent but I am interested in RX anyway,

  • I generated file as you advised, then loaded and enabled:

    cat /tmp/fir.txt > filter_fir_config

    echo 1 > in_out_voltage_filter_fir_en

    Still my code ends with error because:

    Error -22 writing to channel "sampling_frequency" value may not be supported.

    or 

    Error refilling buf -110

    if I comment out setting frequency.

    Not sure if it helps but I can see:

    root@analog:/sys/bus/iio/devices/iio:device2# cat in_voltage_sampling_frequency_available [

    520833 1 30720000]

  • The first filter file was invalid, but the second one worked. Data streamed fine out of IIO-Scope when loaded.

    My guess is that you are running into a rounding problem since technically the part only supports rates down to 520833.33333333... and the attribute input only accepts ints. For example, 5208334 should work fine.

    However, if you want 520833.333 you have to use a filter file since these are interpreted as ratios in the driver and not actual values.

    -Travis

  • Hi Travis, 

    I think you absolutely right, setting sampling_frequenct below lowest value could not work. So I decided to change to to more "rounded" value of 600ksps. I generated FIR config with wizard (attached) and then uploaded programmatically to the filter using ret = iio_device_attr_write_raw(dev, "filter_fir_config", buf, len);

    The I enable FIR  configuration and sampling of 600ksps. This seems to be working fine. 

    Then I read configuration with  iio_device_attr_read(get_ad9361_phy(ctx), NULL, (char *)&cfg, 10240); and sampling rate is 599999 ? BBPLL:921599992 ADC:28799999 R2:9599999 R1:4799999 RF:2399999 RXSAMP:599999. Why there is a change comparing to original FIR config ? 

    Still this is fine, but when I want to pull samples with: nbytes_rx = iio_buffer_refill(rxbuf); I am getting error -110 and case closed. Shall I open separate thread for this problem ?

    Thanks

  • Why there is a change comparing to original FIR config ?

    This likely rounding the driver does. I believe it always rounds down (and MATLAB doesn't do that).

    Shall I open separate thread for this problem ?

    Yes, please do. If you could include more code around the buffer creation that would be helpful.

    -Travis

  • Ok, I took 599998 as sampling frequency from FIR settings, I can set it just fine. I opened new thread for error -110 on filling buffers.