Post Go back to editing

AD9207 - No data from ADC1 channel- Only One Channel (voltage0) Showing Data

Thread Summary

The user is experiencing an issue with the AD9207 dual ADC on a custom Zynq Ultrascale+ ZU11EG board, where only the voltage0 channel (ADC0) shows valid data in the IIO Oscilloscope, while voltage1 (ADC1) is inactive. The problem appears to be related to the axi_mxfe_rx_jesd IP core, which processes only the lower 256 bits of the 512-bit JESD data bus. The final answer suggests compiling the device tree and kernel separately to isolate the issue from the PetaLinux workflow. Additional testing with the 2021.2 PetaLinux version confirmed both channels working correctly, indicating a potential bug in the 2023.2 source code.
AI Generated Content
Category: Software
Product Number: AD9207
Software Version: Petalinux-v2023.2

Dear ADI EngineerZone Support Team,

We are facing a significant issue with the AD9207 dual ADC integrated on our custom board, which utilizes a Zynq Ultrascale+ ZU11EG platform. We are using the IIO Oscilloscope application for initial validation.

Problem Description:

Currently, we are only able to observe valid data on the voltage0 channel (ADC0) of the AD9207. The voltage1 channel (ADC1) consistently shows a flat line in the IIO Oscilloscope.

Furthermore, when we attempt to capture data specifically from voltage1 using iio_readdev, the output file contains no meaningful data (all zeros).

Debugging Steps and Observations:

To diagnose this, we have utilized ILA probe at the output of the axi_mxfe_rx_jesd IP core. This analysis reveals that only the lower 256 bits (bit indices 0 to 255) of the expected 512-bit data bus are active.

It appears that the complete 512-bit JESD data is not being correctly processed or forwarded by the axi_mxfe_rx_jesd IP to the subsequent rx_mxfe_tpl_core. This bottleneck seems to be the reason why only adc_data_0 (corresponding to voltage0) is valid, while adc_data_1 remains inactive.

Additionally, we have tapped all 8 JESD lanes originating from the util_mxfe_xcvr IP core, which feeds into the axi_mxfe_rx_jesd IP. The ILA probes on these lanes indicate that data (64bit each) is being received across all eight lanes by the axi_mxfe_rx_jesd IP.

device tree,

/ {
	fpga_axi: fpga-axi@0 {
		interrupt-parent = <&gic>;
		compatible = "simple-bus";
		#address-cells = <0x1>;
		#size-cells = <0x1>;
		ranges = <0 0 0 0xffffffff>;

		rx_dma: dma@9c420000 {
			compatible = "adi,axi-dmac-1.00.a";
			reg = <0x9c420000 0x0400>;
			#dma-cells = <1>;
			#clock-cells = <0>;
			interrupts = <0 109 IRQ_TYPE_LEVEL_HIGH>;
			clocks = <&zynqmp_clk 73>;
		};

		axi_ad9081_core_rx: axi-ad9081-rx-hpc@84a10000 {
			compatible = "adi,axi-ad9081-rx-1.0";
			reg = <0x84a10000 0x2000>;
			dmas = <&rx_dma 0>;
			dma-names = "rx";
			spibus-connected = <&trx0_ad9081>;

			jesd204-device;
			#jesd204-cells = <2>;
			jesd204-inputs = <&axi_ad9081_rx_jesd 0 FRAMER_LINK0_RX>;
		};

		axi_ad9081_rx_jesd: axi-jesd204-rx@84a90000 {
			compatible = "adi,axi-jesd204-rx-1.0";
			reg = <0x84a90000 0x4000>;

			interrupts = <0 107 IRQ_TYPE_LEVEL_HIGH>;

			clocks = <&zynqmp_clk 71>, <&hmc7044 10>, <&axi_ad9081_adxcvr_rx 1>, <&axi_ad9081_adxcvr_rx 0>;
			clock-names = "s_axi_aclk", "device_clk", "link_clk", "lane_clk";

			#clock-cells = <0>;
			clock-output-names = "jesd_rx_lane_clk";

			jesd204-device;
			#jesd204-cells = <2>;
			jesd204-inputs = <&axi_ad9081_adxcvr_rx 0 FRAMER_LINK0_RX>;
		};

		axi_ad9081_adxcvr_rx: axi-adxcvr-rx@84a60000 {
			#address-cells = <1>;
			#size-cells = <0>;
			compatible = "adi,axi-adxcvr-1.0";
			reg = <0x84a60000 0x10000>;

			clocks = <&hmc7044 12>;
			clock-names = "conv";

			#clock-cells = <1>;
			clock-output-names = "rx_gt_clk", "rx_out_clk";

			adi,sys-clk-select = <XCVR_QPLL1>;
			adi,out-clk-select = <XCVR_PROGDIV_CLK>;
 			adi,use-lpm-enable;

			jesd204-device;
			#jesd204-cells = <2>;
			jesd204-inputs =  <&hmc7044 0 FRAMER_LINK0_RX>;
		};

		axi_sysid_0: axi-sysid-0@85000000 {
			compatible = "adi,axi-sysid-1.00.a";
			reg = <0x85000000 0x10000>;
		};

		axi_data_offload_rx: axi-data-offload-1@9c450000 {
			compatible = "adi,axi-data-offload-1.0.a";
			reg = <0x9c450000 0x4000>;
		};
	};
};

