Example program for EVAL-AD4696.
Dependencies: platform_drivers
app/ad4696_data_capture.c@1:edd760d6380f, 2021-09-30 (annotated)
- 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?
User | Revision | Line number | New 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 | } |