
AD7768-1 MBED IIO Application Example
Dependencies: platform_drivers
Diff: app/ad77681_data_capture.c
- Revision:
- 1:c0429edee15b
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/app/ad77681_data_capture.c Fri Sep 24 18:39:34 2021 +0800 @@ -0,0 +1,171 @@ +/***************************************************************************//** + * @file ad77681_data_capture.c + * @brief Data capture interface for AD7768-1 IIO application + * @details This module handles the AD7768-1 data capturing +******************************************************************************** + * Copyright (c) 2021 Analog Devices, Inc. + * + * All rights reserved. + * + * This software is proprietary to Analog Devices, Inc. and its licensors. + * By using this software you agree to the terms of the associated + * Analog Devices Software License Agreement. +*******************************************************************************/ + +/******************************************************************************/ +/***************************** Include Files **********************************/ +/******************************************************************************/ + +#include <string.h> +#include <stdlib.h> + +#include "app_config.h" +#include "ad77681_iio.h" +#include "ad77681_data_capture.h" +#include "adc_data_capture.h" +#include "error.h" + +/******************************************************************************/ +/********************** Macros and Constants Definition ***********************/ +/******************************************************************************/ + +/* AD77681 ADC Resolution */ +#define AD77681_ADC_RESOLUTION 24 +/* AD77681 Buffer Length */ +#define AD77681_SAMPLE_DATA_BUFF_LEN 6 +/* AD77681 24 Bits Sign Extension Value */ +#define AD77681_24_BITS_SIGN_EXTENSION 0xFFFFFF +/* AD77681 2 Bytes Shift Value */ +#define AD77681_2_BYTES_SHIFT 16 +/* AD77681 1 Byte Shift Value */ +#define AD77681_1_BYTE_SHIFT 8 + +/******************************************************************************/ +/********************** Variables and User Defined Data Types *****************/ +/******************************************************************************/ + +/******************************************************************************/ +/************************ Functions Declarations ******************************/ +/******************************************************************************/ + +/* Perform single sample read pre-operations */ +static int32_t ad77681_single_sample_read_start_ops(uint8_t input_chn); +/* Perform continuous sample read pre-operations */ +static int32_t ad77681_continuous_sample_read_start_ops(uint32_t chn_mask); +/* Perform conversion on input channel and read single conversion sample */ +static int32_t ad77681_perform_conv_and_read_sample(uint32_t *read_adc_data, + uint8_t chn); +/* Read ADC sampled/conversion data */ +static int32_t ad77681_read_converted_sample(uint32_t *adc_raw, uint8_t chn_indx); + +/* Define the variable for data_capture_ops structure */ +struct data_capture_ops data_capture_ops = { + /* Point AD77681 data capture functions to generic ADC data capture functions */ + .single_sample_read_start_ops = ad77681_single_sample_read_start_ops, + .perform_conv_and_read_sample = ad77681_perform_conv_and_read_sample, + .single_sample_read_stop_ops = NULL, + .continuous_sample_read_start_ops = ad77681_continuous_sample_read_start_ops, + .read_converted_sample = ad77681_read_converted_sample, + .continuous_sample_read_stop_ops = NULL, + .trigger_next_conversion = NULL, +}; + +/******************************************************************************/ +/************************ Functions Definitions *******************************/ +/******************************************************************************/ + +/*! + * @brief Perform the operations required before starting continuous sample read + * @param input_chn[out] - ADC input channel + * @return SUCCESS in case of success, FAILURE otherwise + */ +int32_t ad77681_single_sample_read_start_ops(uint8_t input_chn) +{ + + int32_t single_read_sts = FAILURE; + + single_read_sts = ad77681_set_conv_mode + ( + p_ad77681_dev_inst, + AD77681_CONV_SINGLE, + AD77681_AIN_SHORT, + false + ); + + return single_read_sts; +} + +/*! + * @brief Perform the operations required before starting continuous sample read + * @param chn_mask[in] - holds the list of all active channels set from IIO client for data capturing + * @return SUCCESS in case of success, FAILURE otherwise + */ +int32_t ad77681_continuous_sample_read_start_ops(uint32_t chn_mask) +{ + int32_t cont_read_sts = FAILURE; + + cont_read_sts = ad77681_set_conv_mode + ( + p_ad77681_dev_inst, + AD77681_CONV_CONTINUOUS, + AD77681_AIN_SHORT, + false + ); + + return cont_read_sts; +} + +/*! + * @brief Read ADC raw data for recently sampled channel + * @param adc_raw[out] - Pointer to adc data read variable + * @param chn_indx[in] - Channel for which data is to read + * @return SUCCESS in case of success, FAILURE otherwise + * @note This function is intended to call from the conversion end trigger + * event. Therefore, this function should just read raw ADC data + * without further monitoring conversion end event + */ +int32_t ad77681_read_converted_sample(uint32_t *adc_raw, uint8_t chn_indx) +{ + uint32_t ad77681_sample_data = 0; + uint8_t ad77681_sample_data_buff[AD77681_SAMPLE_DATA_BUFF_LEN] = { 0, 0, 0, 0, 0, 0 }; + + if (!adc_raw) { + return FAILURE; + } + + if (ad77681_spi_read_adc_data(p_ad77681_dev_inst, ad77681_sample_data_buff, + AD77681_REGISTER_DATA_READ) != SUCCESS) { + return FAILURE; + } + + ad77681_sample_data = (uint32_t) + ( + (ad77681_sample_data_buff[1] << AD77681_2_BYTES_SHIFT) | + (ad77681_sample_data_buff[2] << AD77681_1_BYTE_SHIFT ) | + (ad77681_sample_data_buff[3]) + ); + *adc_raw = ad77681_sample_data & AD77681_24_BITS_SIGN_EXTENSION; + + return SUCCESS; +} + +/*! + * @brief Read ADC single sample data + * @param read_adc_data[out] - Pointer to adc data read variable + * @param chn[in] - Channel for which data is to read + * @return SUCCESS in case of success, FAILURE otherwise + * @details This function performs the sampling on previously active channel + * and then read conversion result + */ +int32_t ad77681_perform_conv_and_read_sample(uint32_t *read_adc_data, + uint8_t chn) +{ + uint32_t ad77681_sample_data = 0; + + if (ad77681_read_converted_sample(&ad77681_sample_data, 0) != SUCCESS) { + return FAILURE; + } + *read_adc_data = ad77681_sample_data; + + return SUCCESS; +}