AD3552R no-OS Driver

Supported Devices

Overview

The AD3552R is a dual-channel digital-to-analog converter (DAC) designed for precision signal processing applications, supporting bipolar (-10V to 10V) and unipolar (0V to 5V) output configurations. It operates via SPI communication in single, dual, and quad modes. The DAC features adjustable gain and offset, a scratch pad test, and allows for both hardware and software resets. Dedicated registers provide control over channel attributes, streaming, and input/output settings.

Applications

  • Instrumentation

  • Hardware in the loop

  • Process control equipment

  • Medical devices

  • Automated test equipment

  • Data acquisition systems

  • Programmable voltage sources

  • Optical communications

Operation Modes

Mode Name

Description

Configuration

Typical Use

Single

SPI mode with unidirectional SDI/SDIO0 and SDO/SDIO1 lines for basic serial communication.

AD3552R_SPI_MULTI_IO_MODE set to 0

Basic applications requiring standard SPI communication.

Dual

Bidirectional communication on SDI/SDIO lines for enhanced throughput.

Set multi_io_mode to 1 in ad3552_transfer_config

Applications requiring higher data throughput.

Quad

Utilizes four lines for data transfer for significantly increased throughput.

Set multi_io_mode to 2 in ad3552_transfer_config

High-speed data- intensive applications.

DDR Mode

Double Data Rate transfer using both edges of the clock for faster data transfers.

AD3552R_MASK_SPI_CONFIG_DDR used to enable this mode

Situations requiring rapid data updates.

Synchronous

Dual SPI synchronous mode for synchronized data transfer across channels.

AD3552R_SPI_SYNCHRONOUS_ENABLE for enabling this feature

Systems needing synchronized operations for data integrity.

Device Configuration

Initialization

The ad3552r_init function initializes the AD3552R DAC, configuring SPI or AXI interfaces based on parameters and setting up GPIOs for reset and LDAC signals. It includes programming CRC settings for data integrity and writing initial configuration registers.

Data Transfer and Access

Key functions for data transfer include ad3552r_write_reg, which writes data to specific registers, and ad3552r_transfer, which handles data transfer operations. For read operations, ad3552r_read_reg retrieves data from specified registers.

Configuration and Mode Setting

Functions like ad3552r_set_dev_value adjust specific device settings, such as enabling or disabling CRC. The ad3552r_axi_init function is used for additional initialization when configured in AXI mode. _ad3552r_update_reg_field updates specific fields in configuration registers.

Error Handling

Error handling is managed by functions like ad3552r_get_status, which retrieves and optionally clears error states. This functionality assists in managing and reporting errors related to interface configurations, CRC mismatches, and access attempts to invalid registers.

Reset and Utilities

The ad3552r_reset function handles resetting the device to its initial state. It is important for re-initialization and troubleshooting. Additional utility functions exist to support various device-specific operations.

Initialization and Configuration

The ad3552r_init function initializes the AD3552R DAC, setting up SPI or AXI interfaces and configuring necessary GPIOs. Additional configurations may include enabling CRC and setting the device’s operational parameters. Functions like ad3552r_reset are used to restore the device to its initial state, important for both initialization and troubleshooting. ad3552r_axi_init is particularly used when configured in AXI mode. The reset capabilities are crucial to establish a known state for successful operations.

Register Access and Data Transfer

Functions such as ad3552r_write_reg and ad3552r_read_reg are designed for register access to update settings or retrieve data from the DAC. ad3552r_single_transfer and ad3552r_transfer handle data transactions, ensuring efficient communication via SPI or AXI setups. Operations like ad3552r_write_simulatneously allow multiple channel updates, enhancing the DAC’s data throughput in high-speed applications. DMA support is facilitated through the ad3552r_axi_write_data for bulk data operations.

Device Control and Customization

Functions under this category, like ad3552r_set_dev_value and ad3552r_get_dev_value, handle device parameter adjustments. ad3552r_config_custom_gain and ad3552r_configure_device allow configuration of custom output ranges and gain. ad3552r_ldac_trigger is utilized for asynchronous operations. These functions enable adaptation of the DAC to specific operational needs, ensuring accurate performance.

Error Handling

Error detection and handling functions like ad3552r_get_status provide mechanisms to monitor and address device malfunctions. This is crucial for identifying issues such as CRC mismatches or illegal accesses, ensuring system reliability. Error states can be retrieved for diagnostic purposes, facilitating robust device integration.

Utility and Support

Utility functions, including ad3552r_remove, manage device cleanup and resource deallocation. Functions like ad3552r_check_scratch_pad and ad3552r_get_scale offer additional support for device diagnostics and calibration checks. This holistic approach covers various operational needs, enhancing device management and support throughout its lifecycle.

Device Initialization Example

#include "ad3552r.h"
static struct ad3552r_init_param default_ad3552r_param = {
    .chip_id = 0x4008,
    .spi_param = {
        .device_id = 1,
        .chip_select = 0,
        .mode = NO_OS_SPI_MODE_0,
        .max_speed_hz = 66000000,
        .bit_order = NO_OS_SPI_BIT_ORDER_MSB_FIRST,
        .platform_ops = &xil_spi_ops,
        .extra = SPI_EXTRA
    },
    .ldac_gpio_param_optional = &gpio_ldac_param,
    .reset_gpio_param_optional = &gpio_reset_param,
    .sdo_drive_strength = 1,
    .channels = {
        [0] = {
            .en = 1,
            .range = AD3552R_CH_OUTPUT_RANGE_NEG_10__10V,
        },
        [1] = {
            .en = 1,
            .range = AD3552R_CH_OUTPUT_RANGE_NEG_10__10V,
        }
    },
    .crc_en = 0,
    .single_transfer = 1,
};
int example_main()
{
    int32_t err;
    struct ad3552r_desc *dac;
    err = init_gpios_to_defaults();
    if (NO_OS_IS_ERR_VALUE(err)) {
        pr_err("init_gpios_to_defaults failed: %d\n", err);
        return err;
    }
    err = ad3552r_init(&dac, &default_ad3552r_param);
    if (NO_OS_IS_ERR_VALUE(err)) {
        pr_err("ad3552r_init failed with code: %d\n", err);
        return err;
    }
    set_power_up_success_led();
    err = run_example(dac);
    if (NO_OS_IS_ERR_VALUE(err)) {
        pr_debug("Example failed with code: %d\n", err);
        return err;
    }
    ad3552r_remove(dac);
    return 0;
}