1 /***************************************************************************//** 2 * \file cyhal_adc.h 3 * 4 * \brief 5 * Provides a high level interface for interacting with the Infineon Analog to 6 * Digital Converter. This interface abstracts out the chip specific details. 7 * If any chip specific functionality is necessary, or performance is critical 8 * the low level functions can be used directly. 9 * 10 ******************************************************************************** 11 * \copyright 12 * Copyright 2018-2021 Cypress Semiconductor Corporation (an Infineon company) or 13 * an affiliate of Cypress Semiconductor Corporation 14 * 15 * SPDX-License-Identifier: Apache-2.0 16 * 17 * Licensed under the Apache License, Version 2.0 (the "License"); 18 * you may not use this file except in compliance with the License. 19 * You may obtain a copy of the License at 20 * 21 * http://www.apache.org/licenses/LICENSE-2.0 22 * 23 * Unless required by applicable law or agreed to in writing, software 24 * distributed under the License is distributed on an "AS IS" BASIS, 25 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 26 * See the License for the specific language governing permissions and 27 * limitations under the License. 28 *******************************************************************************/ 29 30 /** 31 * \addtogroup group_hal_adc ADC (Analog to Digital Converter) 32 * \ingroup group_hal 33 * \{ 34 * High level interface for interacting with the analog to digital converter (ADC). 35 * 36 * \section cyhal_adc_features Features 37 * Each ADC instance supports one or more selectable channels, each 38 * of which can perform conversions on a different pin. 39 * See the device datasheet for details about which pins support ADC conversion. 40 * 41 * Both single-ended and differential channels are supported. The values returned 42 * by the read API are relative to the ADC's voltage range, which is device specific. 43 * See the BSP documentation for details. 44 * 45 * \section cyhal_adc_quickstart Quickstart 46 * Call \ref cyhal_adc_init to initialize an ADC instance by providing the ADC 47 * object (<b>obj</b>), input pin (<b>pin</b>) and clock (<b>clk</b>).<br> The input 48 * pin argument is just to signify which ADC instance to initialize. It does not 49 * actually reserve the pin or create an ADC channel for it. The clock parameter can 50 * be left NULL to use an available clock resource with a default frequency.<br> 51 * Use \ref cyhal_adc_channel_init_diff to initialize one or more channels associated 52 * with that instance.<br> 53 * Use \ref cyhal_adc_read for reading the results.<br> 54 * See \ref subsection_adc_snippet_1. 55 * 56 * \note \ref cyhal_adc_read_u16 always returns a 16 bit value in the range 57 * 0x0000-0xFFFF. If the underlying hardware does not support 16 bit resolution the 58 * value is scaled linearly to cover the full 16 bits. 59 * 60 * \section subsection_adc_snippets Code snippets 61 * \note Error checking is omitted for clarity 62 * \subsection subsection_adc_snippet_1 Snippet 1: Simple ADC initialization and reading conversion result 63 * The following snippet initializes an ADC and one channel. 64 * One ADC conversion result is returned corresponding to the input at the specified 65 * pin. 66 * \snippet hal_adc.c snippet_cyhal_adc_simple_init 67 * 68 * \subsection subsection_adc_snippet_2 Snippet 2: Multi-channel ADC initialization and reading conversion result 69 * The following snippet initializes an ADC with one single-ended channel and one differential channel 70 * \snippet hal_adc.c snippet_cyhal_adc_multi_init 71 * 72 * \subsection subsection_adc_snippet_3 Snippet 3: Asynchronously read multiple channels 73 * The following snippet illustrates how to asynchronously read multiple scans of multiple channels. 74 * \snippet hal_adc.c snippet_cyhal_adc_async_read 75 * 76 * \subsection subsection_adc_snippet_4 Snippet 4: Continuous scanning 77 * This snippet shows how to run the ADC in continuous mode and process results as each scan completes. 78 * \snippet hal_adc.c snippet_cyhal_adc_continuous_read 79 */ 80 81 #pragma once 82 83 #include <stdint.h> 84 #include <stdbool.h> 85 #include "cy_result.h" 86 #include "cyhal_hw_types.h" 87 #include "cyhal_gpio.h" 88 89 #if defined(__cplusplus) 90 extern "C" { 91 #endif 92 93 /** \addtogroup group_hal_results_adc ADC HAL Results 94 * ADC specific return codes 95 * \ingroup group_hal_results 96 * \{ *//** 97 */ 98 99 /** Bad argument */ 100 #define CYHAL_ADC_RSLT_BAD_ARGUMENT \ 101 (CY_RSLT_CREATE_EX(CY_RSLT_TYPE_ERROR, CY_RSLT_MODULE_ABSTRACTION_HAL, CYHAL_RSLT_MODULE_ADC, 0)) 102 /** Failed to initialize ADC clock */ 103 #define CYHAL_ADC_RSLT_FAILED_CLOCK \ 104 (CY_RSLT_CREATE_EX(CY_RSLT_TYPE_ERROR, CY_RSLT_MODULE_ABSTRACTION_HAL, CYHAL_RSLT_MODULE_ADC, 1)) 105 /** Failed to initialize ADC */ 106 #define CYHAL_ADC_RSLT_FAILED_INIT \ 107 (CY_RSLT_CREATE_EX(CY_RSLT_TYPE_ERROR, CY_RSLT_MODULE_ABSTRACTION_HAL, CYHAL_RSLT_MODULE_ADC, 2)) 108 /** No channels available */ 109 #define CYHAL_ADC_RSLT_NO_CHANNELS \ 110 (CY_RSLT_CREATE_EX(CY_RSLT_TYPE_ERROR, CY_RSLT_MODULE_ABSTRACTION_HAL, CYHAL_RSLT_MODULE_ADC, 3)) 111 112 /** 113 * \} 114 */ 115 116 /** Number of bits populated with meaningful data by each ADC sample */ 117 #define CYHAL_ADC_BITS 16 118 /** Maximum value that the ADC can return */ 119 #define CYHAL_ADC_MAX_VALUE ((1 << CYHAL_ADC_BITS) - 1) 120 121 /** Possible selections for ADC reference */ 122 typedef enum 123 { 124 CYHAL_ADC_REF_INTERNAL, //!< Internal reference. See the BSP documentation for the value of this reference. (Default) 125 CYHAL_ADC_REF_EXTERNAL, //!< Reference from external pin. 126 CYHAL_ADC_REF_VDDA, //!< Reference from VDDA (analog supply) 127 CYHAL_ADC_REF_VDDA_DIV_2, //!< Reference from VDDA (analog supply) divided by 2 128 } cyhal_adc_vref_t; 129 130 /** Vminus selection for single-ended channels */ 131 typedef enum 132 { 133 CYHAL_ADC_VNEG_VSSA, //!< Connect vminus to ground. 134 CYHAL_ADC_VNEG_VREF, //!< Connect vminus to the selected vref (see @ref cyhal_adc_vref_t) 135 } cyhal_adc_vneg_t; 136 137 /** ADC events */ 138 typedef enum 139 { 140 CYHAL_ADC_EOS = 1u, //!< End of scan: a scan of all channels has completed. Only applicable when continuously scanning 141 CYHAL_ADC_ASYNC_READ_COMPLETE = 2u, //!< An asynchronous read operation has completed. 142 } cyhal_adc_event_t; 143 144 /** Selections for ADC input signals */ 145 typedef enum 146 { 147 CYHAL_ADC_INPUT_START_SCAN, // !< Start a scan when a signal is received 148 } 149 cyhal_adc_input_t; 150 151 /** Selections for ADC output signals */ 152 typedef enum 153 { 154 CYHAL_ADC_OUTPUT_SCAN_COMPLETE, // !< An output signal should be triggered when a scan is complete 155 } 156 cyhal_adc_output_t; 157 158 /** Perform standard averaging. Divide the accumulated value by the number of samples. 159 * @note This is not supported in combination with @ref CYHAL_ADC_AVG_MODE_ACCUMULATE */ 160 #define CYHAL_ADC_AVG_MODE_AVERAGE (1u << 0) 161 /** Accumulate samples as in @ref CYHAL_ADC_AVG_MODE_AVERAGE, but do not divide by the number of samples */ 162 #define CYHAL_ADC_AVG_MODE_ACCUMULATE (1u << 1) 163 /** Average mode flag position indices shifted by greater than this are implementation specific. The value 164 * of this macro is subject to change between HAL versions. */ 165 #define CYHAL_ADC_AVG_MODE_MAX_SHIFT (1u) 166 167 /** Selects the default connection for the inverting input to achieve a single-ended channel. This connection 168 * is controlled by the `vneg` member of @ref cyhal_adc_config_t. 169 */ 170 #define CYHAL_ADC_VNEG CYHAL_NC_PIN_VALUE 171 172 /** ADC Configuration */ 173 typedef struct 174 { 175 /** Whether the ADC samples continuously (true) or only on demand (false). 176 * 177 * When configured to true, the ADC will immediately begin scanning all configured channels. 178 * When configured to false, the ADC will stop continuous scanning at the completion of the current scan 179 */ 180 bool continuous_scanning; 181 /** ADC resolution. See the implementation specific documentation for supported values */ 182 uint8_t resolution; 183 /** The number of samples that should be averaged together to obtain a result. A value of 1 disables averaging. */ 184 uint16_t average_count; 185 /** Flags to control the behavior of the averaging functionality when @ref average_count is greater than 1. 186 * This field contains zero or more flags that are OR'd together. All implementations define 187 * @ref CYHAL_ADC_AVG_MODE_AVERAGE and @ref CYHAL_ADC_AVG_MODE_ACCUMULATE (though some may not support both modes). 188 * Some implementations may define other flags to control additional aspects of the averaging functionality; see 189 * the implementation-specific documentation for details. 190 */ 191 uint32_t average_mode_flags; 192 /** The external voltage reference value, in millivolts. 193 * If vref is set to @ref CYHAL_ADC_REF_EXTERNAL, this must be nonzero. 194 * If vref is set to anything other than @ref CYHAL_ADC_REF_EXTERNAL, this must be zero. 195 */ 196 uint32_t ext_vref_mv; 197 /** Vminus selection for single-ended channels */ 198 cyhal_adc_vneg_t vneg; 199 /** ADC voltage reference */ 200 cyhal_adc_vref_t vref; 201 /** The GPIO that should be used for the external reference. If @ref CYHAL_ADC_REF_EXTERNAL 202 * is selected and the current target uses a GPIO for ADC ext_vref (see the BSP documentation), 203 * this must not be @ref NC. If the current target uses a dedicated pin (not a GPIO) for ADC ext_vref, 204 * or if any other reference is selected, this must be @ref NC. 205 */ 206 cyhal_gpio_t ext_vref; 207 /** Whether an external bypass capacitor should be used. Depending on the platform this may be required 208 * to reduce noise at sufficiently high sample rates. See the implementation specific documentation 209 * for details. 210 */ 211 bool is_bypassed; 212 /** The GPIO pin that should be used for the bypass capacitor. If `is_bypassed` is true and the current target 213 * uses a GPIO for the bypass capacitor connection, this must not be @ref NC. Otherwise, this must be @ref NC. 214 * Depending on the device, this may be the same GPIO as `ext_vref`. See the BSP documentation for details. 215 */ 216 cyhal_gpio_t bypass_pin; 217 } cyhal_adc_config_t; 218 219 /** ADC Channel Configuration */ 220 typedef struct 221 { 222 /** Whether this channel should be sampled when the ADC performs a scan */ 223 bool enabled; 224 /** Enable or disable averaging for this channel. 225 * All other aspects of the averging functionality are configured in @ref cyhal_adc_config_t 226 */ 227 bool enable_averaging; 228 /** Minimum time that this channel should be sampled, in nanoseconds. The actual time may be greater 229 * than this depending on hardware limitations, the sample rate, and the configuration of other channels. 230 * @note While this value is specified in ns, the underlying hardware generally does not support 231 * acquisition time with a granularity of 1 ns. See the implementation specific documentation for details. 232 */ 233 uint32_t min_acquisition_ns; 234 } cyhal_adc_channel_config_t; 235 236 /** Handler for ADC event callbacks */ 237 typedef void (*cyhal_adc_event_callback_t)(void *callback_arg, cyhal_adc_event_t event); 238 239 /** Initialize ADC peripheral 240 * 241 * The ADC will be initialized with the following default configuration: 242 * - Sample rate: See implementation-specific documentation 243 * - Average count: 1 (averaging disabled). 244 * - Continuous scanning: false 245 * - Single ended vneg: @ref CYHAL_ADC_VNEG_VREF 246 * - Vref: @ref CYHAL_ADC_REF_INTERNAL 247 * - External vref: @ref NC 248 * - Bypassed: false 249 * - Bypass pin: @ref NC 250 * - Power level: @ref CYHAL_POWER_LEVEL_DEFAULT 251 * 252 * To change the configuration, see @ref cyhal_adc_configure 253 * 254 * @param[out] obj Pointer to an ADC object. The caller must allocate the memory 255 * for this object but the init function will initialize its contents. 256 * @param[in] pin A pin corresponding to the ADC block to initialize 257 * Note: This pin is not reserved, it is just used to identify which ADC block to allocate. 258 * If multiple channels will be allocated for a single ADC instance, only one pin should be 259 * passed here; it does not matter which one. After calling this function once, call 260 * @ref cyhal_adc_channel_init_diff once for each pin whose value should be measured. 261 * @param[in] clk The clock to use can be shared, if not provided a new clock will be allocated 262 * @return The status of the init request. \ref CY_RSLT_SUCCESS is returned on success. 263 * On failure, a problem specific error code will be returned. 264 * This error could be from the HAL or lower level driver.<br> 265 * For all other return codes, please refer to device driver documentation available in the BSP landing page 266 */ 267 cy_rslt_t cyhal_adc_init(cyhal_adc_t *obj, cyhal_gpio_t pin, const cyhal_clock_t *clk); 268 269 /** Initialize the ADC peripheral and its channels using a configurator generated configuration struct 270 * 271 * @param[out] adc Pointer to an adc object. The caller must allocate the memory 272 * for this object but the init function will initialize its contents. 273 * @param[out] channels Array of pointers to ADC channel objects. This array must contain 274 * a minimum of one (non-null) entry per channel that is enabled by the configurator 275 * @param[in,out] num_channels Length of the `channels` array. If this value is too small for all of the channels 276 * enabled by the configurator an error will be returned. Will be updated with the 277 * number of channels that were enabled by the configurator. 278 * @param[in] cfg Configuration structure generated by the configurator. 279 * @return The status of the init request 280 */ 281 cy_rslt_t cyhal_adc_init_cfg(cyhal_adc_t *adc, cyhal_adc_channel_t** channels, uint8_t* num_channels, 282 const cyhal_adc_configurator_t *cfg); 283 284 /** Uninitialize the ADC peripheral and cyhal_adc_t object 285 * 286 * @param[in,out] obj The ADC object 287 */ 288 void cyhal_adc_free(cyhal_adc_t *obj); 289 290 /** Update the ADC configuration. 291 * 292 * @note If a scan is in progress, this may cause it to be interrupted. 293 * 294 * @param[in] obj The ADC object 295 * @param[in] config The configuration to apply 296 * @return The status of the configuration request 297 * On failure, a problem specific error code will be returned. 298 * This error could be from the HAL or lower level driver.<br> 299 * For all other return codes, please refer to device driver documentation available in the BSP landing page 300 */ 301 cy_rslt_t cyhal_adc_configure(cyhal_adc_t *obj, const cyhal_adc_config_t *config); 302 303 /** Changes the current operating power level of the ADC. 304 * 305 * If the power level is set to @ref CYHAL_POWER_LEVEL_OFF, the ADC will be powered-off 306 * but it will retain its configuration, so it is not necessary to reconfigure it when changing 307 * the power level from @ref CYHAL_POWER_LEVEL_OFF to any other value. 308 * 309 * @param[in] obj ADC object 310 * @param[in] power The power level to set 311 * @return The status of the set power request 312 * On failure, a problem specific error code will be returned. 313 * This error could be from the HAL or lower level driver.<br> 314 * For all other return codes, please refer to device driver documentation available in the BSP landing page 315 */ 316 cy_rslt_t cyhal_adc_set_power(cyhal_adc_t *obj, cyhal_power_level_t power); 317 318 /** Configure the number of samples per second. 319 * 320 * This is the number of times each enabled channel is sampled per second. The total number of samples performed 321 * by the ADC hardware per second is equal to `sample_rate_hz / num_channels_enabled`. 322 * Depending on the system clock configuration or limitations of the underlying hardware, it may not be possible 323 * to achieve precisely the desired sample rate. The `achived_sample_rate_hz` parameter will be updated to indicate 324 * the sample rate that was achived. 325 * @note The `achieved_sample_rate_hz` value is only valid while the configuration of the ADC and its channels remains 326 * umodified. If @ref cyhal_adc_configure, @ref cyhal_adc_channel_init_diff, @ref cyhal_adc_channel_configure, 327 * or @ref cyhal_adc_channel_free is called, it is necessary to call this function again in order to update the sample rate. 328 * Therefore, it is recommended to call this function after the ADC and all channels have been configured. 329 * 330 * @param[in] obj The ADC object to configure 331 * @param[in] desired_sample_rate_hz The desired sample rate, in hertz 332 * @param[out] achieved_sample_rate_hz The achieved sample rate, in hertz 333 * 334 * @return The status of the sample rate request. Note that inability to exactly match the requested sample 335 * rate is not considered an error. It is the application's responsibility to determine whether the achived rate 336 * is within the tolerance that it requires. 337 * \ref CY_RSLT_SUCCESS is returned on success.<br> 338 * On failure, a problem specific error code will be returned. This error could be from the HAL or lower level driver.<br> 339 * For all other return codes, please refer to device driver documentation available in the BSP landing page 340 */ 341 cy_rslt_t cyhal_adc_set_sample_rate(cyhal_adc_t* obj, uint32_t desired_sample_rate_hz, uint32_t* achieved_sample_rate_hz); 342 343 /** Initialize a differential ADC channel. 344 * @note: Some platforms may restrict which pins can be used as part of a differential pair. See the 345 * implementation-specific documentation for details. 346 * 347 * Configures the pin used by ADC. 348 * @param[out] obj The ADC channel object to initialize 349 * @param[in] adc The ADC for which the channel should be initialized 350 * @param[in] vplus Non-inverting input 351 * @param[in] vminus Inverting input. For a single ended channel, use @ref CYHAL_ADC_VNEG. 352 * @param[in] cfg The ADC channel configuration 353 * @return The status of the init request. 354 * On failure, a problem specific error code will be returned. 355 * This error could be from the HAL or lower level driver.<br> 356 * For all other return codes, please refer to device driver documentation available in the BSP landing page 357 */ 358 cy_rslt_t cyhal_adc_channel_init_diff(cyhal_adc_channel_t *obj, cyhal_adc_t* adc, cyhal_gpio_t vplus, cyhal_gpio_t vminus, const cyhal_adc_channel_config_t* cfg); 359 360 /** Update the ADC channel configuration. 361 * 362 * @note If a scan is in progress, this may cause it to be interrupted. It is not valid to change the enabled state 363 * of a channel while an asynchronous read operation is in progress. 364 * 365 * @param[in] obj The ADC channel object 366 * @param[in] config The configuration to apply 367 * @return The status of the configuration request 368 * On failure, a problem specific error code will be returned. 369 * This error could be from the HAL or lower level driver.<br> 370 * For all other return codes, please refer to device driver documentation available in the BSP landing page 371 */ 372 cy_rslt_t cyhal_adc_channel_configure(cyhal_adc_channel_t *obj, const cyhal_adc_channel_config_t *config); 373 374 /** Uninitialize the ADC channel and cyhal_adc_channel_t object 375 * 376 * @param[in,out] obj The ADC channel object 377 */ 378 void cyhal_adc_channel_free(cyhal_adc_channel_t *obj); 379 380 /** Read the value from the ADC pin, represented as an unsigned 16bit value 381 * where 0x0000 represents the minimum value in the ADC's range, and 0xFFFF 382 * represents the maximum value in the ADC's range. 383 * If continous scanning is disabled, this will block while a conversion is 384 * performed on the selected channel, then return the result. Depending on the 385 * ADC speed this function may block for some time. 386 * If continuous scanning is enabled, this will return the value from the most 387 * recent conversion of the specified channel (if called shortly after enabling 388 * continuous scanning it may block until at least one conversion has been performed 389 * on this channel). 390 * 391 * @param[in] obj The ADC object 392 * @return An unsigned 16bit value representing the current input voltage 393 */ 394 uint16_t cyhal_adc_read_u16(const cyhal_adc_channel_t *obj); 395 396 /** Read the value from ADC pin, represented as a 32-bit signed, right-aligned value. 397 * 398 * This is a 'resolution'-bit value, sign-extended to 32 bits. If the vplus signal is 399 * below the vminus signal, the result will be negative. If the vplus signal is above 400 * the vminus signal, the result will be positive. 401 * If continous scanning is disabled, this will block while a conversion is 402 * performed on the selected channel, then return the result. Depending on the 403 * ADC speed this function may block for some time. 404 * If continuous scanning is enabled, this will return the value from the most 405 * recent conversion of the specified channel (if called shortly after enabling 406 * continuous scanning it may block until at least one conversion has been performed 407 * on this channel). 408 * 409 * @param[in] obj The ADC object 410 * @return A signed 32 bit value representing the current input voltage 411 */ 412 int32_t cyhal_adc_read(const cyhal_adc_channel_t *obj); 413 414 /** Read the value from ADC pin, in microvolts. 415 * 416 * If continous scanning is disabled, this will block while a conversion is 417 * performed on the selected channel, then return the result. Depending on the 418 * ADC speed this function may block for some time. 419 * If continuous scanning is enabled, this will return the value from the most 420 * recent conversion of the specified channel (if called shortly after enabling 421 * continuous scanning it may block until at least one conversion has been performed 422 * on this channel). 423 * 424 * @param[in] obj The ADC object 425 * @return An unsigned 32 bit value representing the current input in microvolts 426 */ 427 int32_t cyhal_adc_read_uv(const cyhal_adc_channel_t *obj); 428 429 /** Scan the specified ADC channels in the background and copy the results 430 * into the array pointed to by `result_list`. 431 * 432 * Results are represented as 32-bit signed, right-aligned values. That is, they are 433 * 'resolution'-bit values, sign-extended to 32 bits. If the vplus signal is 434 * below the vminus signal, the result will be negative. If the vplus signal is above 435 * the vminus signal, the result will be positive. 436 * 437 * If continuous scanning is disabled, this will trigger num_scan new scans and copy the results 438 * into `result_list` once the scan is completed. 439 * 440 * If continuous scanning is enabled, this will copy the results of num_scan scans into the result_list as 441 * they complete, beginning with the most recently completed scan (if one exists). 442 * 443 * Scan results are placed sequentially into result_list. That is, result_list will contain all of the results from the 444 * first scan, followed by all of the results from the second scan, etc. If channels exist that are initialized but not 445 * enabled, they will consume locations in result_list, but these values are undefined. 446 * 447 * When the requested number of scans have been completed, the @ref CYHAL_ADC_ASYNC_READ_COMPLETE event will be raised. 448 * 449 * @ref cyhal_adc_set_async_mode can be used to control whether this uses DMA or a SW (CPU-driven) transfer. 450 * 451 * @param[in] obj ADC to read from 452 * @param[in] num_scan The number of scans of each channel that should be read 453 * @param[in] result_list The array where results should be. This must be of length num_scan * initialized_channels, 454 * where initialized_channels is the number of channels that have been initialized for this ADC 455 * (and not later freed) via @ref cyhal_adc_channel_init_diff 456 * @return The status of the read async request 457 * On failure, a problem specific error code will be returned. 458 * This error could be from the HAL or lower level driver.<br> 459 * For all other return codes, please refer to device driver documentation available in the BSP landing page 460 */ 461 cy_rslt_t cyhal_adc_read_async(cyhal_adc_t* obj, size_t num_scan, int32_t* result_list); 462 463 /** Scan the specified ADC channels in the background and copy the conversion results in microvolts 464 * into the array pointed to by `result_list`. 465 * 466 * If continuous scanning is disabled, this will trigger num_scan new scans and copy the results 467 * into `result_list` once the scan is completed. 468 * 469 * If continuous scanning is enabled, this will copy the results of num_scan scans into the result_list as 470 * they complete, beginning with the most recently completed scan (if one exists). 471 * 472 * Scan results are placed sequentially into result_list. That is, result_list will contain all of the results from the 473 * first scan, followed by all of the results from the second scan, etc. If channels exist that are initialized but not 474 * enabled, they will consume locations in result_list, but these values are undefined. 475 * 476 * When the requested number of scans have been completed, the @ref CYHAL_ADC_ASYNC_READ_COMPLETE event will be raised. 477 * 478 * @ref cyhal_adc_set_async_mode can be used to control whether this uses DMA or a SW (CPU-driven) transfer. 479 * 480 * @param[in] obj ADC to read from 481 * @param[in] num_scan The number of scans of each channel that should be read 482 * @param[in] result_list The array where results should be. This must be of length num_scan * initialized_channels, 483 * where initialized_channels is the number of channels that have been initialized for this ADC 484 * (and not later freed) via @ref cyhal_adc_channel_init_diff 485 * @return The status of the read async request 486 * On failure, a problem specific error code will be returned. 487 * This error could be from the HAL or lower level driver.<br> 488 * For all other return codes, please refer to device driver documentation available in the BSP landing page 489 */ 490 cy_rslt_t cyhal_adc_read_async_uv(cyhal_adc_t* obj, size_t num_scan, int32_t* result_list); 491 492 /** Set the mechanism that is used to perform ADC asynchronous transfers. The default is SW. 493 * @warning The effect of calling this function while an async transfer is pending is undefined. 494 * 495 * @param[in] obj The ADC object 496 * @param[in] mode The transfer mode 497 * @param[in] dma_priority The priority, if DMA is used. Valid values are the same as for @ref cyhal_dma_init. 498 * If DMA is not selected, the only valid value is CYHAL_DMA_PRIORITY_DEFAULT, and no 499 guarantees are made about prioritization. 500 * @return The status of the set mode request 501 * On failure, a problem specific error code will be returned. 502 * This error could be from the HAL or lower level driver.<br> 503 * For all other return codes, please refer to device driver documentation available in the BSP landing page 504 */ 505 cy_rslt_t cyhal_adc_set_async_mode(cyhal_adc_t *obj, cyhal_async_mode_t mode, uint8_t dma_priority); 506 507 /** Register an ADC callback handler 508 * 509 * This function will be called when one of the events enabled by \ref cyhal_adc_enable_event occurs. 510 * 511 * @param[in] obj The ADC object 512 * @param[in] callback The callback handler which will be invoked when the interrupt fires 513 * @param[in] callback_arg Generic argument that will be provided to the callback when called 514 */ 515 void cyhal_adc_register_callback(cyhal_adc_t *obj, cyhal_adc_event_callback_t callback, void *callback_arg); 516 517 /** Configure ADC events. 518 * 519 * When an enabled event occurs, the function specified by \ref cyhal_adc_register_callback will be called. 520 * 521 * @param[in] obj The ADC object 522 * @param[in] event The ADC event type 523 * @param[in] intr_priority The priority for NVIC interrupt events 524 * @param[in] enable True to turn on specified events, False to turn off 525 */ 526 void cyhal_adc_enable_event(cyhal_adc_t *obj, cyhal_adc_event_t event, uint8_t intr_priority, bool enable); 527 528 /** Connects a source signal and enables the specified input 529 * 530 * @param[in] obj The ADC object 531 * @param[in] source Source signal obtained from another driver's cyhal_<PERIPH>_enable_output 532 * @param[in] input Which input signal to connect to 533 * @return The status of the connection 534 */ 535 cy_rslt_t cyhal_adc_connect_digital(cyhal_adc_t *obj, cyhal_source_t source, cyhal_adc_input_t input); 536 537 /** Enables the specified output signal 538 * 539 * @param[in] obj The ADC object 540 * @param[in] output Which output signal to enable 541 * @param[out] source Pointer to user-allocated source signal object 542 * which will be initialized by enable_output. \p source should be passed to 543 * (dis)connect_digital functions to (dis)connect the associated endpoints. 544 * @return The status of the output enable 545 */ 546 cy_rslt_t cyhal_adc_enable_output(cyhal_adc_t *obj, cyhal_adc_output_t output, cyhal_source_t *source); 547 548 /** Disconnect a source signal and disable ADC input 549 * 550 * @param[in] obj The ADC object 551 * @param[in] source Source signal from cyhal_<PERIPH>_enable_output to disable 552 * @param[in] input Which input signal to disconnect 553 * @return The status of the disconnect 554 */ 555 cy_rslt_t cyhal_adc_disconnect_digital(cyhal_adc_t *obj, cyhal_source_t source, cyhal_adc_input_t input); 556 557 /** Disables specified output signal from ADC. 558 * 559 * @param[in] obj The ADC object 560 * @param[in] output Which output signal to disable 561 * @return The status of the disablement 562 */ 563 cy_rslt_t cyhal_adc_disable_output(cyhal_adc_t *obj, cyhal_adc_output_t output); 564 565 #if defined(__cplusplus) 566 } 567 #endif 568 569 #ifdef CYHAL_ADC_IMPL_HEADER 570 #include CYHAL_ADC_IMPL_HEADER 571 #endif /* CYHAL_ADC_IMPL_HEADER */ 572 573 /** \} group_hal_adc */ 574