ADRF6780 no-OS Driver
See drivers/frequency/adrf6780 (doxygen) for the Doxygen documentation.
Supported Devices
Overview
The ADRF6780 is a wideband, microwave upconverter optimized for point to point microwave radio designs operating over an RF output frequency range of 5.9 GHz to 23.6 GHz. The device is fabricated on a silicon germanium (SiGe) process and supports two upconversion modes: direct conversion from baseband I/Q signals to RF, and single-sideband (SSB) upconversion from a real intermediate frequency (IF) input. The local oscillator (LO) input frequency range is 5.4 GHz to 14 GHz, with an integrated LO frequency doubler extending the effective LO range up to 28 GHz. The ADRF6780 features matched 100 ohm balanced RF output, LO input, and IF input, along with high impedance baseband inputs. The device integrates a variable attenuator and power detector for transmit power control, as well as sideband suppression and carrier feedthrough optimization capabilities. It is programmable via a 4-wire SPI interface and is available in a 32-lead, 5 mm x 5 mm LFCSP package, rated for operation from -40 C to +85 C.
Applications
Point to point microwave radios
Radar/electronic warfare
Instrumentation/ATE
ADRF6780 Device Configuration
Driver Initialization
In order to be able to use the device, you will have to provide the support for the communication protocol (SPI).
The first API to be called is adrf6780_init. Make sure that it returns 0,
which means that the driver was initialized correctly. During initialization,
the driver configures the SPI interface, performs a soft reset, and verifies
the chip ID (expected value 0xA). It then configures the enable register, which
controls the VGA buffer, detector (always enabled), LO buffer, IF/IQ mode
selection, LO x2/PPF selection, LO enable, and UC bias enable. The
initialization also sets the LO sideband selection and configures the ADC VDET
output source. Note that IF mode and IQ mode are mutually exclusive in the
enable register, and LO x2 and LO PPF are also mutually exclusive.
The spi_init field in the init parameters is passed by pointer.
Mode Configuration
The ADRF6780 supports two upconversion modes, which are mutually exclusive in
the enable register. Setting if_mode_en to true enables IF mode, which
uses single-sideband (SSB) upconversion from a real IF input. When
if_mode_en is false, the device operates in I/Q mode, performing direct
conversion from baseband I/Q signals to RF.
LO Path Configuration
The lo_x2_en parameter enables the LO frequency doubler. When disabled,
the LO polyphase filter (PPF) is used instead. These two options are mutually
exclusive in the enable register. The lo_sideband parameter selects between
upper and lower sideband operation. The lo_buff_en and lo_en parameters
control the LO buffer amplifier and the LO path respectively.
Linearization
The adrf6780_set_rdac_linearize and adrf6780_get_rdac_linearize APIs
allow setting and reading the RDAC linearize value. This setting is used to
improve intermodulation distortion (IMD) performance of the upconverter.
I/Q Phase Accuracy
The adrf6780_set_cdac_iq_phase_accuracy and
adrf6780_get_cdac_iq_phase_accuracy APIs allow tuning the CDAC I/Q phase
accuracy to optimize sideband suppression. The I and Q paths can be adjusted
independently through separate i_data and q_data parameters.
ADC Power Detector
The adrf6780_read_adc_raw API reads the on-chip ADC output from the
integrated power detector. The vdet_out_en initialization parameter selects
the VDET output source for the ADC measurement.
ADRF6780 Driver Initialization Example
struct adrf6780_dev *dev;
int ret;
struct no_os_spi_init_param spi_init = {
.device_id = SPI_DEVICE_ID,
.max_speed_hz = SPI_MAX_SPEED,
.chip_select = SPI_CS,
.mode = NO_OS_SPI_MODE_0,
.bit_order = NO_OS_SPI_BIT_ORDER_MSB_FIRST,
.platform_ops = SPI_OPS,
.extra = SPI_EXTRA,
};
struct adrf6780_init_param adrf6780_ip = {
.spi_init = &spi_init,
.lo_in = 12000000000ULL,
.vga_buff_en = true,
.lo_buff_en = true,
.if_mode_en = false,
.lo_x2_en = true,
.lo_en = true,
.uc_bias_en = true,
.lo_sideband = false,
.vdet_out_en = false,
};
ret = adrf6780_init(&dev, &adrf6780_ip);
if (ret)
goto error;
ret = adrf6780_set_cdac_iq_phase_accuracy(dev, 0x08, 0x08);
if (ret)
goto error_remove;
uint16_t adc_raw;
ret = adrf6780_read_adc_raw(dev, &adc_raw);
if (ret)
goto error_remove;
error_remove:
adrf6780_remove(dev);
error:
return ret;