From 06fdf35a968e376e3b68c89ffa13075afc5c28cd Mon Sep 17 00:00:00 2001 From: PopPaul2021 Date: Tue, 20 Aug 2024 11:21:56 +0300 Subject: [PATCH] examples:AD9081 Stingray TDDN example Signed-off-by: PopPaul2021 --- adi/__init__.py | 1 + adi/ad9081.py | 9 +++ adi/tddn.py | 2 +- examples/ad9081_stingray.py | 138 ++++++++++++++++++++++++++++++++++++ 4 files changed, 149 insertions(+), 1 deletion(-) create mode 100755 examples/ad9081_stingray.py diff --git a/adi/__init__.py b/adi/__init__.py index f521b1292..4010e1d67 100644 --- a/adi/__init__.py +++ b/adi/__init__.py @@ -124,6 +124,7 @@ try: from adi.jesd import jesd + from adi.sshfs import sshfs except ImportError: pass diff --git a/adi/ad9081.py b/adi/ad9081.py index e9bf82249..646447a85 100644 --- a/adi/ad9081.py +++ b/adi/ad9081.py @@ -707,3 +707,12 @@ def chip_version(self): def api_version(self): """api_version: API version""" return self._get_iio_debug_attr_str("api_version", self._rxadc) + + def ad9081_register_read(self, reg): + """Direct Register Access via debugfs""" + self._set_iio_debug_attr_str("direct_reg_access", reg, self._rxadc) + return self._get_iio_debug_attr_str("direct_reg_access", self._rxadc) + + def ad9081_register_write(self, reg, value): + """Direct Register Access via debugfs""" + self._set_iio_debug_attr_str("direct_reg_access", f"{reg} {value}", self._rxadc) diff --git a/adi/tddn.py b/adi/tddn.py index c56842c1e..5fdd1686b 100644 --- a/adi/tddn.py +++ b/adi/tddn.py @@ -18,7 +18,7 @@ class tddn(context_manager, attribute): def __init__(self, uri=""): """TDDN Controller""" context_manager.__init__(self, uri, self._device_name) - self._ctrl = self._ctx.find_device("iio-axi-tdd-0") + self._ctrl = self._ctx.find_device("adi-iio-fakedev") for ch in self._ctrl.channels: name = ch._id diff --git a/examples/ad9081_stingray.py b/examples/ad9081_stingray.py new file mode 100755 index 000000000..9e63c8bcd --- /dev/null +++ b/examples/ad9081_stingray.py @@ -0,0 +1,138 @@ +# Copyright (C) 2020 Analog Devices, Inc. +# +# SPDX short identifier: ADIBSD + +import time +import sys +import adi +import math +import matplotlib.pyplot as plt +import numpy as np + +url = "local:" if len(sys.argv) == 1 else sys.argv[1] +ssh = adi.sshfs(address=url, username="root", password="analog") + +tx_offload_base_addr = 0x9c440000 +rx_offload_base_addr = 0x9c450000 +control_reg_offload = 0x88 + +conv = adi.ad9081(url) +tddn = adi.tddn(url) + +conv._rxadc.set_kernel_buffers_count(1) + +# Set NCOs + +conv.rx_channel_nco_frequencies = [0] * 4 +conv.tx_channel_nco_frequencies = [0] * 4 + +conv.rx_main_nco_frequencies = [100000000] * 4 +conv.tx_main_nco_frequencies = [100000000] * 4 + +conv.rx_enabled_channels = [0,1,2] +conv.tx_enabled_channels = [0,1,2] +conv.rx_nyquist_zone = ["odd"] * 4 + +conv.tx_cyclic_buffer = True +conv.rx_cyclic_buffer = False +conv.tx_ddr_offload = False +conv.rx_ddr_offload = False + +stdout, stderr = ssh._run(f"busybox devmem 0x{tx_offload_base_addr + control_reg_offload:02x} 32 0x2") +stdout, stderr = ssh._run(f"busybox devmem 0x{rx_offload_base_addr + control_reg_offload:02x} 32 0x2") + +frame_length_ms = 1 +pulse_width_high = 0.1 +samples_per_frame_desired = (pulse_width_high * conv.tx_sample_rate) / 1000 +N_tx = int(samples_per_frame_desired) +N_rx = 3 * N_tx +conv.rx_buffer_size = N_rx + +tddn.startup_delay_ms = 0 +tddn.frame_length_ms = frame_length_ms +tddn.burst_count = 0 + +# TDD ENABLE + +tddn.channel[2].on_ms = 0 +tddn.channel[2].off_ms = 0 +tddn.channel[2].polarity = 1 +tddn.channel[2].enable = 1 + +# TX OFFFLOAD SYNC +tddn.channel[0].on_ms = 0 +tddn.channel[0].off_raw = 1 +tddn.channel[0].polarity = 0 +tddn.channel[0].enable = 1 + +# RX OFFFLOAD SYNC +tddn.channel[1].on_ms = 0 +tddn.channel[1].off_raw = 1 +tddn.channel[1].polarity = 0 +tddn.channel[1].enable = 1 + +for chan in [3,4,5] : + tddn.channel[chan].on_ms = 0 + tddn.channel[chan].off_ms = 0 + tddn.channel[chan].polarity = 1 + tddn.channel[chan].enable = 1 + +tddn.enable = 1 + +print(f"TX Sampling_rate: {conv.tx_sample_rate}") +print(f"RX Sampling_rate: {conv.rx_sample_rate}") +print(f"TX buffer length: {N_tx}") +print(f"RX buffer length: {N_rx}") +print(f"TX_transmit time[ms]: {(samples_per_frame_desired / conv.tx_sample_rate) * 1000}") +print(f"RX_recieve time[ms]: {((1/conv.rx_sample_rate) * N_rx)*1000}") +print(f"TDD_frame time[ms]: {frame_length_ms}") + +fs = int(conv.tx_sample_rate) +A = 0.9 * 2**15 # -6 dBFS +B = 1e4 +T = N_tx / fs +t = np.linspace(0, T, N_tx, endpoint=False) +tx_sig = A * np.sin(2 * math.pi * B * t) +conv.tx([tx_sig,tx_sig,tx_sig]) + +tddn.sync_soft = 0 +tddn.sync_soft = 1 + + +capture_range = 500 +enabled_channels = 3 + +rx_sig = np.zeros((capture_range,enabled_channels,N_rx)) +rx_t = np.linspace(0,N_rx, N_rx , endpoint=False) + +fig, (ch1, ch2) = plt.subplots(1, 2) + +for r in range(capture_range): + rx_sig[r] = conv.rx() + +for r in range(capture_range): + plt.suptitle(f"Capture number: {r}") + ch1.plot(rx_t, rx_sig[r][0]) + ch1.set_title("Channel 1 data") + ch2.plot(rx_t, rx_sig[r][1]) + ch2.set_title("Channel 2 data") +plt.show() + +tddn.enable = 0 + +for chan in [1,2,3,4,5] : + tddn.channel[chan].on_ms = 0 + tddn.channel[chan].off_ms = 0 + tddn.channel[chan].polarity = 0 + tddn.channel[chan].enable = 1 + +tddn.enable = 1 +tddn.enable = 0 + +conv.tx_destroy_buffer() +conv.rx_destroy_buffer() + + + + +