Example program for EVAL-AD4696.

Dependencies:   platform_drivers

Committer:
Kjansen
Date:
Thu Sep 30 11:58:20 2021 +0100
Revision:
1:edd760d6380f
AD4696 IIO Application- Initial Revision

Who changed what in which revision?

UserRevisionLine numberNew contents of line
Kjansen 1:edd760d6380f 1 /***************************************************************************//**
Kjansen 1:edd760d6380f 2 * @file ad4696_data_capture.c
Kjansen 1:edd760d6380f 3 * @brief Data capture interface for AD4696 IIO application
Kjansen 1:edd760d6380f 4 * @details This module handles the AD4696 data capturing for IIO client
Kjansen 1:edd760d6380f 5 ********************************************************************************
Kjansen 1:edd760d6380f 6 * Copyright (c) 2021 Analog Devices, Inc.
Kjansen 1:edd760d6380f 7 * All rights reserved.
Kjansen 1:edd760d6380f 8 *
Kjansen 1:edd760d6380f 9 * This software is proprietary to Analog Devices, Inc. and its licensors.
Kjansen 1:edd760d6380f 10 * By using this software you agree to the terms of the associated
Kjansen 1:edd760d6380f 11 * Analog Devices Software License Agreement.
Kjansen 1:edd760d6380f 12 *******************************************************************************/
Kjansen 1:edd760d6380f 13
Kjansen 1:edd760d6380f 14 /******************************************************************************/
Kjansen 1:edd760d6380f 15 /***************************** Include Files **********************************/
Kjansen 1:edd760d6380f 16 /******************************************************************************/
Kjansen 1:edd760d6380f 17
Kjansen 1:edd760d6380f 18 #include <string.h>
Kjansen 1:edd760d6380f 19 #include <stdlib.h>
Kjansen 1:edd760d6380f 20
Kjansen 1:edd760d6380f 21 #include "app_config.h"
Kjansen 1:edd760d6380f 22 #include "iio_ad4696.h"
Kjansen 1:edd760d6380f 23 #include "ad4696_data_capture.h"
Kjansen 1:edd760d6380f 24 #include "adc_data_capture.h"
Kjansen 1:edd760d6380f 25 #include "error.h"
Kjansen 1:edd760d6380f 26 #include "gpio.h"
Kjansen 1:edd760d6380f 27 #include "util.h"
Kjansen 1:edd760d6380f 28 #include "pwm.h"
Kjansen 1:edd760d6380f 29 #include "ad4696_support.h"
Kjansen 1:edd760d6380f 30
Kjansen 1:edd760d6380f 31 /******************************************************************************/
Kjansen 1:edd760d6380f 32 /********************** Macros and Constants Definition ***********************/
Kjansen 1:edd760d6380f 33 /******************************************************************************/
Kjansen 1:edd760d6380f 34 /* Note: Timeout is dependent upon MCU clock frequency and tested for SDP-K1
Kjansen 1:edd760d6380f 35 * Mbed platform
Kjansen 1:edd760d6380f 36 * */
Kjansen 1:edd760d6380f 37 #define BSY_CHECK_TIMEOUT 1000
Kjansen 1:edd760d6380f 38
Kjansen 1:edd760d6380f 39 /******************************************************************************/
Kjansen 1:edd760d6380f 40 /********************** Variables and User Defined Data Types *****************/
Kjansen 1:edd760d6380f 41 /******************************************************************************/
Kjansen 1:edd760d6380f 42 /* Flag to mark the start of continuous read event */
Kjansen 1:edd760d6380f 43 static volatile bool continuous_data_read = false;
Kjansen 1:edd760d6380f 44 /* Previously active channels */
Kjansen 1:edd760d6380f 45 static uint32_t ad4696_prev_active_chns = 0;
Kjansen 1:edd760d6380f 46
Kjansen 1:edd760d6380f 47 /******************************************************************************/
Kjansen 1:edd760d6380f 48 /************************ Functions Declarations ******************************/
Kjansen 1:edd760d6380f 49 /******************************************************************************/
Kjansen 1:edd760d6380f 50
Kjansen 1:edd760d6380f 51 /* Save the previous active channels value */
Kjansen 1:edd760d6380f 52 static int32_t ad4696_save_prev_active_chns(void);
Kjansen 1:edd760d6380f 53 /* Restore (enable) the previous active channels */
Kjansen 1:edd760d6380f 54 static int32_t ad4696_restore_prev_active_chns(void);
Kjansen 1:edd760d6380f 55 /* Enable ADC current (user input) channel */
Kjansen 1:edd760d6380f 56 static int32_t ad4696_enable_curr_chn(uint8_t chn);
Kjansen 1:edd760d6380f 57 /* Enable ADC channels according to channel mask*/
Kjansen 1:edd760d6380f 58 static int32_t ad4696_enable_channel_mask(uint32_t chn_msk);
Kjansen 1:edd760d6380f 59 /* Disable ADC current (user input) channel */
Kjansen 1:edd760d6380f 60 static int32_t ad4696_disable_curr_chn(uint8_t chn);
Kjansen 1:edd760d6380f 61 /* Disable all ADC channels */
Kjansen 1:edd760d6380f 62 static int32_t ad4696_disable_all_chns(void);
Kjansen 1:edd760d6380f 63 /* Enable conversion for single sample read */
Kjansen 1:edd760d6380f 64 static int32_t ad4696_single_sample_read_start_ops(uint8_t input_chn);
Kjansen 1:edd760d6380f 65 /* Enable conversion for continuous sample read */
Kjansen 1:edd760d6380f 66 static int32_t ad4696_enable_continuous_read_conversion(uint32_t ch_mask);
Kjansen 1:edd760d6380f 67 /* Disable conversion */
Kjansen 1:edd760d6380f 68 static int32_t ad4696_continuous_sample_read_stop_ops(void);
Kjansen 1:edd760d6380f 69 /* Wait for conversion to finish on enabled channels and read conversion data */
Kjansen 1:edd760d6380f 70 static int32_t ad4696_perform_conv_and_read_sample(uint32_t *adc_data);
Kjansen 1:edd760d6380f 71 /* Read ADC raw sample/data */
Kjansen 1:edd760d6380f 72 static int32_t ad4696_read_converted_sample(uint32_t *adc_data);
Kjansen 1:edd760d6380f 73 /* Monitor end of conversion event */
Kjansen 1:edd760d6380f 74 static int32_t ad4696_end_of_conversion_check(void);
Kjansen 1:edd760d6380f 75
Kjansen 1:edd760d6380f 76 /* Define the variable for data_capture_ops structure */
Kjansen 1:edd760d6380f 77 struct data_capture_ops data_capture_ops = {
Kjansen 1:edd760d6380f 78 /* Point ad7134 data capture functions to generic ADC data capture functions */
Kjansen 1:edd760d6380f 79 .single_sample_read_start_ops = ad4696_single_sample_read_start_ops,
Kjansen 1:edd760d6380f 80 .perform_conv_and_read_sample = ad4696_perform_conv_and_read_sample,
Kjansen 1:edd760d6380f 81 .single_sample_read_stop_ops = ad4696_continuous_sample_read_stop_ops,
Kjansen 1:edd760d6380f 82 .continuous_sample_read_start_ops = ad4696_enable_continuous_read_conversion,
Kjansen 1:edd760d6380f 83 .read_converted_sample = ad4696_read_converted_sample,
Kjansen 1:edd760d6380f 84 .continuous_sample_read_stop_ops = ad4696_continuous_sample_read_stop_ops,
Kjansen 1:edd760d6380f 85 .trigger_next_conversion = NULL
Kjansen 1:edd760d6380f 86 };
Kjansen 1:edd760d6380f 87
Kjansen 1:edd760d6380f 88 /******************************************************************************/
Kjansen 1:edd760d6380f 89 /************************ Functions Definitions *******************************/
Kjansen 1:edd760d6380f 90 /******************************************************************************/
Kjansen 1:edd760d6380f 91
Kjansen 1:edd760d6380f 92 /*!
Kjansen 1:edd760d6380f 93 * @brief Save the previous active channels
Kjansen 1:edd760d6380f 94 * @return SUCCESS in case of success, FAILURE otherwise
Kjansen 1:edd760d6380f 95 */
Kjansen 1:edd760d6380f 96 static int32_t ad4696_save_prev_active_chns(void)
Kjansen 1:edd760d6380f 97 {
Kjansen 1:edd760d6380f 98 uint8_t data;
Kjansen 1:edd760d6380f 99 /* Read the upper byte of the standard sequencer configuration register*/
Kjansen 1:edd760d6380f 100 if (ad469x_spi_reg_read(p_ad4696_dev, AD469x_REG_SEQ_UB, &data) != SUCCESS) {
Kjansen 1:edd760d6380f 101 return FAILURE;
Kjansen 1:edd760d6380f 102 }
Kjansen 1:edd760d6380f 103
Kjansen 1:edd760d6380f 104 /* The upper byte channel configuration is saved to the variable and is
Kjansen 1:edd760d6380f 105 * shifted by 8 bits to save the lower byte register configuration */
Kjansen 1:edd760d6380f 106 ad4696_prev_active_chns = data;
Kjansen 1:edd760d6380f 107 ad4696_prev_active_chns <<= 8;
Kjansen 1:edd760d6380f 108
Kjansen 1:edd760d6380f 109 /* Reads the lower byte of the standard sequencer configuration register*/
Kjansen 1:edd760d6380f 110 if (ad469x_spi_reg_read(p_ad4696_dev, AD469x_REG_SEQ_LB, &data) != SUCCESS) {
Kjansen 1:edd760d6380f 111 return FAILURE;
Kjansen 1:edd760d6380f 112 }
Kjansen 1:edd760d6380f 113 ad4696_prev_active_chns |= data;
Kjansen 1:edd760d6380f 114
Kjansen 1:edd760d6380f 115 return SUCCESS;
Kjansen 1:edd760d6380f 116 }
Kjansen 1:edd760d6380f 117
Kjansen 1:edd760d6380f 118 /*!
Kjansen 1:edd760d6380f 119 * @brief Restore (re-enable) the previous active channels
Kjansen 1:edd760d6380f 120 * @return SUCCESS in case of success, FAILURE otherwise
Kjansen 1:edd760d6380f 121 */
Kjansen 1:edd760d6380f 122 static int32_t ad4696_restore_prev_active_chns(void)
Kjansen 1:edd760d6380f 123 {
Kjansen 1:edd760d6380f 124 if (ad469x_exit_conversion_mode(p_ad4696_dev) != SUCCESS)
Kjansen 1:edd760d6380f 125 return FAILURE;
Kjansen 1:edd760d6380f 126
Kjansen 1:edd760d6380f 127 /* Configure the lower byte of the standard sequencer configuration register*/
Kjansen 1:edd760d6380f 128 if (ad469x_spi_reg_write(p_ad4696_dev,
Kjansen 1:edd760d6380f 129 AD469x_REG_SEQ_LB,
Kjansen 1:edd760d6380f 130 AD469x_SEQ_LB_CONFIG(ad4696_prev_active_chns)) != SUCCESS) {
Kjansen 1:edd760d6380f 131 return FAILURE;
Kjansen 1:edd760d6380f 132 }
Kjansen 1:edd760d6380f 133
Kjansen 1:edd760d6380f 134 /* Configure the upper byte of the standard sequencer configuration register*/
Kjansen 1:edd760d6380f 135 if (ad469x_spi_reg_write(p_ad4696_dev,
Kjansen 1:edd760d6380f 136 AD469x_REG_SEQ_UB,
Kjansen 1:edd760d6380f 137 AD469x_SEQ_UB_CONFIG(ad4696_prev_active_chns)) != SUCCESS) {
Kjansen 1:edd760d6380f 138 return FAILURE;
Kjansen 1:edd760d6380f 139 }
Kjansen 1:edd760d6380f 140
Kjansen 1:edd760d6380f 141 return SUCCESS;
Kjansen 1:edd760d6380f 142 }
Kjansen 1:edd760d6380f 143
Kjansen 1:edd760d6380f 144 /*!
Kjansen 1:edd760d6380f 145 * @brief Disable all active channels
Kjansen 1:edd760d6380f 146 * @return SUCCESS in case of success, FAILURE otherwise
Kjansen 1:edd760d6380f 147 */
Kjansen 1:edd760d6380f 148 static int32_t ad4696_disable_all_chns(void)
Kjansen 1:edd760d6380f 149 {
Kjansen 1:edd760d6380f 150 /* Reset the lower byte of the standard sequencer configuration register*/
Kjansen 1:edd760d6380f 151 if (ad469x_spi_reg_write(p_ad4696_dev,
Kjansen 1:edd760d6380f 152 AD469x_REG_SEQ_LB,
Kjansen 1:edd760d6380f 153 AD469x_SEQ_CHANNELS_RESET) != SUCCESS) {
Kjansen 1:edd760d6380f 154 return FAILURE;
Kjansen 1:edd760d6380f 155 }
Kjansen 1:edd760d6380f 156
Kjansen 1:edd760d6380f 157 /* Reset the upper byte of the standard sequencer configuration register*/
Kjansen 1:edd760d6380f 158 if (ad469x_spi_reg_write(p_ad4696_dev,
Kjansen 1:edd760d6380f 159 AD469x_REG_SEQ_UB,
Kjansen 1:edd760d6380f 160 AD469x_SEQ_CHANNELS_RESET) != SUCCESS) {
Kjansen 1:edd760d6380f 161 return FAILURE;
Kjansen 1:edd760d6380f 162 }
Kjansen 1:edd760d6380f 163
Kjansen 1:edd760d6380f 164 return SUCCESS;
Kjansen 1:edd760d6380f 165 }
Kjansen 1:edd760d6380f 166
Kjansen 1:edd760d6380f 167 /*!
Kjansen 1:edd760d6380f 168 * @brief Enable input channel
Kjansen 1:edd760d6380f 169 * @param chn[in] - Channel to enable
Kjansen 1:edd760d6380f 170 * @return SUCCESS in case of success, FAILURE otherwise
Kjansen 1:edd760d6380f 171 */
Kjansen 1:edd760d6380f 172 static int32_t ad4696_enable_curr_chn(uint8_t chn)
Kjansen 1:edd760d6380f 173 {
Kjansen 1:edd760d6380f 174 /* If channel number is less than 8, then write to
Kjansen 1:edd760d6380f 175 * lower byte configuration register or else write
Kjansen 1:edd760d6380f 176 * to upper byte configuration register
Kjansen 1:edd760d6380f 177 * */
Kjansen 1:edd760d6380f 178 if (chn < (NO_OF_CHANNELS / 2)) {
Kjansen 1:edd760d6380f 179 if (ad469x_spi_write_mask(p_ad4696_dev,
Kjansen 1:edd760d6380f 180 AD469x_REG_SEQ_LB,
Kjansen 1:edd760d6380f 181 AD469x_SEQ_CHANNELS_RESET,
Kjansen 1:edd760d6380f 182 AD469x_SINGLE_CHANNEL_EN(chn)) != SUCCESS) {
Kjansen 1:edd760d6380f 183 return FAILURE;
Kjansen 1:edd760d6380f 184 }
Kjansen 1:edd760d6380f 185 }
Kjansen 1:edd760d6380f 186 else {
Kjansen 1:edd760d6380f 187 if (ad469x_spi_write_mask(p_ad4696_dev,
Kjansen 1:edd760d6380f 188 AD469x_REG_SEQ_UB,
Kjansen 1:edd760d6380f 189 AD469x_SEQ_CHANNELS_RESET,
Kjansen 1:edd760d6380f 190 AD469x_SINGLE_CHANNEL_EN(chn - 8)) != SUCCESS) {
Kjansen 1:edd760d6380f 191 return FAILURE;
Kjansen 1:edd760d6380f 192 }
Kjansen 1:edd760d6380f 193 }
Kjansen 1:edd760d6380f 194
Kjansen 1:edd760d6380f 195 return SUCCESS;
Kjansen 1:edd760d6380f 196 }
Kjansen 1:edd760d6380f 197
Kjansen 1:edd760d6380f 198 /*!
Kjansen 1:edd760d6380f 199 * @brief Enable input channels according to the mask
Kjansen 1:edd760d6380f 200 * @param chn_msk[in] - Mask containing channels to be enabled
Kjansen 1:edd760d6380f 201 * @return SUCCESS in case of success, FAILURE otherwise
Kjansen 1:edd760d6380f 202 */
Kjansen 1:edd760d6380f 203 static int32_t ad4696_enable_channel_mask(uint32_t chn_msk)
Kjansen 1:edd760d6380f 204 {
Kjansen 1:edd760d6380f 205 /* Write the lower byte of the channel mask to the lower byte
Kjansen 1:edd760d6380f 206 * of the standard sequencer configuration register
Kjansen 1:edd760d6380f 207 * */
Kjansen 1:edd760d6380f 208 if (ad469x_spi_reg_write(p_ad4696_dev,
Kjansen 1:edd760d6380f 209 AD469x_REG_SEQ_LB,
Kjansen 1:edd760d6380f 210 AD469x_SEQ_LB_CONFIG(chn_msk)) != SUCCESS) {
Kjansen 1:edd760d6380f 211 return FAILURE;
Kjansen 1:edd760d6380f 212 }
Kjansen 1:edd760d6380f 213
Kjansen 1:edd760d6380f 214 /* Write the upper byte of the channel mask to the upper byte
Kjansen 1:edd760d6380f 215 * of the standard sequencer configuration register
Kjansen 1:edd760d6380f 216 * */
Kjansen 1:edd760d6380f 217 if (ad469x_spi_reg_write(p_ad4696_dev,
Kjansen 1:edd760d6380f 218 AD469x_REG_SEQ_UB,
Kjansen 1:edd760d6380f 219 AD469x_SEQ_UB_CONFIG(chn_msk)) != SUCCESS) {
Kjansen 1:edd760d6380f 220 return FAILURE;
Kjansen 1:edd760d6380f 221 }
Kjansen 1:edd760d6380f 222
Kjansen 1:edd760d6380f 223 return SUCCESS;
Kjansen 1:edd760d6380f 224 }
Kjansen 1:edd760d6380f 225
Kjansen 1:edd760d6380f 226 /*!
Kjansen 1:edd760d6380f 227 * @brief Disable input channel
Kjansen 1:edd760d6380f 228 * @param chn[in] - Channel to disable
Kjansen 1:edd760d6380f 229 * @return SUCCESS in case of success, FAILURE otherwise
Kjansen 1:edd760d6380f 230 */
Kjansen 1:edd760d6380f 231 static int32_t ad4696_disable_curr_chn(uint8_t chn)
Kjansen 1:edd760d6380f 232 {
Kjansen 1:edd760d6380f 233 /* If channel number is less than 8, then write
Kjansen 1:edd760d6380f 234 * to lower byte configuration register or else
Kjansen 1:edd760d6380f 235 * write to upper byte configuration register
Kjansen 1:edd760d6380f 236 * */
Kjansen 1:edd760d6380f 237 if (chn < (NO_OF_CHANNELS/2)) {
Kjansen 1:edd760d6380f 238 if (ad469x_spi_write_mask(p_ad4696_dev,
Kjansen 1:edd760d6380f 239 AD469x_REG_SEQ_LB,
Kjansen 1:edd760d6380f 240 AD469x_SINGLE_CHANNEL_EN(chn),
Kjansen 1:edd760d6380f 241 AD469x_SEQ_CHANNEL_DI) != SUCCESS) {
Kjansen 1:edd760d6380f 242 return FAILURE;
Kjansen 1:edd760d6380f 243 }
Kjansen 1:edd760d6380f 244 }
Kjansen 1:edd760d6380f 245 else {
Kjansen 1:edd760d6380f 246 if (ad469x_spi_write_mask(p_ad4696_dev,
Kjansen 1:edd760d6380f 247 AD469x_REG_SEQ_UB,
Kjansen 1:edd760d6380f 248 AD469x_SINGLE_CHANNEL_EN(chn - 8),
Kjansen 1:edd760d6380f 249 AD469x_SEQ_CHANNEL_DI) != SUCCESS) {
Kjansen 1:edd760d6380f 250 return FAILURE;
Kjansen 1:edd760d6380f 251 }
Kjansen 1:edd760d6380f 252 }
Kjansen 1:edd760d6380f 253
Kjansen 1:edd760d6380f 254 return SUCCESS;
Kjansen 1:edd760d6380f 255 }
Kjansen 1:edd760d6380f 256
Kjansen 1:edd760d6380f 257 /*!
Kjansen 1:edd760d6380f 258 * @brief Enable conversion for single data read
Kjansen 1:edd760d6380f 259 * @param input_chn[in] - Channel to be enabled
Kjansen 1:edd760d6380f 260 * @return SUCCESS in case of success, FAILURE otherwise
Kjansen 1:edd760d6380f 261 */
Kjansen 1:edd760d6380f 262 static int32_t ad4696_single_sample_read_start_ops(uint8_t input_chn)
Kjansen 1:edd760d6380f 263 {
Kjansen 1:edd760d6380f 264 do {
Kjansen 1:edd760d6380f 265 /* Save previously active channels */
Kjansen 1:edd760d6380f 266 if (ad4696_save_prev_active_chns() != SUCCESS) {
Kjansen 1:edd760d6380f 267 break;
Kjansen 1:edd760d6380f 268 }
Kjansen 1:edd760d6380f 269
Kjansen 1:edd760d6380f 270 /* Disable all channels */
Kjansen 1:edd760d6380f 271 if (ad4696_disable_all_chns() != SUCCESS) {
Kjansen 1:edd760d6380f 272 break;
Kjansen 1:edd760d6380f 273 }
Kjansen 1:edd760d6380f 274
Kjansen 1:edd760d6380f 275 /* Enable user input channel */
Kjansen 1:edd760d6380f 276 if (ad4696_enable_curr_chn(input_chn) != SUCCESS) {
Kjansen 1:edd760d6380f 277 break;
Kjansen 1:edd760d6380f 278 }
Kjansen 1:edd760d6380f 279
Kjansen 1:edd760d6380f 280 /* Enter into conversion mode */
Kjansen 1:edd760d6380f 281 if (ad469x_enter_conversion_mode(p_ad4696_dev) != SUCCESS) {
Kjansen 1:edd760d6380f 282 break;
Kjansen 1:edd760d6380f 283 }
Kjansen 1:edd760d6380f 284
Kjansen 1:edd760d6380f 285 return SUCCESS;
Kjansen 1:edd760d6380f 286 } while (0);
Kjansen 1:edd760d6380f 287
Kjansen 1:edd760d6380f 288 return FAILURE;
Kjansen 1:edd760d6380f 289 }
Kjansen 1:edd760d6380f 290
Kjansen 1:edd760d6380f 291 /*!
Kjansen 1:edd760d6380f 292 * @brief Enable conversion for continuous (sequencing) data read
Kjansen 1:edd760d6380f 293 * @param ch_mask[in] - Mask containing channels to be enabled
Kjansen 1:edd760d6380f 294 * @return SUCCESS in case of success, FAILURE otherwise
Kjansen 1:edd760d6380f 295 */
Kjansen 1:edd760d6380f 296 static int32_t ad4696_enable_continuous_read_conversion(uint32_t ch_mask)
Kjansen 1:edd760d6380f 297 {
Kjansen 1:edd760d6380f 298 do {
Kjansen 1:edd760d6380f 299 /* Save previously active channels */
Kjansen 1:edd760d6380f 300 if (ad4696_save_prev_active_chns() != SUCCESS) {
Kjansen 1:edd760d6380f 301 break;
Kjansen 1:edd760d6380f 302 }
Kjansen 1:edd760d6380f 303
Kjansen 1:edd760d6380f 304 /* Disable all channels */
Kjansen 1:edd760d6380f 305 if (ad4696_disable_all_chns() != SUCCESS) {
Kjansen 1:edd760d6380f 306 break;
Kjansen 1:edd760d6380f 307 }
Kjansen 1:edd760d6380f 308
Kjansen 1:edd760d6380f 309 /* Enable user input channels */
Kjansen 1:edd760d6380f 310 if (ad4696_enable_channel_mask(ch_mask) != SUCCESS) {
Kjansen 1:edd760d6380f 311 break;
Kjansen 1:edd760d6380f 312 }
Kjansen 1:edd760d6380f 313
Kjansen 1:edd760d6380f 314 /* Start Generating PWM signal */
Kjansen 1:edd760d6380f 315 if (pwm_enable(pwm_desc) != SUCCESS) {
Kjansen 1:edd760d6380f 316 break;
Kjansen 1:edd760d6380f 317 }
Kjansen 1:edd760d6380f 318
Kjansen 1:edd760d6380f 319 continuous_data_read = true;
Kjansen 1:edd760d6380f 320 /* Enter into conversion mode */
Kjansen 1:edd760d6380f 321 if (ad469x_enter_conversion_mode(p_ad4696_dev) != SUCCESS) {
Kjansen 1:edd760d6380f 322 break;
Kjansen 1:edd760d6380f 323 }
Kjansen 1:edd760d6380f 324
Kjansen 1:edd760d6380f 325 return SUCCESS;
Kjansen 1:edd760d6380f 326 } while (0);
Kjansen 1:edd760d6380f 327
Kjansen 1:edd760d6380f 328 return FAILURE;
Kjansen 1:edd760d6380f 329 }
Kjansen 1:edd760d6380f 330
Kjansen 1:edd760d6380f 331 /*!
Kjansen 1:edd760d6380f 332 * @brief Disable ADC conversion
Kjansen 1:edd760d6380f 333 * @return SUCCESS in case of success, FAILURE otherwise
Kjansen 1:edd760d6380f 334 */
Kjansen 1:edd760d6380f 335 static int32_t ad4696_continuous_sample_read_stop_ops(void)
Kjansen 1:edd760d6380f 336 {
Kjansen 1:edd760d6380f 337 if (continuous_data_read) {
Kjansen 1:edd760d6380f 338 /* Stop Generating PWM signal */
Kjansen 1:edd760d6380f 339 if (pwm_disable(pwm_desc) != SUCCESS) {
Kjansen 1:edd760d6380f 340 return FAILURE;
Kjansen 1:edd760d6380f 341 }
Kjansen 1:edd760d6380f 342 }
Kjansen 1:edd760d6380f 343
Kjansen 1:edd760d6380f 344 /* Enter into register mode or exit from conversion mode */
Kjansen 1:edd760d6380f 345 if (ad469x_exit_conversion_mode(p_ad4696_dev) != SUCCESS) {
Kjansen 1:edd760d6380f 346 return FAILURE;
Kjansen 1:edd760d6380f 347 }
Kjansen 1:edd760d6380f 348
Kjansen 1:edd760d6380f 349 /* Enable back channels which were disabled prior to conversion start*/
Kjansen 1:edd760d6380f 350 if (ad4696_restore_prev_active_chns() != SUCCESS) {
Kjansen 1:edd760d6380f 351 return FAILURE;
Kjansen 1:edd760d6380f 352 }
Kjansen 1:edd760d6380f 353
Kjansen 1:edd760d6380f 354 continuous_data_read = false;
Kjansen 1:edd760d6380f 355 return SUCCESS;
Kjansen 1:edd760d6380f 356 }
Kjansen 1:edd760d6380f 357
Kjansen 1:edd760d6380f 358 /*!
Kjansen 1:edd760d6380f 359 * @brief Read ADC raw data for recently sampled channel
Kjansen 1:edd760d6380f 360 * @param adc_raw[out] - Pointer to adc data read variable
Kjansen 1:edd760d6380f 361 * @return SUCCESS in case of success, FAILURE otherwise
Kjansen 1:edd760d6380f 362 * @note This function is intended to call from the conversion end trigger
Kjansen 1:edd760d6380f 363 * event. Therefore, this function should just read raw ADC data
Kjansen 1:edd760d6380f 364 * without further monitoring conversion end event
Kjansen 1:edd760d6380f 365 */
Kjansen 1:edd760d6380f 366 static int32_t ad4696_read_converted_sample(uint32_t *adc_raw)
Kjansen 1:edd760d6380f 367 {
Kjansen 1:edd760d6380f 368 /* Null Check */
Kjansen 1:edd760d6380f 369 if (!adc_raw) {
Kjansen 1:edd760d6380f 370 return FAILURE;
Kjansen 1:edd760d6380f 371 }
Kjansen 1:edd760d6380f 372
Kjansen 1:edd760d6380f 373 /* Read the converted ADC raw data and return the transaction result*/
Kjansen 1:edd760d6380f 374 return ad469x_read_data(p_ad4696_dev, 0, adc_raw, 1);
Kjansen 1:edd760d6380f 375 }
Kjansen 1:edd760d6380f 376
Kjansen 1:edd760d6380f 377 /*!
Kjansen 1:edd760d6380f 378 * @brief Read ADC single sample data
Kjansen 1:edd760d6380f 379 * @param read_adc_data[out] - Pointer to adc data read variable
Kjansen 1:edd760d6380f 380 * @return SUCCESS in case of success, FAILURE otherwise
Kjansen 1:edd760d6380f 381 * @details This function performs the sampling on previously active channels
Kjansen 1:edd760d6380f 382 * and then reads conversion result
Kjansen 1:edd760d6380f 383 */
Kjansen 1:edd760d6380f 384 static int32_t ad4696_perform_conv_and_read_sample(uint32_t *read_adc_data)
Kjansen 1:edd760d6380f 385 {
Kjansen 1:edd760d6380f 386 uint32_t adc_raw = 0;
Kjansen 1:edd760d6380f 387
Kjansen 1:edd760d6380f 388 /* Read the converted ADC raw data */
Kjansen 1:edd760d6380f 389 if (ad469x_read_data(p_ad4696_dev, 1, &adc_raw, 1) != SUCCESS) {
Kjansen 1:edd760d6380f 390 return FAILURE;
Kjansen 1:edd760d6380f 391 }
Kjansen 1:edd760d6380f 392
Kjansen 1:edd760d6380f 393 *read_adc_data = adc_raw;
Kjansen 1:edd760d6380f 394 return SUCCESS;
Kjansen 1:edd760d6380f 395 }
Kjansen 1:edd760d6380f 396
Kjansen 1:edd760d6380f 397 /*!
Kjansen 1:edd760d6380f 398 * @brief Check for the end of conversion event
Kjansen 1:edd760d6380f 399 * @return SUCCESS in case of success, FAILURE otherwise
Kjansen 1:edd760d6380f 400 * @details This function monitors the state line for BSY pin
Kjansen 1:edd760d6380f 401 * until timeout is reached
Kjansen 1:edd760d6380f 402 */
Kjansen 1:edd760d6380f 403 static int32_t ad4696_end_of_conversion_check(void)
Kjansen 1:edd760d6380f 404 {
Kjansen 1:edd760d6380f 405 uint16_t timeout = (uint16_t)BSY_CHECK_TIMEOUT; /* time out counter */
Kjansen 1:edd760d6380f 406 uint8_t busy = GPIO_HIGH; /* GPIO initial state */
Kjansen 1:edd760d6380f 407
Kjansen 1:edd760d6380f 408 /* Check for BSY to go low */
Kjansen 1:edd760d6380f 409 while (busy == GPIO_HIGH) {
Kjansen 1:edd760d6380f 410 gpio_get_value(((struct ad469x_dev *)p_ad4696_dev)->gpio_busy, &busy);
Kjansen 1:edd760d6380f 411 timeout--;
Kjansen 1:edd760d6380f 412 if (!timeout) {
Kjansen 1:edd760d6380f 413 return FAILURE;
Kjansen 1:edd760d6380f 414 }
Kjansen 1:edd760d6380f 415 }
Kjansen 1:edd760d6380f 416
Kjansen 1:edd760d6380f 417 timeout = (uint16_t)BSY_CHECK_TIMEOUT;
Kjansen 1:edd760d6380f 418 /* Check for BSY pin to go high */
Kjansen 1:edd760d6380f 419 while (busy == GPIO_LOW) {
Kjansen 1:edd760d6380f 420 gpio_get_value(((struct ad469x_dev *)p_ad4696_dev)->gpio_busy, &busy);
Kjansen 1:edd760d6380f 421 timeout--;
Kjansen 1:edd760d6380f 422 if (!timeout) {
Kjansen 1:edd760d6380f 423 return FAILURE;
Kjansen 1:edd760d6380f 424 }
Kjansen 1:edd760d6380f 425 }
Kjansen 1:edd760d6380f 426
Kjansen 1:edd760d6380f 427 return SUCCESS;
Kjansen 1:edd760d6380f 428 }