Post Go back to editing

Separate IQ Buffer Streams

Category: Software
Product Number: ADRV9029
Software Version: libiio v0.25

Hi all,

I have been experimenting with sending IQ data via a libiio buffer, and I'd like to enable the IQ transmission on one channel only (i.e. TX1 only). Simultaneously, I'd like to enable the remaining channels axis-adrv9025-tx-hpc DAC enable outputs (out_voltage[0, 1, 2, 3]_q_en,out_voltage[0, 1, 2, 3]_i_en), but in doing so, the IQ data in the buffer object is sent to all DAC channels. I did see over 4 years ago, there seems to be a single DMA buffer queue for all channels:  https://ez.analog.com/linux-software-drivers/f/q-a/539615/iio-oscilloscope-load-separate-dac-buffers-with-different-iq-files-adrv9009-zu11eg

Has this changed for the ADRV9026/9, i.e. are there separate DMA buffers for each DAC channel? In the suggested answer above, using the Python bindings, how could I use vectors of all the same length to queue up simultaneously on the different DAC channels? 

Simple control software example below:

import iio
import numpy as np
import time
from pathlib import Path
import scipy.io

adi9026 = iio.Context("ip:192.168.0.14")
tx_iq_xmit = 1

# Get Tx/Rx AXI Streaming Devices
phy_control = adi9026.find_device("adrv9025-phy")
phy_control.find_channel("LO1", True).attrs["frequency"].value = str(1 * (10**9))
phy_control.find_channel("LO2", True).attrs["frequency"].value = str(1 * (10**9))

#Device
tx_control = adi9026.find_device("axi-adrv9025-tx-hpc")
rx_control = adi9026.find_device("axi-adrv9025-rx-hpc")

# enable TX channels for Tx
i_chan1_tx = tx_control.find_channel("voltage0_i", True)
q_chan1_tx = tx_control.find_channel("voltage0_q", True)

data = (scipy.io.loadmat("test_files/t1.mat")['iq'][0]) * 2 ** 12
tx_buffer_size = len(data) // 2
rx_buffer_size = tx_buffer_size * 2

if tx_iq_xmit == 1:
    # Create the TX buffer, write IQ data, push
    txbuf = iio.Buffer(tx_control, tx_buffer_size, True)
    txbuf.write(bytearray(data))
    txbuf.push()

for i in range(1, 4):
    tx_control.find_channel("voltage"+str(i)+"_i", False).enabled = True
    tx_control.find_channel("voltage"+str(i)+"_q", False).enabled = True