&spi1 {
	status = "okay";
	hmc7044: hmc7044@0 {
		#address-cells = <1>;
		#size-cells = <0>;
		#clock-cells = <1>;
		compatible = "adi,hmc7044";
		reg = <0>;
		spi-max-frequency = <1000000>;

		jesd204-device;
		#jesd204-cells = <2>;
		jesd204-sysref-provider;

		adi,jesd204-max-sysref-frequency-hz = <2343750>; /* 2 MHz */

		/*
		* There are different versions of the AD9081-FMCA-EBZ & AD9082-FMCA-EBZ
		* VCXO = 122.880 MHz, XO = 122.880MHz (AD9081-FMC-EBZ & AD9082-FMC-EBZ)
		* VCXO = 100.000 MHz, XO = 100.000MHz (AD9081-FMC-EBZ-A2 & AD9082-FMC-EBZ-A2)
		* To determine which board is which, read the freqency printed on the VCXO
		* or use the fru-dump utility:
		* #fru-dump -b /sys/bus/i2c/devices/15-0050/eeprom
		*/

		adi,pll1-clkin-frequencies = <100000000 100000000 0 0>;
		adi,vcxo-frequency = <100000000>;

		adi,pll1-loop-bandwidth-hz = <200>;

		adi,pll2-output-frequency = <2400000000>;

		adi,sysref-timer-divider = <1024>;
		adi,pulse-generator-mode = <0>;

		adi,clkin0-buffer-mode  = <0x07>;
		adi,clkin1-buffer-mode  = <0x07>;
		adi,oscin-buffer-mode = <0x15>;

		adi,gpi-controls = <0x00 0x00 0x00 0x00>;
		adi,gpo-controls = <0x37 0x33 0x00 0x00>;

		clock-output-names =
		"hmc7044_out0", "hmc7044_out1", "hmc7044_out2",
		"hmc7044_out3", "hmc7044_out4", "hmc7044_out5",
		"hmc7044_out6", "hmc7044_out7", "hmc7044_out8",
		"hmc7044_out9", "hmc7044_out10", "hmc7044_out11",
		"hmc7044_out12", "hmc7044_out13";

		hmc7044_c2: channel@2 {
			reg = <2>;
			adi,extended-name = "DEV_REFCLK";
			adi,divider = <16>; // 150 MHz
			adi,driver-mode = <HMC7044_DRIVER_MODE_LVDS>;
		};
		hmc7044_c3: channel@3 {
			reg = <3>;
			adi,extended-name = "DEV_SYSREF";
			adi,divider = <1536>; // 0.78125 MHz
			adi,driver-mode = <HMC7044_DRIVER_MODE_LVDS>;
			adi,jesd204-sysref-chan;
		};

		hmc7044_c6: channel@6 {
			reg = <6>;
			adi,extended-name = "CORE_CLK_TX";
			adi,divider = <16>; // 150 MHz
			adi,driver-mode = <HMC7044_DRIVER_MODE_LVDS>;
		};

		hmc7044_c10: channel@a {
			reg = <10>;
			adi,extended-name = "CORE_CLK_RX_ALT";
			adi,divider = <16>; // 150 MHz
			adi,driver-mode = <HMC7044_DRIVER_MODE_LVDS>;
		};

		hmc7044_c12: channel@c {
			reg = <12>;
			adi,extended-name = "FPGA_REFCLK2";
			adi,divider = <16>; // 150 MHz
			adi,driver-mode = <HMC7044_DRIVER_MODE_LVDS>;
		};
		hmc7044_c13: channel@d {
			reg = <13>;
			adi,extended-name = "FPGA_SYSREF";
			adi,divider = <1536>; // 0.78125 MHz
			adi,driver-mode = <HMC7044_DRIVER_MODE_LVDS>;
			adi,jesd204-sysref-chan;
                        //adi,disable;
		};
	};
};
&spi0 {
	status = "okay";

	trx0_ad9081: ad9082@0 {
		reset-gpios = <&gpio 133 0>;
		sysref-req-gpios = <&gpio 121 0>;
		rx2-enable-gpios = <&gpio 135 0>;
		rx1-enable-gpios = <&gpio 134 0>;
		//tx2-enable-gpios = <&gpio 137 0>;
		//tx1-enable-gpios = <&gpio 136 0>;
		#address-cells = <1>;
		#size-cells = <0>;
		//compatible = "adi,ad9082";
		compatible = "adi,ad9207";
		reg = <0>;
		spi-max-frequency = <1000000>;

		/* Clocks */
		clocks = <&hmc7044 2>;
		clock-names = "dev_clk";

		clock-output-names = "rx_sampl_clk", "tx_sampl_clk";
		#clock-cells = <1>;

		jesd204-device;
		#jesd204-cells = <2>;
		jesd204-top-device = <0>; /* This is the TOP device */
		jesd204-link-ids = <FRAMER_LINK0_RX>;

		jesd204-inputs =
			<&axi_ad9081_core_rx 0 FRAMER_LINK0_RX>;

		adi,continuous-sysref-mode-disable;

		adi,tx-dacs {
			#size-cells = <0>;
			#address-cells = <1>;

			adi,dac-frequency-hz = /bits/ 64 <9600000000>;
		};

		adi,rx-adcs {
			#size-cells = <0>;
			#address-cells = <1>;

			adi,adc-frequency-hz = /bits/ 64 <4800000000>;

			adi,main-data-paths {
				#address-cells = <1>;
				#size-cells = <0>;

				ad9081_adc0: adc@0 {
					reg = <0>;
					adi,decimation = <1>;
					adi,nco-frequency-shift-hz =  /bits/ 64 <0>;
				};
				ad9081_adc1: adc@1 {
					reg = <1>;
					adi,decimation = <1>;
					adi,nco-frequency-shift-hz =  /bits/ 64 <0>;
				};

			};

			adi,channelizer-paths {
				#address-cells = <1>;
				#size-cells = <0>;


				ad9081_rx_fddc_chan0: channel@0 {
					reg = <0>;
					adi,decimation = <1>;
					adi,gain = <2048>; /* 2048 * 10^(gain_dB/20) */
					adi,nco-frequency-shift-hz =  /bits/ 64 <0>;
					adi,nco-mixer-mode = <AD9081_ADC_NCO_ZIF>;

				};
				ad9081_rx_fddc_chan1: channel@1 {
					reg = <1>;
					adi,decimation = <1>;
					adi,gain = <2048>; /* 2048 * 10^(gain_dB/20) */
					adi,nco-frequency-shift-hz =  /bits/ 64 <0>;
					adi,nco-mixer-mode = <AD9081_ADC_NCO_ZIF>;
				};
			};

			adi,jesd-links {
				#size-cells = <0>;
				#address-cells = <1>;

				ad9081_rx_jesd_l0: link@0 {
					reg = <0>;
					adi,converter-select =
						 <&ad9081_rx_fddc_chan0 FDDC_I>, <&ad9081_rx_fddc_chan1 FDDC_I>;

                                        adi,logical-lane-mapping = /bits/ 8 <0 1 2 3 4 5 6 7>;

					adi,link-mode = <19>;			/* JESD Quick Configuration Mode */
					adi,subclass = <1>;			/* JESD SUBCLASS 0,1,2 */
					adi,version = <2>;			/* JESD VERSION 0=204A,1=204B,2=204C */
					adi,dual-link = <0>;			/* JESD Dual Link Mode */

					adi,converters-per-device = <2>;	/* JESD M */
					adi,octets-per-frame = <1>;		/* JESD F */

					adi,frames-per-multiframe = <256>;	/* JESD K */
					adi,converter-resolution = <16>;	/* JESD N */
					adi,bits-per-sample = <16>;		/* JESD NP' */
					adi,control-bits-per-sample = <0>;	/* JESD CS */
					adi,lanes-per-device = <8>;		/* JESD L */
					adi,samples-per-converter-per-frame = <2>; /* JESD S */
					adi,high-density = <1>;			/* JESD HD */
				};
			};
		};
	};
};

  1. Could this issue be related to an incorrect configuration of the axi_mxfe_rx_jesd IP core? Are there specific parameters or settings within this IP that could cause it to process only half of the incoming JESD data?
  2. Is there a known limitation or configuration requirement regarding the data bus width or lane aggregation within the axi_mxfe_rx_jesd IP when interfacing with the AD9207 in a dual-channel configuration?
  3. Could the device tree configuration be contributing to this problem? Are there any specific properties related to the axi_mxfe_rx_jesd or the AD9207 node that we should examine or modify?

Could you please provide any insights or guidance to resolve this issue and enable data acquisition on both ADC channels. I can provide more details if you want to check.

Thank you for your time and support.

Thread Notes

Before You Switch


Switching languages will make ADI Explorer unavailable. Resume your session by switching back to English and reopening ADI Explorer.