/***************************************************************************//** * \file cy_sar.h * \version 2.10 * * Header file for the SAR driver. * ******************************************************************************** * \copyright * Copyright 2017-2021 Cypress Semiconductor Corporation * SPDX-License-Identifier: Apache-2.0 * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. * You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and * limitations under the License. *******************************************************************************/ /** * \addtogroup group_sar * \{ * This driver configures and controls the SAR ADC subsystem block, which is a * part of \ref group_pass_structure "PASS" hardware block. * * The functions and other declarations used in this driver are in cy_sar.h. * You can include cy_pdl.h to get access to all functions * and declarations in the PDL. * * This SAR ADC block is comprised of: * - a 12-bit SAR converter (SARADC) * - an embedded reference block (SARREF) * - a mux (\ref group_sar_sarmux "SARMUX") at the inputs of the converter * - a sequence controller (\ref group_sar_sarmux "SARSEQ") that enables multi-channel acquisition * in a round robin fashion, without CPU intervention, to maximize scan rates. * * Devices with PASS_v2 hardware block may contain multiple SAR ADC blocks. * * \image html sar_block_diagram.png * * The high level features of the subsystem are: * - maximum sample rate of 1 Msps (2 Msps for devices with PASS_v2 hardware block) * - sixteen individually configurable channels (depends on device routing capabilities) * - per channel selectable * - single-ended or differential input mode * - input from external pin (8 channels in single-ended mode or 4 channels in differential mode) * or from internal signals (AMUXBUS, CTB, Die Temperature Sensor) * - choose one of four programmable acquisition times * - averaging and accumulation * - scan can be triggered by firmware or hardware in single shot or continuous mode * - hardware averaging from 2 to 256 samples * - selectable voltage references * - internal VDDA and VDDA/2 references * - buffered 1.2 V bandgap reference from \ref group_sysanalog_aref "AREF" * - external reference from dedicated pin * - interrupt generation * - built-in FIFO buffer (PASS_v2 only) * - ability to perform scans in Deep Sleep power mode (PASS_v2 only). * * \section group_sar_usage Usage * * The high level steps to use this driver are: * * -# \ref group_sar_initialization * -# \ref group_sar_trigger_conversions * -# \ref group_sar_handle_interrupts * -# \ref group_sar_retrieve_result * -# \ref group_sar_fifo_usage * * \section group_sar_initialization Initialization and Enable * * To configure the SAR subsystem, call \ref Cy_SAR_Init. Pass in a pointer to the \ref SAR_Type * structure for the base hardware register address and pass in the configuration structure, * \ref cy_stc_sar_config_t. * * \note Make sure to choose correct hardware identifiers, taking into account the indexing in the used device: * \snippet sar/snippet/main.c SNIPPET_SAR_HW_COMPATIBILITY * * * After initialization, call \ref Cy_SAR_Enable to enable the hardware. * * Here is guidance on how to set the data fields of the configuration structure: * * \subsection group_sar_init_struct_ctrl uint32_t ctrl * * This field specifies configurations that apply to all channels such as the Vref * source or the negative terminal selection for all single-ended channels. * Select a value from each of the following enums that begin with "cy_en_sar_ctrl_" and "OR" them together. * - \ref cy_en_sar_ctrl_pwr_ctrl_vref_t * - \ref cy_en_sar_ctrl_vref_sel_t * - \ref cy_en_sar_ctrl_bypass_cap_t * - \ref cy_en_sar_ctrl_neg_sel_t * - \ref cy_en_sar_ctrl_hw_ctrl_negvref_t * - \ref cy_en_sar_ctrl_comp_delay_t * - \ref cy_en_sar_ctrl_comp_pwr_t * - \ref cy_en_sar_ctrl_sarmux_deep_sleep_t * - \ref cy_en_sar_ctrl_sarseq_routing_switches_t * * \snippet sar/snippet/main.c SNIPPET_CTRL * * \subsection group_sar_init_struct_sampleCtrl uint32_t sampleCtrl * * This field configures sampling details that apply to all channels. * Select a value from each of the following enums that begin with "cy_en_sar_sample_" and "OR" them together. * - \ref cy_en_sar_sample_ctrl_result_align_t * - \ref cy_en_sar_sample_ctrl_single_ended_format_t * - \ref cy_en_sar_sample_ctrl_differential_format_t * - \ref cy_en_sar_sample_ctrl_avg_cnt_t * - \ref cy_en_sar_sample_ctrl_avg_mode_t * - \ref cy_en_sar_sample_ctrl_trigger_mode_t * * \snippet sar/snippet/main.c SNIPPET_SAR_SAMPLE_CTRL * * \subsection group_sar_init_struct_sampleTime01 uint32_t sampleTime01 * * This field configures the value for sample times 0 and 1 in ADC clock cycles. * * The SAR has four programmable 10-bit aperture times that are configured using two data fields, * \ref group_sar_init_struct_sampleTime01 and * \ref group_sar_init_struct_sampleTime23. * Ten bits allow for a range of 0 to 1023 cycles, however 0 and 1 are invalid. * The minimum aperture time is 167 ns. With an 18 MHz ADC clock, this is * equal to 3 cycles or a value of 4 in this field. The actual aperture time is one cycle less than * the value stored in this field. * * Use the shifts defined in \ref cy_en_sar_sample_time_shift_t. * * \snippet sar/snippet/main.c SNIPPET_SAR_SAMPLE_TIME01 * * \subsection group_sar_init_struct_sampleTime23 uint32_t sampleTime23 * * This field configures the value for sample times 2 and 3 in ADC clock cycles. * Use the shifts defined in \ref cy_en_sar_sample_time_shift_t. * * \snippet sar/snippet/main.c SNIPPET_SAR_SAMPLE_TIME23 * * \subsection group_sar_init_struct_rangeThres uint32_t rangeThres * * This field configures the upper and lower thresholds for the range interrupt. * These thresholds apply on a global level for all channels with range detection enabled. * * The SARSEQ supports range detection to allow for automatic detection of sample values * compared to two programmable thresholds without CPU involvement. * Range detection is done after averaging, alignment, and sign extension (if applicable). In other words the * threshold values need to have the same data format as the result data. * The values are interpreted as signed or unsigned according to each channel's configuration. * * Use the shifts defined in \ref cy_en_sar_range_thres_shift_t. * * The \ref Cy_SAR_SetLowLimit and \ref Cy_SAR_SetHighLimit provide run-time configurability of these thresholds. * * \snippet sar/snippet/main.c SNIPPET_SAR_RANGE_THRES * * \subsection group_sar_init_struct_rangeCond cy_en_sar_range_detect_condition_t rangeCond * * This field configures the condition (below, inside, outside, or above) that will trigger * the range interrupt. Select a value from the \ref cy_en_sar_range_detect_condition_t enum. * * \subsection group_sar_init_struct_chanEn uint32_t chanEn * * This field configures which channels will be scanned. * Each bit corresponds to a channel. Bit 0 enables channel 0, bit 1 enables channel 1, * bit 2 enables channel 2, and so on. * * \subsection group_sar_init_struct_chanConfig uint32_t chanConfig[16] * * Each channel has its own channel configuration register. * The channel configuration specifies which pin/signal is connected to that channel * and how the channel is sampled. * * Select a value from each of the following enums that begin with "cy_en_sar_chan_config_" and "OR" them together. * * - \ref cy_en_sar_chan_config_input_mode_t * - \ref cy_en_sar_chan_config_pos_pin_addr_t * - \ref cy_en_sar_chan_config_pos_port_addr_t * - \ref cy_en_sar_chan_config_avg_en_t * - \ref cy_en_sar_chan_config_sample_time_t * - \ref cy_en_sar_chan_config_neg_pin_addr_t * - \ref cy_en_sar_chan_config_neg_port_addr_t * * Some important considerations are: * - The POS_PORT_ADDR and POS_PIN_ADDR bit fields are used by the SARSEQ to select * the connection to the positive terminal (Vplus) of the ADC for each channel. * - When the channel is an unpaired differential input (\ref CY_SAR_CHAN_DIFFERENTIAL_UNPAIRED), the * NEG_PORT_ADDR and NEG_PIN_ADDR are used by the SARSEQ to select the connection * to the negative terminal (Vminus) of the ADC. * - When the channel is a differential input pair (\ref CY_SAR_CHAN_DIFFERENTIAL_PAIRED), the NEG_PORT_ADDR and NEG_PIN_ADDR are ignored. * For differential input pairs, only the pin for the positive terminal needs to be * specified and this pin must be even. For example, Pin 0 (positive terminal) and Pin 1 (negative terminal) * are a pair. Pin 2 (positive terminal) and Pin 3 (negative terminal) are a pair. * * If the SARSEQ is disabled (\ref cy_en_sar_ctrl_sarseq_routing_switches_t) or * it is not controlling any switches (\ref group_sar_init_struct_muxSwitchSqCtrl = 0), the port and pin addresses * are ignored. This is possible when there is only one channel to scan. * * \snippet sar/snippet/main.c SNIPPET_SAR_CHAN_CONFIG * * \subsection group_sar_init_struct_intrMask uint32_t intrMask * * This field configures which interrupt events (end of scan, overflow, or firmware collision) will be serviced by the firmware. * * Select one or more values from the \ref group_sar_macros_interrupt enum and "OR" them * together. * * \snippet sar/snippet/main.c SNIPPET_SAR_INTR_MASK * * \subsection group_sar_init_struct_satIntrMask uint32_t satIntrMask * * This field configures which channels will cause a saturation interrupt. * * The SARSEQ has a saturation detect that is always applied to every conversion. * This feature detects whether a channel's sample value is equal to the minimum or maximum values. * This allows the firmware to take action, for example, discard the result, when the SARADC saturates. * The sample value is tested right after conversion, that is, before averaging. This means that it * can happen that the interrupt is set while the averaged result in the data register is not * equal to the minimum or maximum. * * Each bit corresponds to a channel. A value of 0 disables saturation detection for all channels. * * \subsection group_sar_init_struct_rangeIntrMask uint32_t rangeIntrMask * * This field configures which channels will cause a range detection interrupt. * Each bit corresponds to a channel. A value of 0 disables range detection for all channels. * * \subsection group_sar_init_struct_muxSwitch uint32_t muxSwitch * * This field is the firmware control of the SARMUX switches. * * Use one or more values from the \ref cy_en_sar_mux_switch_fw_ctrl_t enum and "OR" them together. * If the SARSEQ is enabled, the SARMUX switches that will be used must * also be closed using this firmware control. * * \snippet sar/snippet/main.c SNIPPET_SAR_MUX_SWITCH * * Firmware control can be changed at run-time by calling \ref Cy_SAR_SetAnalogSwitch with \ref CY_SAR_MUX_SWITCH0 * and the desired switch states. * * \subsection group_sar_init_struct_muxSwitchSqCtrl uint32_t muxSwitchSqCtrl * * This field enables or disables SARSEQ control of the SARMUX switches. * To disable control of all switches, set this field to 0. To disable the SARSEQ all together, * use \ref CY_SAR_SARSEQ_SWITCH_DISABLE when configuring the \ref group_sar_init_struct_ctrl register. * * Use one or more values from the \ref cy_en_sar_mux_switch_sq_ctrl_t enum and "OR" them together. * * \snippet sar/snippet/main.c SNIPPET_SAR_MUX_SQ_CTRL * * SARSEQ control can be changed at run-time by calling \ref Cy_SAR_SetSwitchSarSeqCtrl. * * \subsection group_sar_init_struct_configRouting bool configRouting * * If true, the \ref group_sar_init_struct_muxSwitch and \ref group_sar_init_struct_muxSwitchSqCtrl fields * will be used. If false, the fields will be ignored. * * \subsection group_sar_init_struct_vrefMvValue uint32_t vrefMvValue * * This field sets the value of the reference voltage in millivolts used. This value * is used for converting counts to volts in the \ref Cy_SAR_CountsTo_Volts, \ref Cy_SAR_CountsTo_mVolts, and * \ref Cy_SAR_CountsTo_uVolts functions. * * The rest of the \ref cy_stc_sar_config_t fields starting from \ref cy_stc_sar_config_t::clock affects * SAR ADC configuration only for PASS_ver2. Refer to \ref cy_stc_sar_config_t for details. * * \section group_sar_trigger_conversions Triggering Conversions * * The SAR subsystem has the following modes for triggering a conversion: * * * * * * * * * * * * * * * * * * * * * * * * * * *
ModeDescriptionUsage
ContinuousAfter completing a scan, the * SARSEQ will immediately start the next scan. That is, the SARSEQ will always be BUSY. * As a result all other triggers, firmware or hardware, are essentially ignored. * To enter this mode, call \ref Cy_SAR_StartConvert with \ref CY_SAR_START_CONVERT_CONTINUOUS. * To stop continuous conversions, call \ref Cy_SAR_StopConvert. *
Firmware single shotA single conversion of all enabled channels is triggered with a function call to \ref Cy_SAR_StartConvert with * \ref CY_SAR_START_CONVERT_SINGLE_SHOT. * * Firmware triggering is always available by calling \ref Cy_SAR_StartConvert with \ref CY_SAR_START_CONVERT_SINGLE_SHOT. * To allow only firmware triggering, or disable * hardware triggering, set up the \ref cy_stc_sar_config_t config structure with \ref CY_SAR_TRIGGER_MODE_FW_ONLY. *
Hardware edge sensitiveA single conversion of all enabled channels is triggered on the rising edge of the hardware * trigger signal.To enable this mode, set up the \ref cy_stc_sar_config_t config structure with * \ref CY_SAR_TRIGGER_MODE_FW_AND_HWEDGE.
Hardware level sensitiveConversions are triggered continuously when the hardware trigger signal is high.To enable this mode, set up the \ref cy_stc_sar_config_t config structure with * \ref CY_SAR_TRIGGER_MODE_FW_AND_HWLEVEL.
* * If trigger occurs during a scan, a \ref CY_SAR_INTR_FW_COLLISION interrupt occurs and the trigger is delayed until after end of scan. * * The trigger mode can be changed during run time with \ref Cy_SAR_SetConvertMode. * * For the hardware trigger modes, use the \ref group_trigmux driver to route an internal or external * signal to the SAR trigger input. * When making the required \ref Cy_TrigMux_Connect calls, use the pre-defined enum, TRIG6_OUT_PASS_TR_SAR_IN, * for the SAR trigger input. * * \snippet sar/snippet/main.c SNIPPET_SAR_CONFIG_TRIGGER * * \section group_sar_handle_interrupts Handling Interrupts * * The SAR can generate interrupts on these events: * * - End of scan (EOS): when scanning of all enabled channels complete. * - Overflow: when the result register is updated before the previous result is read. * - FW collision: when a new trigger is received while the SAR is still processing the previous trigger. * - Saturation detection: when the channel result is equal to the minimum or maximum value. * - Range detection: when the channel result meets the programmed upper or lower threshold values. * * The SAR interrupt to the NVIC is raised any time the intersection (logic and) of the interrupt * flags and the corresponding interrupt masks are non-zero. * * Implement an interrupt routine and assign it to the SAR interrupt. * Use the pre-defined enum, pass_interrupt_sar_IRQn, as the interrupt source for the SAR. * * The following code snippet demonstrates how to implement a routine to handle the interrupt. * The routine gets called when any one of the SAR interrupts are triggered. * When servicing an interrupt, the user must clear the interrupt so that subsequent * interrupts can be handled. * * \snippet sar/snippet/main.c SNIPPET_SAR_ISR * * The following code snippet demonstrates how to configure and enable the interrupt. * * \snippet sar/snippet/main.c SNIPPET_SAR_CONFIG_INTR * * Alternately, instead of handling the interrupts, the \ref Cy_SAR_IsEndConversion function * allows for firmware polling of the end of conversion status. * * \section group_sar_retrieve_result Retrieve Channel Results * * Retrieve the ADC result by calling \ref Cy_SAR_GetResult16 with the desired channel. * To convert the result to a voltage, pass the ADC result to \ref Cy_SAR_CountsTo_Volts, \ref Cy_SAR_CountsTo_mVolts, or * \ref Cy_SAR_CountsTo_uVolts. * * \section group_sar_fifo_usage FIFO Usage * * The PASS_ver2 SAR can operate in the system Deep Sleep power mode. * To do so the SAR should be clocked by the \ref group_sysanalog_dpslp, * triggered by the \ref group_sysanalog_timer, and use the FIFO: * \snippet sar/snippet/main.c SNIPPET_FIFO_ISR * \snippet sar/snippet/main.c SNIPPET_FIFO_OPERATE * * \section group_sar_clock SAR Clock Configuration * * The SAR requires a clock. Assign a clock to the SAR using the * pre-defined enum, PCLK_PASS_CLOCK_SAR, to identify the SAR subsystem. * Set the clock divider value to achieve the desired clock rate. The SAR can support * a maximum frequency of 18 MHz. * * For PASS_ver2 the maximum clock frequency is 36 MHz. * Also, the SAR clock could be switched to the \ref group_sysanalog_dpslp to operate in * the system Deep Sleed power mode using \ref cy_stc_sar_config_t::clock. * * \snippet sar/snippet/main.c SAR_SNIPPET_CONFIGURE_CLOCK * * \section group_sar_scan_time Scan Rate * * The scan rate is dependent on the following: * * - ADC clock rate * - Number of channels * - Averaging * - Resolution * - Acquisition times * * \subsection group_sar_acquisition_time Acquisition Time * * The acquisition time of a channel is based on which of the four global aperture times are selected for that * channel. The selection is done during initialization per channel with \ref group_sar_init_struct_chanConfig. * The four global aperture times are also set during initialization with \ref group_sar_init_struct_sampleTime01 and * \ref group_sar_init_struct_sampleTime23. Note that these global aperture times are in SAR clock cycles and the * acquisition time is 1 less than that value in the register. * * \image html sar_acquisition_time_eqn.png * * \subsection group_sar_channel_sample_time Channel Sample Time * * The sample time for a channel is the time required to acquire the analog signal * and convert it to a digital code. * * \image html sar_channel_sample_time_eqn.png * * The SAR ADC is a 12-bit converter so Resolution = 12. * * \subsection group_sar_total_scan_time Total Scan Time * * Channels using one of the sequential averaging modes (\ref CY_SAR_AVG_MODE_SEQUENTIAL_ACCUM or \ref CY_SAR_AVG_MODE_SEQUENTIAL_FIXED) * are sampled multiple times per scan. The number of samples averaged are set during initialization * with \ref group_sar_init_struct_sampleCtrl using one of the values from \ref cy_en_sar_sample_ctrl_avg_cnt_t. * Channels that are not averaged or use the \ref CY_SAR_AVG_MODE_INTERLEAVED mode are only sampled once per scan. * * The total scan time is the sum of each channel's sample time multiplied by the samples per scan. * * \image html sar_scan_rate_eqn.png * * where N is the total number of channels in the scan. * * \section group_sar_sarmux SARMUX and SARSEQ * * The SARMUX is an analog programmable multiplexer. Its switches can be controlled by the SARSEQ or firmware. * and the inputs can come from: * - a dedicated port (can support 8 single-ended channels or 4 differential channels) * - an internal die temperature (DieTemp) sensor * - CTB output via SARBUS0/1 (if CTBs are available on the device) * - AMUXBUSA/B * * The following figure shows the SARMUX switches. See the device datasheet for the exact location of SARMUX pins. * * \image html sar_sarmux_switches.png * * When using the SARSEQ, the following configurations must be performed: * - enable SARSEQ control of required switches (see \ref group_sar_init_struct_muxSwitchSqCtrl) * - close the required switches with firmware (see \ref group_sar_init_struct_muxSwitch) * - configure the POS_PORT_ADDR and POS_PIN_ADDR, and if used, the NEG_PORT_ADDR and NEG_PIN_ADDR (see \ref group_sar_init_struct_chanConfig) * * While firmware can control every switch in the SARMUX, not every switch can be controlled by the SARSEQ (green switches in the above figure). * Additionally, switches outside of the SARMUX such as the AMUXBUSA/B switches or * CTB switches will require separate function calls (see \ref group_gpio "GPIO" and \ref group_ctb "CTB" drivers). * The SARSEQ can control three switches in the \ref group_ctb "CTB" driver (see \ref Cy_CTB_EnableSarSeqCtrl). * These switches need to be enabled for SARSEQ control if the CTB outputs are used as the SARMUX inputs. * * The following table shows the required POS_PORT_ADDR and POS_PIN_ADDR settings * for different input connections. * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *
Input Connection SelectionPOS_PORT_ADDRPOS_PIN_ADDR
SARMUX dedicated port\ref CY_SAR_POS_PORT_ADDR_SARMUX\ref CY_SAR_CHAN_POS_PIN_ADDR_0 through \ref CY_SAR_CHAN_POS_PIN_ADDR_7
DieTemp sensor\ref CY_SAR_POS_PORT_ADDR_SARMUX_VIRT\ref CY_SAR_CHAN_POS_PIN_ADDR_0
AMUXBUSA\ref CY_SAR_POS_PORT_ADDR_SARMUX_VIRT\ref CY_SAR_CHAN_POS_PIN_ADDR_2
AMUXBUSB\ref CY_SAR_POS_PORT_ADDR_SARMUX_VIRT\ref CY_SAR_CHAN_POS_PIN_ADDR_3
CTB0 Opamp0 1x output\ref CY_SAR_POS_PORT_ADDR_CTB0\ref CY_SAR_CHAN_POS_PIN_ADDR_2
CTB0 Opamp1 1x output\ref CY_SAR_POS_PORT_ADDR_CTB0\ref CY_SAR_CHAN_POS_PIN_ADDR_3
* * \subsection group_sar_sarmux_dietemp Input from DieTemp sensor * * When using the DieTemp sensor, always use single-ended mode. * The temperature sensor can be routed to Vplus using the \ref CY_SAR_MUX_FW_TEMP_VPLUS switch. * Connecting this switch will also enable the sensor. Set the \ref group_sar_acquisition_time "acquisition time" to * be at least 1 us to meet the settling time of the temperature sensor. * * \image html sar_sarmux_dietemp.png * * \snippet sar/snippet/main.c SNIPPET_SAR_SARMUX_DIETEMP * * \subsection group_sar_sarmux_se_diff Input from SARMUX port * * The following figure and code snippet show how two GPIOs on the SARMUX dedicated port * are connected to the SARADC as separate single-ended channels and as a differential-pair channel. * * \image html sar_sarmux_dedicated_port.png * * \snippet sar/snippet/main.c SNIPPET_SAR_SARMUX_SE_DIFF * * \subsection group_sar_sarmux_ctb Input from CTB output visa SARBUS0/1 * * The following figure and code snippet show how the two opamp outputs from the CTB * are connected to the SARADC as separate single-ended channels and as a differential-pair channel. * Note that separate function calls are needed to configure and enable the opamps, perform required analog routing, * and enable SARSEQ control of the switches contained in the CTB. * * \image html sar_sarmux_ctb.png * * \snippet sar/snippet/main.c SNIPPET_SAR_SARMUX_CTB * * \subsection group_sar_sarmux_amuxbus Input from other pins through AMUXBUSA/B * * The following figure and code snippet show how two GPIOs on any port through the AMUXBUSA and AMUXBUSB * are connected to the SARADC as separate single-ended channels and as a differential-pair channel. * Note that separate function calls are needed to route the device pins to the SARMUX. The AMUXBUSes * are separated into multiple segments and these segments are connected/disconnected using the AMUX_SPLIT_CTL * registers in the HSIOM. * * \image html sar_sarmux_amuxbus.png * * \snippet sar/snippet/main.c SNIPPET_SAR_SARMUX_AMUXBUS * * * To connect SARMUX to any other non-dedicated port, you may need to close additional HSIOM switches to route signals * through AMUXBUS. * For more detail, see the device TRM, AMUX splitting. * * The following code snippet is an alternative pin configuration. To connect Port 1 to AMUXBUS, close the left and * right switches of AMUX_SPLIT_CTL[1] and AMUX_SPLIT_CTL[6]. * * \warning * This snippet shows how to configure pins for CY8C6347BZI-BLD53. * * \snippet sar/snippet/main.c SNIPPET_SAR_SARMUX_CUSTOM_PORT * * \section group_sar_low_power Low Power Support * This SAR driver provides a callback function to handle power mode transitions. * The \ref Cy_SAR_DeepSleepCallback function ensures that SAR conversions are stopped * before Deep Sleep entry. Upon wakeup, the callback * enables the hardware and continuous conversions, if previously enabled. * * To trigger the callback execution, the callback must be registered before calling \ref Cy_SysPm_CpuEnterDeepSleep. Refer to * \ref group_syspm driver for more information about power mode transitions and * callback registration. * * Recall that during configuration of the \ref group_sar_init_struct_ctrl "ctrl" field, * the SARMUX can be configured to remain enabled in Deep Sleep mode. * All other blocks (SARADC, REFBUF, and SARSEQ) do not support Deep Sleep mode operation. * * \section group_sar_more_information More Information * For more information on the SAR ADC subsystem, refer to the technical reference manual (TRM). * * \section group_sar_changelog Changelog * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *
VersionChangesReason for Change
2.10The FIFO level validation in debug mode is fixed in the Cy_SAR_FifoSetLevel().Bug fixing.
2.0.1Minor documentation updates.Documentation enhancement.
2.0Added the next PASS_ver2 features: \ref group_sar_functions_lp, \ref group_sar_functions_fifo, and \ref group_sar_functions_trig.New silicon support.
The Result Format check is added to the \ref Cy_SAR_Init function when the interleaved averaging mode is used.HW bug workaround.
\ref Cy_SAR_Enable and \ref Cy_SAR_Disable functions behavior is changed - * now \ref Cy_SAR_Disable checks the busy status before shutting down, and \ref Cy_SAR_Enable doesn't.Bug fixing.
Fixed/Documented MISRA 2012 violations.MISRA 2012 compliance.
1.20.3Minor documentation updates.Documentation enhancement.
1.20.2Code snippets update.PDL infrastructure update, documentation enhancement.
1.20.1Code snippets update.PDL infrastructure update, documentation enhancement.
1.20Flattened the organization of the driver source code into the single source directory and the single include directory.Driver library directory-structure simplification.
Added register access layer. Use register access macros instead * of direct register access using dereferenced pointers.Makes register access device-independent, so that the PDL does * not need to be recompiled for each supported part number.
1.10 Added workaround for parts with out of range CAP_TRIM in Init API. Correct CAP_TRIM is necessary achieving specified SAR ADC linearity
Turn off the entire hardware block only if the SARMUX is not enabled * for Deep Sleep operation. * Improvement of the \ref Cy_SAR_DeepSleep flow
Updated "Low Power Support" section to describe registering the Deep Sleep callback. * Added parenthesis around logical AND operation in Sleep API.Documentation update and clarification
1.0Initial version
* * \defgroup group_sar_macros Macros * \{ * \defgroup group_sar_macros_interrupt Interrupt Masks * \} * \defgroup group_sar_functions Functions * \{ * \defgroup group_sar_functions_basic Initialization and Basic Functions * \defgroup group_sar_functions_power Low Power Callback * \defgroup group_sar_functions_config Run-time Configuration Functions * \defgroup group_sar_functions_countsto Counts Conversion Functions * \defgroup group_sar_functions_interrupt Interrupt Functions * \defgroup group_sar_functions_switches SARMUX Switch Control Functions * \defgroup group_sar_functions_helper Useful Configuration Query Functions * \defgroup group_sar_functions_lp Low Power features control Functions * \defgroup group_sar_functions_fifo FIFO buffer control Functions * \defgroup group_sar_functions_trig Common triggering Functions for multiple SAR instances * \} * \defgroup group_sar_data_structures Data Structures * \defgroup group_sar_enums Enumerated Types * \{ * \defgroup group_sar_ctrl_register_enums Control Register Enums * \defgroup group_sar_sample_ctrl_register_enums Sample Control Register Enums * \defgroup group_sar_sample_time_shift_enums Sample Time Register Enums * \defgroup group_sar_range_thres_register_enums Range Interrupt Register Enums * \defgroup group_sar_chan_config_register_enums Channel Configuration Register Enums * \defgroup group_sar_mux_switch_register_enums SARMUX Switch Control Register Enums * \} */ #if !defined(CY_SAR_H) #define CY_SAR_H #include "cy_device.h" #ifdef CY_IP_MXS40PASS_SAR #include #include #include #include "cy_syslib.h" #include "cy_syspm.h" #if defined(__cplusplus) extern "C" { #endif CY_MISRA_DEVIATE_BLOCK_START('MISRA C-2012 Rule 11.3', 27, \ 'SAR_Type will typecast to either SAR_V1_Type or SAR_V2_Type but not both on PDL initialization based on the target device at compile time.') /** \addtogroup group_sar_macros * \{ */ /** Driver major version */ #define CY_SAR_DRV_VERSION_MAJOR 2 /** Driver minor version */ #define CY_SAR_DRV_VERSION_MINOR 10 /** SAR driver identifier */ #define CY_SAR_ID CY_PDL_DRV_ID(0x01u) /** \cond Legacy definition, use CY_SAR_SEQ_NUM_CHANNELS instead */ #define CY_SAR_MAX_NUM_CHANNELS (PASS_SAR_SAR_CHANNELS) /** \endcond */ /** Number of sequencer channels */ #define CY_SAR_SEQ_NUM_CHANNELS (PASS_SAR_SAR_CHANNELS) /** Number of all channels including the injection channel */ #define CY_SAR_NUM_CHANNELS (CY_SAR_SEQ_NUM_CHANNELS + 1UL) /** Injection channel index */ #define CY_SAR_INJ_CHANNEL (CY_SAR_SEQ_NUM_CHANNELS) /** Channels mask */ #define CY_SAR_CHANNELS_MASK ((1UL << CY_SAR_SEQ_NUM_CHANNELS) - 1UL) /** Injection channel mask */ #define CY_SAR_INJ_CHAN_MASK (1UL << CY_SAR_INJ_CHANNEL) /** \addtogroup group_sar_macros_interrupt * \{ */ /** Interrupt masks */ #define CY_SAR_INTR_EOS (SAR_INTR_MASK_EOS_MASK_Msk) /**< Enable end of scan (EOS) interrupt */ #define CY_SAR_INTR_OVERFLOW (SAR_INTR_MASK_OVERFLOW_MASK_Msk) /**< Enable overflow interrupt */ #define CY_SAR_INTR_FW_COLLISION (SAR_INTR_MASK_FW_COLLISION_MASK_Msk) /**< Enable firmware collision interrupt */ #define CY_SAR_INTR_INJ_EOC (SAR_INTR_INJ_EOC_INTR_Msk) /**< Enable injection channel end of conversion (EOC) interrupt */ #define CY_SAR_INTR_INJ_SATURATE (SAR_INTR_INJ_SATURATE_INTR_Msk) /**< Enable injection channel saturation interrupt */ #define CY_SAR_INTR_INJ_RANGE (SAR_INTR_INJ_RANGE_INTR_Msk) /**< Enable injection channel range detection interrupt */ #define CY_SAR_INTR_INJ_COLLISION (SAR_INTR_INJ_COLLISION_INTR_Msk) /**< Enable injection channel firmware collision interrupt */ #define CY_SAR_INTR_FIFO_LEVEL (PASS_FIFO_V2_INTR_FIFO_LEVEL_Msk) /**< Enable FIFO level interrupt */ #define CY_SAR_INTR_FIFO_OVERFLOW (PASS_FIFO_V2_INTR_FIFO_OVERFLOW_Msk) /**< Enable FIFO overflow interrupt */ #define CY_SAR_INTR_FIFO_UNDERFLOW (PASS_FIFO_V2_INTR_FIFO_UNDERFLOW_Msk) /**< Enable FIFO underflow interrupt */ /** Combined interrupt mask */ #define CY_SAR_INTR (CY_SAR_INTR_EOS | \ CY_SAR_INTR_OVERFLOW | \ CY_SAR_INTR_FW_COLLISION | \ CY_SAR_INTR_INJ_EOC | \ CY_SAR_INTR_INJ_SATURATE | \ CY_SAR_INTR_INJ_RANGE | \ CY_SAR_INTR_INJ_COLLISION) /** Combined interrupt mask for FIFO */ #define CY_SAR_INTR_FIFO (CY_SAR_INTR_FIFO_LEVEL | \ CY_SAR_INTR_FIFO_OVERFLOW | \ CY_SAR_INTR_FIFO_UNDERFLOW) /** \} group_sar_macros_interrupt */ /** \defgroup group_sysanalog_sar_select SAR block instance masks * \{ * Specifies the SAR block instance. */ #define CY_SAR_SAR0 (1UL) /**< SAR 0 instance */ #define CY_SAR_SAR1 (2UL) /**< SAR 1 instance */ #define CY_SAR_SAR2 (4UL) /**< SAR 2 instance */ #define CY_SAR_SAR3 (8UL) /**< SAR 3 instance */ #define CY_SAR_INSTANCE_MASK(base) (1UL << CY_SAR_INSTANCE(base)) /**< Convert SAR base to instance mask. Could be used instead of SAR 0 - SAR 3 instance masks */ #define CY_SAR_TIMER (1UL<<31UL) /**< Trigger source is Timer. Used only for simultTrigSource configuration in \ref cy_stc_sar_common_config_t */ /** \} group_sysanalog_sar_select */ /** \cond INTERNAL */ #define CY_SAR_DEINIT (0UL) /**< De-init value for most SAR registers */ #define CY_SAR_SAMPLE_TIME_DEINIT ((3UL << SAR_SAMPLE_TIME01_SAMPLE_TIME0_Pos) | (3UL << SAR_SAMPLE_TIME01_SAMPLE_TIME1_Pos)) /**< De-init value for the SAMPLE_TIME* registers */ #define CY_SAR_CLEAR_ALL_SWITCHES (0x3FFFFFFFUL) /**< Value to clear all SARMUX switches */ #define CY_SAR_DEINIT_SQ_CTRL (SAR_MUX_SWITCH_SQ_CTRL_MUX_SQ_CTRL_P0_Msk \ | SAR_MUX_SWITCH_SQ_CTRL_MUX_SQ_CTRL_P1_Msk \ | SAR_MUX_SWITCH_SQ_CTRL_MUX_SQ_CTRL_P2_Msk \ | SAR_MUX_SWITCH_SQ_CTRL_MUX_SQ_CTRL_P3_Msk \ | SAR_MUX_SWITCH_SQ_CTRL_MUX_SQ_CTRL_P4_Msk \ | SAR_MUX_SWITCH_SQ_CTRL_MUX_SQ_CTRL_P5_Msk \ | SAR_MUX_SWITCH_SQ_CTRL_MUX_SQ_CTRL_P6_Msk \ | SAR_MUX_SWITCH_SQ_CTRL_MUX_SQ_CTRL_P7_Msk \ | SAR_MUX_SWITCH_SQ_CTRL_MUX_SQ_CTRL_VSSA_Msk \ | SAR_MUX_SWITCH_SQ_CTRL_MUX_SQ_CTRL_TEMP_Msk \ | SAR_MUX_SWITCH_SQ_CTRL_MUX_SQ_CTRL_AMUXBUSA_Msk \ | SAR_MUX_SWITCH_SQ_CTRL_MUX_SQ_CTRL_AMUXBUSB_Msk \ | SAR_MUX_SWITCH_SQ_CTRL_MUX_SQ_CTRL_SARBUS0_Msk \ | SAR_MUX_SWITCH_SQ_CTRL_MUX_SQ_CTRL_SARBUS1_Msk) #define CY_SAR_REG_CTRL_MASK (SAR_CTRL_PWR_CTRL_VREF_Msk \ | SAR_CTRL_VREF_SEL_Msk \ | SAR_CTRL_VREF_BYP_CAP_EN_Msk \ | SAR_CTRL_NEG_SEL_Msk \ | SAR_CTRL_SAR_HW_CTRL_NEGVREF_Msk \ | SAR_CTRL_COMP_DLY_Msk \ | SAR_CTRL_REFBUF_EN_Msk \ | SAR_CTRL_COMP_PWR_Msk \ | SAR_CTRL_DEEPSLEEP_ON_Msk \ | SAR_CTRL_DSI_SYNC_CONFIG_Msk \ | SAR_CTRL_DSI_MODE_Msk \ | SAR_CTRL_SWITCH_DISABLE_Msk \ | SAR_CTRL_ENABLED_Msk) #define CY_SAR_REG_SAMPLE_CTRL_MASK (SAR_SAMPLE_CTRL_LEFT_ALIGN_Msk \ | SAR_SAMPLE_CTRL_SINGLE_ENDED_SIGNED_Msk \ | SAR_SAMPLE_CTRL_DIFFERENTIAL_SIGNED_Msk \ | SAR_SAMPLE_CTRL_AVG_CNT_Msk \ | SAR_SAMPLE_CTRL_AVG_SHIFT_Msk \ | SAR_SAMPLE_CTRL_AVG_MODE_Msk \ | SAR_SAMPLE_CTRL_CONTINUOUS_Msk \ | SAR_SAMPLE_CTRL_DSI_TRIGGER_EN_Msk \ | SAR_SAMPLE_CTRL_DSI_TRIGGER_LEVEL_Msk \ | SAR_SAMPLE_CTRL_DSI_SYNC_TRIGGER_Msk \ | SAR_SAMPLE_CTRL_UAB_SCAN_MODE_Msk \ | SAR_SAMPLE_CTRL_REPEAT_INVALID_Msk \ | SAR_SAMPLE_CTRL_VALID_SEL_Msk \ | SAR_SAMPLE_CTRL_VALID_SEL_EN_Msk \ | SAR_SAMPLE_CTRL_VALID_IGNORE_Msk \ | SAR_SAMPLE_CTRL_TRIGGER_OUT_EN_Msk \ | SAR_SAMPLE_CTRL_EOS_DSI_OUT_EN_Msk) #define CY_SAR_REG_CHAN_CONFIG_MASK (SAR_CHAN_CONFIG_POS_PIN_ADDR_Msk \ | SAR_CHAN_CONFIG_POS_PORT_ADDR_Msk \ | SAR_CHAN_CONFIG_DIFFERENTIAL_EN_Msk \ | SAR_CHAN_CONFIG_AVG_EN_Msk \ | SAR_CHAN_CONFIG_SAMPLE_TIME_SEL_Msk \ | SAR_CHAN_CONFIG_NEG_PIN_ADDR_Msk \ | SAR_CHAN_CONFIG_NEG_PORT_ADDR_Msk \ | SAR_CHAN_CONFIG_NEG_ADDR_EN_Msk \ | SAR_CHAN_CONFIG_DSI_OUT_EN_Msk) #define CY_SAR_REG_SAMPLE_TIME_MASK (SAR_SAMPLE_TIME01_SAMPLE_TIME0_Msk | SAR_SAMPLE_TIME01_SAMPLE_TIME1_Msk) #define CY_SAR_2US_DELAY (2u) /**< Delay used in Enable API function to avoid SAR deadlock */ #define CY_SAR_10V_COUNTS (10.0F) /**< Value of 10 in volts */ #define CY_SAR_10MV_COUNTS (10000) /**< Value of 10 in millivolts */ #define CY_SAR_10UV_COUNTS (10000000L) /**< Value of 10 in microvolts */ #define CY_SAR_WRK_MAX_12BIT (0x00001000L) /**< Maximum SAR work register value for a 12-bit resolution */ #define CY_SAR_RANGE_LIMIT_MAX (0xFFFFUL) /**< Maximum value for the low and high range interrupt threshold values */ #define CY_SAR_CAP_TRIM_MAX (0x3FUL) /**< Maximum value for CAP_TRIM */ #define CY_SAR_CAP_TRIM_MIN (0x00UL) /**< Maximum value for CAP_TRIM */ #define CY_SAR_CAP_TRIM (0x0BUL) /**< Correct cap trim value */ /* Macros for conditions used in CY_ASSERT calls */ #define CY_SAR_CHANNUM(chan) ((chan) < CY_SAR_MAX_NUM_CHANNELS) /* legacy */ #define CY_SAR_CHANMASK(mask) (0UL == ((mask) & ~CY_SAR_CHANNELS_MASK)) #define CY_SAR_INJMASK(mask) (0UL == ((mask) & ~(CY_SAR_INJ_CHAN_MASK | CY_SAR_CHANNELS_MASK))) #define CY_SAR_RANGECOND(cond) ((cond) <= CY_SAR_RANGE_COND_OUTSIDE) #define CY_SAR_INTRMASK(mask) (0UL == ((mask) & ~CY_SAR_INTR)) #define CY_SAR_FIFO_INTRMASK(mask) (0UL == ((mask) & ~CY_SAR_INTR_FIFO)) #define CY_SAR_TRIGGER(mode) (((mode) == CY_SAR_TRIGGER_MODE_FW_ONLY) || \ ((mode) == CY_SAR_TRIGGER_MODE_FW_AND_HWEDGE) || \ ((mode) == CY_SAR_TRIGGER_MODE_FW_AND_HWLEVEL)) #define CY_SAR_RETURN(mode) (((mode) == CY_SAR_RETURN_STATUS) || \ ((mode) == CY_SAR_WAIT_FOR_RESULT) || \ ((mode) == CY_SAR_RETURN_STATUS_INJ) || \ ((mode) == CY_SAR_WAIT_FOR_RESULT_INJ)) #define CY_SAR_STARTCONVERT(mode) (((mode) == CY_SAR_START_CONVERT_SINGLE_SHOT) || ((mode) == CY_SAR_START_CONVERT_CONTINUOUS)) #define CY_SAR_RANGE_LIMIT(limit) ((limit) <= CY_SAR_RANGE_LIMIT_MAX) #define CY_SAR_SWITCHSELECT(select) ((select) == CY_SAR_MUX_SWITCH0) #define CY_SAR_SWITCHMASK(mask) ((mask) <= CY_SAR_CLEAR_ALL_SWITCHES) #define CY_SAR_SWITCHSTATE(state) (((state) == CY_SAR_SWITCH_OPEN) || ((state) == CY_SAR_SWITCH_CLOSE)) #define CY_SAR_SQMASK(mask) (((mask) & (~CY_SAR_DEINIT_SQ_CTRL)) == 0UL) #define CY_SAR_SQCTRL(ctrl) (((ctrl) == CY_SAR_SWITCH_SEQ_CTRL_ENABLE) || ((ctrl) == CY_SAR_SWITCH_SEQ_CTRL_DISABLE)) #define CY_SAR_CTRL(value) (((value) & (~CY_SAR_REG_CTRL_MASK)) == 0UL) #define CY_SAR_SAMPLE_CTRL(value) (((value) & (~CY_SAR_REG_SAMPLE_CTRL_MASK)) == 0UL) #define CY_SAR_SAMPLE_TIME(value) (((value) & (~CY_SAR_REG_SAMPLE_TIME_MASK)) == 0UL) #define CY_SAR_CHAN_CONFIG(value) (((value) & (~CY_SAR_REG_CHAN_CONFIG_MASK)) == 0UL) #define CY_SAR_IS_FIFO_LEVEL_VALID(level) ((level) <= PASS_FIFO_V2_LEVEL_LEVEL_Msk) #define CY_SAR_IS_CLK_VALID(clock) (((clock) == CY_SAR_CLK_PERI) || \ ((clock) == CY_SAR_CLK_DEEPSLEEP)) #define CY_SAR_IS_DSCLK(base) ((uint32_t)CY_SAR_CLK_DEEPSLEEP == _FLD2VAL(PASS_V2_SAR_CLOCK_SEL_CLOCK_SEL, PASS_SAR_CLOCK_SEL(base))) /** \endcond */ /** \} group_sar_macro */ /** \cond * These arrays exposed here for BWC * Not recommended to directly use in application code */ extern volatile int16_t Cy_SAR_offset[CY_SAR_NUM_CHANNELS][CY_SAR_INSTANCES]; extern volatile int32_t Cy_SAR_countsPer10Volt[CY_SAR_NUM_CHANNELS][CY_SAR_INSTANCES]; /** \endcond */ /** \addtogroup group_sar_enums * \{ */ /****************************************************************************** * Enumerations *****************************************************************************/ /** The SAR status/error code definitions */ typedef enum { CY_SAR_SUCCESS = 0x00UL, /**< Success */ CY_SAR_BAD_PARAM = CY_SAR_ID | CY_PDL_STATUS_ERROR | 0x01UL, /**< Invalid input parameters */ CY_SAR_TIMEOUT = CY_SAR_ID | CY_PDL_STATUS_ERROR | 0x02UL, /**< A timeout occurred */ CY_SAR_CONVERSION_NOT_COMPLETE = CY_SAR_ID | CY_PDL_STATUS_ERROR | 0x03UL, /**< SAR conversion is not complete */ } cy_en_sar_status_t; /** Definitions for starting a conversion used in \ref Cy_SAR_StartConvert */ typedef enum { CY_SAR_START_CONVERT_SINGLE_SHOT = 0UL, /**< Start a single scan (one shot) from firmware */ CY_SAR_START_CONVERT_CONTINUOUS = 1UL, /**< Continuously scan enabled channels and ignores all triggers, firmware or hardware */ } cy_en_sar_start_convert_sel_t; /** Definitions for the return mode used in \ref Cy_SAR_IsEndConversion */ typedef enum { CY_SAR_RETURN_STATUS = 0UL, /**< Immediately returns the conversion status. */ CY_SAR_WAIT_FOR_RESULT = 1UL, /**< Does not return a result until the conversion of all sequential channels is complete. This mode is blocking. */ CY_SAR_RETURN_STATUS_INJ = 2UL, /**< Immediately returns the conversion status of the injection channel. */ CY_SAR_WAIT_FOR_RESULT_INJ = 3UL, /**< Does not return a result until the conversion of injection channels is complete. This mode is blocking. */ } cy_en_sar_return_mode_t; /** Switch state definitions */ typedef enum { CY_SAR_SWITCH_OPEN = 0UL, /**< Open the switch */ CY_SAR_SWITCH_CLOSE = 1UL /**< Close the switch */ } cy_en_sar_switch_state_t; /** Definitions for sequencer control of switches */ typedef enum { CY_SAR_SWITCH_SEQ_CTRL_DISABLE = 0UL, /**< Disable sequencer control of switch */ CY_SAR_SWITCH_SEQ_CTRL_ENABLE = 1UL /**< Enable sequencer control of switch */ } cy_en_sar_switch_sar_seq_ctrl_t; /** Switch register selection for \ref Cy_SAR_SetAnalogSwitch and \ref Cy_SAR_GetAnalogSwitch */ typedef enum { CY_SAR_MUX_SWITCH0 = 0UL, /**< SARMUX switch control register */ } cy_en_sar_switch_register_sel_t; /** \addtogroup group_sar_ctrl_register_enums * This set of enumerations aids in configuring the SAR CTRL register * \{ */ /** Reference voltage buffer power mode definitions */ typedef enum { CY_SAR_VREF_PWR_100 = 0UL << SAR_CTRL_PWR_CTRL_VREF_Pos, /**< Full power (100%) */ CY_SAR_VREF_PWR_80 = 1UL << SAR_CTRL_PWR_CTRL_VREF_Pos, /**< 80% power */ CY_SAR_VREF_PWR_60 = 2UL << SAR_CTRL_PWR_CTRL_VREF_Pos, /**< 60% power */ CY_SAR_VREF_PWR_50 = 3UL << SAR_CTRL_PWR_CTRL_VREF_Pos, /**< 50% power */ CY_SAR_VREF_PWR_40 = 4UL << SAR_CTRL_PWR_CTRL_VREF_Pos, /**< 40% power */ CY_SAR_VREF_PWR_30 = 5UL << SAR_CTRL_PWR_CTRL_VREF_Pos, /**< 30% power */ CY_SAR_VREF_PWR_20 = 6UL << SAR_CTRL_PWR_CTRL_VREF_Pos, /**< 20% power */ CY_SAR_VREF_PWR_10 = 7UL << SAR_CTRL_PWR_CTRL_VREF_Pos, /**< 10% power */ } cy_en_sar_ctrl_pwr_ctrl_vref_t; /** Reference voltage selection definitions */ typedef enum { CY_SAR_VREF_SEL_BGR = 4UL << SAR_CTRL_VREF_SEL_Pos, /**< System wide bandgap from \ref group_sysanalog "AREF" (Vref buffer on) */ CY_SAR_VREF_SEL_EXT = 5UL << SAR_CTRL_VREF_SEL_Pos, /**< External Vref direct from a pin */ CY_SAR_VREF_SEL_VDDA_DIV_2 = 6UL << SAR_CTRL_VREF_SEL_Pos, /**< Vdda/2 (Vref buffer on) */ CY_SAR_VREF_SEL_VDDA = 7UL << SAR_CTRL_VREF_SEL_Pos /**< Vdda */ } cy_en_sar_ctrl_vref_sel_t; /** Vref bypass cap enable. * When enabled, a bypass capacitor should * be connected to the dedicated Vref pin of the device. * Refer to the device datasheet for the minimum bypass capacitor value to use. */ typedef enum { CY_SAR_BYPASS_CAP_DISABLE = 0UL << SAR_CTRL_VREF_BYP_CAP_EN_Pos, /**< Disable Vref bypass cap */ CY_SAR_BYPASS_CAP_ENABLE = 1UL << SAR_CTRL_VREF_BYP_CAP_EN_Pos /**< Enable Vref bypass cap */ } cy_en_sar_ctrl_bypass_cap_t; /** Negative terminal (Vminus) selection definitions for single-ended channels. * * The Vminus input for single ended channels can be connected to * Vref, VSSA, or routed out to an external pin. * The options for routing to a pin are through Pin 1, Pin 3, Pin 5, or Pin 7 * of the SARMUX dedicated port or an acore wire in AROUTE, if available on the device. * * \ref CY_SAR_NEG_SEL_VSSA_KELVIN comes straight from a Vssa pad without any shared branches * so as to keep quiet and avoid voltage drops. */ typedef enum { CY_SAR_NEG_SEL_VSSA_KELVIN = 0UL << SAR_CTRL_NEG_SEL_Pos, /**< Connect Vminus to VSSA_KELVIN */ CY_SAR_NEG_SEL_P1 = 2UL << SAR_CTRL_NEG_SEL_Pos, /**< Connect Vminus to Pin 1 of SARMUX dedicated port */ CY_SAR_NEG_SEL_P3 = 3UL << SAR_CTRL_NEG_SEL_Pos, /**< Connect Vminus to Pin 3 of SARMUX dedicated port */ CY_SAR_NEG_SEL_P5 = 4UL << SAR_CTRL_NEG_SEL_Pos, /**< Connect Vminus to Pin 5 of SARMUX dedicated port */ CY_SAR_NEG_SEL_P7 = 5UL << SAR_CTRL_NEG_SEL_Pos, /**< Connect Vminus to Pin 6 of SARMUX dedicated port */ CY_SAR_NEG_SEL_ACORE = 6UL << SAR_CTRL_NEG_SEL_Pos, /**< Connect Vminus to an ACORE in AROUTE */ CY_SAR_NEG_SEL_VREF = 7UL << SAR_CTRL_NEG_SEL_Pos, /**< Connect Vminus to VREF input of SARADC */ } cy_en_sar_ctrl_neg_sel_t; /** Enable hardware control of the switch between Vref and the Vminus input */ typedef enum { CY_SAR_CTRL_NEGVREF_FW_ONLY = 0UL << SAR_CTRL_SAR_HW_CTRL_NEGVREF_Pos, /**< Only firmware control of the switch */ CY_SAR_CTRL_NEGVREF_HW = 1UL << SAR_CTRL_SAR_HW_CTRL_NEGVREF_Pos /**< Enable hardware control of the switch */ } cy_en_sar_ctrl_hw_ctrl_negvref_t; /** Configure the comparator latch delay */ typedef enum { CY_SAR_CTRL_COMP_DLY_2P5 = 0UL << SAR_CTRL_COMP_DLY_Pos, /**< 2.5 ns delay, use for SAR conversion rate up to 2.5 Msps */ CY_SAR_CTRL_COMP_DLY_4 = 1UL << SAR_CTRL_COMP_DLY_Pos, /**< 4 ns delay, use for SAR conversion rate up to 2.0 Msps */ CY_SAR_CTRL_COMP_DLY_10 = 2UL << SAR_CTRL_COMP_DLY_Pos, /**< 10 ns delay, use for SAR conversion rate up to 1.5 Msps */ CY_SAR_CTRL_COMP_DLY_12 = 3UL << SAR_CTRL_COMP_DLY_Pos /**< 12 ns delay, use for SAR conversion rate up to 1 Msps */ } cy_en_sar_ctrl_comp_delay_t; /** Configure the comparator power mode */ typedef enum { CY_SAR_COMP_PWR_100 = 0UL << SAR_CTRL_COMP_PWR_Pos, /**< 100% power, use this for > 2 Msps */ CY_SAR_COMP_PWR_80 = 1UL << SAR_CTRL_COMP_PWR_Pos, /**< 80% power, use this for 1.5 - 2 Msps */ CY_SAR_COMP_PWR_60 = 2UL << SAR_CTRL_COMP_PWR_Pos, /**< 60% power, use this for 1.0 - 1.5 Msps */ CY_SAR_COMP_PWR_50 = 3UL << SAR_CTRL_COMP_PWR_Pos, /**< 50% power, use this for 500 ksps - 1 Msps */ CY_SAR_COMP_PWR_40 = 4UL << SAR_CTRL_COMP_PWR_Pos, /**< 40% power, use this for 250 - 500 ksps */ CY_SAR_COMP_PWR_30 = 5UL << SAR_CTRL_COMP_PWR_Pos, /**< 30% power, use this for 100 - 250 ksps */ CY_SAR_COMP_PWR_20 = 6UL << SAR_CTRL_COMP_PWR_Pos, /**< 20% power, use this for TDB sps */ CY_SAR_COMP_PWR_10 = 7UL << SAR_CTRL_COMP_PWR_Pos, /**< 10% power, use this for < 100 ksps */ } cy_en_sar_ctrl_comp_pwr_t; /** Enable or disable the SARMUX during Deep Sleep power mode. */ typedef enum { CY_SAR_DEEPSLEEP_SARMUX_OFF = 0UL << SAR_CTRL_DEEPSLEEP_ON_Pos, /**< Disable SARMUX operation during Deep Sleep */ CY_SAR_DEEPSLEEP_SARMUX_ON = 1UL << SAR_CTRL_DEEPSLEEP_ON_Pos /**< Enable SARMUX operation during Deep Sleep */ } cy_en_sar_ctrl_sarmux_deep_sleep_t; /** Enable or disable the SARSEQ control of routing switches */ typedef enum { CY_SAR_SARSEQ_SWITCH_ENABLE = 0UL << SAR_CTRL_SWITCH_DISABLE_Pos, /**< Enable the SARSEQ to change the routing switches defined in the channel configurations */ CY_SAR_SARSEQ_SWITCH_DISABLE = 1UL << SAR_CTRL_SWITCH_DISABLE_Pos /**< Disable the SARSEQ. It is up to the firmware to set the routing switches */ } cy_en_sar_ctrl_sarseq_routing_switches_t; /* \} */ /** \addtogroup group_sar_sample_ctrl_register_enums * This set of enumerations are used in configuring the SAR SAMPLE_CTRL register * \{ */ /** Configure result alignment, either left or right aligned. * * \note * Averaging always uses right alignment. If the \ref CY_SAR_LEFT_ALIGN * is selected with averaging enabled, it is ignored. * * \note * The voltage conversion functions (\ref Cy_SAR_CountsTo_Volts, \ref Cy_SAR_CountsTo_mVolts, * \ref Cy_SAR_CountsTo_uVolts) are only valid for right alignment. * */ typedef enum { CY_SAR_RIGHT_ALIGN = 0UL << SAR_SAMPLE_CTRL_LEFT_ALIGN_Pos, /**< Right align result data to bits [11:0] with sign extension to 16 bits if channel is signed */ CY_SAR_LEFT_ALIGN = 1UL << SAR_SAMPLE_CTRL_LEFT_ALIGN_Pos /**< Left align result data to bits [15:4] */ } cy_en_sar_sample_ctrl_result_align_t; /** Configure format, signed or unsigned, of single-ended channels */ typedef enum { CY_SAR_SINGLE_ENDED_UNSIGNED = 0UL << SAR_SAMPLE_CTRL_SINGLE_ENDED_SIGNED_Pos, /**< Result data for single-ended channels is unsigned */ CY_SAR_SINGLE_ENDED_SIGNED = 1UL << SAR_SAMPLE_CTRL_SINGLE_ENDED_SIGNED_Pos /**< Result data for single-ended channels is signed */ } cy_en_sar_sample_ctrl_single_ended_format_t; /** Configure format, signed or unsigned, of differential channels */ typedef enum { CY_SAR_DIFFERENTIAL_UNSIGNED = 0UL << SAR_SAMPLE_CTRL_DIFFERENTIAL_SIGNED_Pos, /**< Result data for differential channels is unsigned */ CY_SAR_DIFFERENTIAL_SIGNED = 1UL << SAR_SAMPLE_CTRL_DIFFERENTIAL_SIGNED_Pos /**< Result data for differential channels is signed */ } cy_en_sar_sample_ctrl_differential_format_t; /** Configure number of samples for averaging. * This applies only to channels with averaging enabled. */ typedef enum { CY_SAR_AVG_CNT_2 = 0UL << SAR_SAMPLE_CTRL_AVG_CNT_Pos, /**< Set samples averaged to 2 */ CY_SAR_AVG_CNT_4 = 1UL << SAR_SAMPLE_CTRL_AVG_CNT_Pos, /**< Set samples averaged to 4 */ CY_SAR_AVG_CNT_8 = 2UL << SAR_SAMPLE_CTRL_AVG_CNT_Pos, /**< Set samples averaged to 8 */ CY_SAR_AVG_CNT_16 = 3UL << SAR_SAMPLE_CTRL_AVG_CNT_Pos, /**< Set samples averaged to 16 */ CY_SAR_AVG_CNT_32 = 4UL << SAR_SAMPLE_CTRL_AVG_CNT_Pos, /**< Set samples averaged to 32 */ CY_SAR_AVG_CNT_64 = 5UL << SAR_SAMPLE_CTRL_AVG_CNT_Pos, /**< Set samples averaged to 64 */ CY_SAR_AVG_CNT_128 = 6UL << SAR_SAMPLE_CTRL_AVG_CNT_Pos, /**< Set samples averaged to 128 */ CY_SAR_AVG_CNT_256 = 7UL << SAR_SAMPLE_CTRL_AVG_CNT_Pos /**< Set samples averaged to 256 */ } cy_en_sar_sample_ctrl_avg_cnt_t; /** Configure the averaging mode. * * - Sequential accumulate and dump: a channel will be sampled back to back. * The result is added to a running sum in a 20-bit register. At the end * of the scan, the accumulated value is shifted right to fit into 16 bits * and stored into the CHAN_RESULT register. * - Sequential fixed: a channel will be sampled back to back. * The result is added to a running sum in a 20-bit register. At the end * of the scan, the accumulated value is shifted right to fit into 12 bits * and stored into the CHAN_RESULT register. * - Interleaved: a channel will be sampled once per scan. * The result is added to a running sum in a 16-bit register. * In the scan where the final averaging count is reached, * the accumulated value is shifted right to fit into 12 bits * and stored into the CHAN_RESULT register. * In all other scans, the CHAN_RESULT will have an invalid result. * In interleaved mode, make sure that the averaging * count is low enough to ensure that the intermediate value does not exceed 16 bits, * that is averaging count is 16 or less. Otherwise, the MSBs will be lost. * In the special case that averaging is enabled for all enabled channels * and interleaved mode is used, the interrupt frequency * will be reduced by a factor of the number of samples averaged. */ typedef enum { CY_SAR_AVG_MODE_SEQUENTIAL_ACCUM = 0UL, /**< Set mode to sequential accumulate and dump */ CY_SAR_AVG_MODE_SEQUENTIAL_FIXED = SAR_SAMPLE_CTRL_AVG_SHIFT_Msk, /**< Set mode to sequential 12-bit fixed */ CY_SAR_AVG_MODE_INTERLEAVED = SAR_SAMPLE_CTRL_AVG_MODE_Msk, /**< Set mode to interleaved. Number of samples per scan must be 16 or less. */ } cy_en_sar_sample_ctrl_avg_mode_t; /** Configure the trigger mode. * * Firmware triggering is always enabled and can be single shot or continuous. * Additionally, hardware triggering can be enabled with the option to be * edge or level sensitive. */ typedef enum { CY_SAR_TRIGGER_MODE_FW_ONLY = 0UL, /**< Firmware trigger only, disable hardware trigger*/ CY_SAR_TRIGGER_MODE_FW_AND_HWEDGE = SAR_SAMPLE_CTRL_DSI_TRIGGER_EN_Msk, /**< Enable edge sensitive hardware trigger. Each rising edge will trigger a single scan. */ CY_SAR_TRIGGER_MODE_FW_AND_HWLEVEL = SAR_SAMPLE_CTRL_DSI_TRIGGER_EN_Msk | SAR_SAMPLE_CTRL_DSI_TRIGGER_LEVEL_Msk, /**< Enable level sensitive hardware trigger. The SAR will continuously scan while the trigger signal is high. */ } cy_en_sar_sample_ctrl_trigger_mode_t; /* \} */ /** \addtogroup group_sar_sample_time_shift_enums * This set of enumerations aids in configuring the SAR SAMPLE_TIME* registers * \{ */ /** Configure the sample time by using these shifts */ typedef enum { CY_SAR_SAMPLE_TIME0_SHIFT = SAR_SAMPLE_TIME01_SAMPLE_TIME0_Pos, /**< Shift for sample time 0 */ CY_SAR_SAMPLE_TIME1_SHIFT = SAR_SAMPLE_TIME01_SAMPLE_TIME1_Pos, /**< Shift for sample time 1 */ CY_SAR_SAMPLE_TIME2_SHIFT = SAR_SAMPLE_TIME23_SAMPLE_TIME2_Pos, /**< Shift for sample time 2 */ CY_SAR_SAMPLE_TIME3_SHIFT = SAR_SAMPLE_TIME23_SAMPLE_TIME3_Pos, /**< Shift for sample time 3 */ } cy_en_sar_sample_time_shift_t; /* \} */ /** \addtogroup group_sar_range_thres_register_enums * This set of enumerations aids in configuring the SAR RANGE* registers * \{ */ /** Configure the lower and upper thresholds for range detection * * The SARSEQ supports range detection to allow for automatic detection of sample * values compared to two programmable thresholds without CPU involvement. * Range detection is defined by two global thresholds and a condition. * The RANGE_LOW value defines the lower threshold and RANGE_HIGH defines * the upper threshold of the range. * * Range detect is done after averaging, alignment, and sign extension (if applicable). * In other words, the thresholds values must have the same data format as the result data. * Range detection is always done for all channels scanned. By making RANGE_INTR_MASK=0, * the firmware can choose to ignore the range detect interrupt for any channel. */ typedef enum { CY_SAR_RANGE_LOW_SHIFT = SAR_RANGE_THRES_RANGE_LOW_Pos, /**< Shift for setting lower limit of range detection */ CY_SAR_RANGE_HIGH_SHIFT = SAR_RANGE_THRES_RANGE_HIGH_Pos, /**< Shift for setting upper limit of range detection */ } cy_en_sar_range_thres_shift_t; /** Configure the condition (below, inside, above, or outside) of the range detection interrupt */ typedef enum { CY_SAR_RANGE_COND_BELOW = 0UL, /**< Range interrupt detected when result < RANGE_LOW */ CY_SAR_RANGE_COND_INSIDE = 1UL, /**< Range interrupt detected when RANGE_LOW <= result < RANGE_HIGH */ CY_SAR_RANGE_COND_ABOVE = 2UL, /**< Range interrupt detected when RANGE_HIGH <= result */ CY_SAR_RANGE_COND_OUTSIDE = 3UL, /**< Range interrupt detected when result < RANGE_LOW || RANGE_HIGH <= result */ } cy_en_sar_range_detect_condition_t; /* \} */ /** \addtogroup group_sar_chan_config_register_enums * This set of enumerations aids in configuring the SAR CHAN_CONFIG register * \{ */ /** Configure the input mode of the channel * * - Single ended channel: the \ref cy_en_sar_ctrl_neg_sel_t selection in the \ref group_sar_init_struct_ctrl register * determines what drives the Vminus pin * - Differential paired: Vplus and Vminus are a pair. Bit 0 of \ref cy_en_sar_chan_config_pos_pin_addr_t "POS_PIN_ADDR" * is ignored and considered to be 0. * In other words, \ref cy_en_sar_chan_config_pos_pin_addr_t "POS_PIN_ADDR" points to the even pin of a pin pair. * The even pin is connected to Vplus and the odd pin is connected to Vminus. * \ref cy_en_sar_chan_config_pos_port_addr_t "POS_PORT_ADDR" is used to identify the port that contains the pins. * - Differential unpaired: The \ref cy_en_sar_chan_config_neg_pin_addr_t "NEG_PIN_ADDR" and * \ref cy_en_sar_chan_config_neg_port_addr_t "NEG_PORT_ADDR" determine what drives the Vminus pin. * This is a variation of differential mode with no even-odd pair limitation */ typedef enum { CY_SAR_CHAN_SINGLE_ENDED = 0UL, /**< Single ended channel */ CY_SAR_CHAN_DIFFERENTIAL_PAIRED = SAR_CHAN_CONFIG_DIFFERENTIAL_EN_Msk, /**< Differential with even-odd pair limitation */ CY_SAR_CHAN_DIFFERENTIAL_UNPAIRED = SAR_CHAN_CONFIG_NEG_ADDR_EN_Msk /**< Differential with no even-odd pair limitation */ } cy_en_sar_chan_config_input_mode_t; /** Configure address of the pin connected to the Vplus terminal of the SARADC. */ typedef enum { CY_SAR_CHAN_POS_PIN_ADDR_0 = 0UL, /**< Pin 0 on port specified in \ref cy_en_sar_chan_config_pos_port_addr_t */ CY_SAR_CHAN_POS_PIN_ADDR_1 = 1UL << SAR_CHAN_CONFIG_POS_PIN_ADDR_Pos, /**< Pin 1 on port specified in \ref cy_en_sar_chan_config_pos_port_addr_t */ CY_SAR_CHAN_POS_PIN_ADDR_2 = 2UL << SAR_CHAN_CONFIG_POS_PIN_ADDR_Pos, /**< Pin 2 on port specified in \ref cy_en_sar_chan_config_pos_port_addr_t */ CY_SAR_CHAN_POS_PIN_ADDR_3 = 3UL << SAR_CHAN_CONFIG_POS_PIN_ADDR_Pos, /**< Pin 3 on port specified in \ref cy_en_sar_chan_config_pos_port_addr_t */ CY_SAR_CHAN_POS_PIN_ADDR_4 = 4UL << SAR_CHAN_CONFIG_POS_PIN_ADDR_Pos, /**< Pin 4 on port specified in \ref cy_en_sar_chan_config_pos_port_addr_t */ CY_SAR_CHAN_POS_PIN_ADDR_5 = 5UL << SAR_CHAN_CONFIG_POS_PIN_ADDR_Pos, /**< Pin 5 on port specified in \ref cy_en_sar_chan_config_pos_port_addr_t */ CY_SAR_CHAN_POS_PIN_ADDR_6 = 6UL << SAR_CHAN_CONFIG_POS_PIN_ADDR_Pos, /**< Pin 6 on port specified in \ref cy_en_sar_chan_config_pos_port_addr_t */ CY_SAR_CHAN_POS_PIN_ADDR_7 = 7UL << SAR_CHAN_CONFIG_POS_PIN_ADDR_Pos, /**< Pin 7 on port specified in \ref cy_en_sar_chan_config_pos_port_addr_t */ } cy_en_sar_chan_config_pos_pin_addr_t; /** Configure address of the port that contains the pin connected to the Vplus terminal of the SARADC * * - \ref CY_SAR_POS_PORT_ADDR_SARMUX is for the dedicated SARMUX port (8 pins) * - Port 1 through 4 are respectively the pins of CTB0, CTB1, CTB2, and CTB3 (if present) * - Port 7, 5, and 6 (VPORT0/1/2) are the groups of internal signals that can be selected * in the SARMUX or AROUTE (if present). * * See the \ref group_sar_sarmux section for more guidance. */ typedef enum { CY_SAR_POS_PORT_ADDR_SARMUX = 0UL, /**< Dedicated SARMUX port with 8 possible pins */ CY_SAR_POS_PORT_ADDR_CTB0 = 1UL << SAR_CHAN_CONFIG_POS_PORT_ADDR_Pos, /**< Outputs from CTB0, if present */ CY_SAR_POS_PORT_ADDR_CTB1 = 2UL << SAR_CHAN_CONFIG_POS_PORT_ADDR_Pos, /**< Outputs from CTB1, if present */ CY_SAR_POS_PORT_ADDR_CTB2 = 3UL << SAR_CHAN_CONFIG_POS_PORT_ADDR_Pos, /**< Outputs from CTB2, if present */ CY_SAR_POS_PORT_ADDR_CTB3 = 4UL << SAR_CHAN_CONFIG_POS_PORT_ADDR_Pos, /**< Outputs from CTB3, if present */ CY_SAR_POS_PORT_ADDR_AROUTE_VIRT2 = 5UL << SAR_CHAN_CONFIG_POS_PORT_ADDR_Pos, /**< AROUTE virtual port (VPORT2), if present */ CY_SAR_POS_PORT_ADDR_AROUTE_VIRT1 = 6UL << SAR_CHAN_CONFIG_POS_PORT_ADDR_Pos, /**< AROUTE virtual port (VPORT1), if present */ CY_SAR_POS_PORT_ADDR_SARMUX_VIRT = 7UL << SAR_CHAN_CONFIG_POS_PORT_ADDR_Pos, /**< SARMUX virtual port for DieTemp and AMUXBUSA/B */ } cy_en_sar_chan_config_pos_port_addr_t; /** Enable or disable averaging for the channel */ typedef enum { CY_SAR_CHAN_AVG_DISABLE = 0UL, /**< Disable averaging for the channel */ CY_SAR_CHAN_AVG_ENABLE = 1UL << SAR_CHAN_CONFIG_AVG_EN_Pos /**< Enable averaging for the channel */ } cy_en_sar_chan_config_avg_en_t; /** Select which sample time to use for the channel. * There are four global samples times available set by \ref group_sar_init_struct_sampleTime01 and * \ref group_sar_init_struct_sampleTime23. */ typedef enum { CY_SAR_CHAN_SAMPLE_TIME_0 = 0UL, /**< Use sample time 0 for the channel */ CY_SAR_CHAN_SAMPLE_TIME_1 = 1UL << SAR_CHAN_CONFIG_SAMPLE_TIME_SEL_Pos, /**< Use sample time 1 for the channel */ CY_SAR_CHAN_SAMPLE_TIME_2 = 2UL << SAR_CHAN_CONFIG_SAMPLE_TIME_SEL_Pos, /**< Use sample time 2 for the channel */ CY_SAR_CHAN_SAMPLE_TIME_3 = 3UL << SAR_CHAN_CONFIG_SAMPLE_TIME_SEL_Pos, /**< Use sample time 3 for the channel */ } cy_en_sar_chan_config_sample_time_t; /** Configure address of the pin connected to the Vminus terminal of the SARADC. */ typedef enum { CY_SAR_CHAN_NEG_PIN_ADDR_0 = 0UL, /**< Pin 0 on port specified in \ref cy_en_sar_chan_config_neg_port_addr_t */ CY_SAR_CHAN_NEG_PIN_ADDR_1 = 1UL << SAR_CHAN_CONFIG_NEG_PIN_ADDR_Pos, /**< Pin 1 on port specified in \ref cy_en_sar_chan_config_neg_port_addr_t */ CY_SAR_CHAN_NEG_PIN_ADDR_2 = 2UL << SAR_CHAN_CONFIG_NEG_PIN_ADDR_Pos, /**< Pin 2 on port specified in \ref cy_en_sar_chan_config_neg_port_addr_t */ CY_SAR_CHAN_NEG_PIN_ADDR_3 = 3UL << SAR_CHAN_CONFIG_NEG_PIN_ADDR_Pos, /**< Pin 3 on port specified in \ref cy_en_sar_chan_config_neg_port_addr_t */ CY_SAR_CHAN_NEG_PIN_ADDR_4 = 4UL << SAR_CHAN_CONFIG_NEG_PIN_ADDR_Pos, /**< Pin 4 on port specified in \ref cy_en_sar_chan_config_neg_port_addr_t */ CY_SAR_CHAN_NEG_PIN_ADDR_5 = 5UL << SAR_CHAN_CONFIG_NEG_PIN_ADDR_Pos, /**< Pin 5 on port specified in \ref cy_en_sar_chan_config_neg_port_addr_t */ CY_SAR_CHAN_NEG_PIN_ADDR_6 = 6UL << SAR_CHAN_CONFIG_NEG_PIN_ADDR_Pos, /**< Pin 6 on port specified in \ref cy_en_sar_chan_config_neg_port_addr_t */ CY_SAR_CHAN_NEG_PIN_ADDR_7 = 7UL << SAR_CHAN_CONFIG_NEG_PIN_ADDR_Pos, /**< Pin 7 on port specified in \ref cy_en_sar_chan_config_neg_port_addr_t */ } cy_en_sar_chan_config_neg_pin_addr_t; /** Configure address of the port that contains the pin connected to the Vminus terminal of the SARADC. * * - Port 0 is 8 pins of the SARMUX * - Port 7, 5, and 6 (VPORT0/1/2) are the groups of internal signals that can be selected * in the SARMUX or AROUTE (if present). */ typedef enum { CY_SAR_NEG_PORT_ADDR_SARMUX = 0UL, /**< Dedicated SARMUX port with 8 possible pins */ CY_SAR_NEG_PORT_ADDR_AROUTE_VIRT2 = 5UL << SAR_CHAN_CONFIG_POS_PORT_ADDR_Pos, /**< AROUTE virtual port (VPORT2), if present */ CY_SAR_NEG_PORT_ADDR_AROUTE_VIRT1 = 6UL << SAR_CHAN_CONFIG_POS_PORT_ADDR_Pos, /**< AROUTE virtual port (VPORT1), if present */ CY_SAR_NEG_PORT_ADDR_SARMUX_VIRT = 7UL << SAR_CHAN_CONFIG_POS_PORT_ADDR_Pos, /**< SARMUX virtual port for AMUXBUSA/B */ } cy_en_sar_chan_config_neg_port_addr_t; /** Configure address of the port that contains the pin connected to the Vplus terminal of the injection channel * * - \ref CY_SAR_INJ_PORT_ADDR_SARMUX is for the dedicated SARMUX port (8 pins) * - Ports 1 through 4 are respectively the pins of CTB0, CTB1, CTB2, and CTB3 (if present) * - Ports 7 and 6 are the groups of internal signals that can be selected * in the SARMUX or AROUTE (if present). * * See the \ref group_sar_sarmux section for more guidance. */ typedef enum { CY_SAR_INJ_PORT_ADDR_SARMUX = 0UL, /**< Dedicated SARMUX port with 8 possible pins */ CY_SAR_INJ_PORT_ADDR_CTB0 = 1UL << SAR_INJ_CHAN_CONFIG_INJ_PORT_ADDR_Pos, /**< Outputs from CTB0, if present */ CY_SAR_INJ_PORT_ADDR_CTB1 = 2UL << SAR_INJ_CHAN_CONFIG_INJ_PORT_ADDR_Pos, /**< Outputs from CTB1, if present */ CY_SAR_INJ_PORT_ADDR_CTB2 = 3UL << SAR_INJ_CHAN_CONFIG_INJ_PORT_ADDR_Pos, /**< Outputs from CTB2, if present */ CY_SAR_INJ_PORT_ADDR_CTB3 = 4UL << SAR_INJ_CHAN_CONFIG_INJ_PORT_ADDR_Pos, /**< Outputs from CTB3, if present */ CY_SAR_INJ_PORT_ADDR_AROUTE_VIRT = 6UL << SAR_INJ_CHAN_CONFIG_INJ_PORT_ADDR_Pos, /**< AROUTE virtual port (VPORT), if present */ CY_SAR_INJ_PORT_ADDR_SARMUX_VIRT = 7UL << SAR_INJ_CHAN_CONFIG_INJ_PORT_ADDR_Pos, /**< SARMUX virtual port for DieTemp and AMUXBUSA/B */ } cy_en_sar_inj_chan_config_port_addr_t; /* \} */ /** \cond left here for BWC, deprecated for new designs */ typedef enum { CY_SAR_INTR_MASK_NONE = 0UL, CY_SAR_INTR_EOS_MASK = SAR_INTR_MASK_EOS_MASK_Msk, CY_SAR_INTR_OVERFLOW_MASK = SAR_INTR_MASK_OVERFLOW_MASK_Msk, CY_SAR_INTR_FW_COLLISION_MASK = SAR_INTR_MASK_FW_COLLISION_MASK_Msk, } cy_en_sar_intr_mask_t; /* \endcond */ /** \addtogroup group_sar_mux_switch_register_enums * This set of enumerations aids in configuring the \ref group_sar_init_struct_muxSwitch and \ref group_sar_init_struct_muxSwitchSqCtrl registers * \{ */ /** Firmware control for the SARMUX switches to connect analog signals to the SAR ADC * * To close multiple switches, "OR" the enum values together. * * See the \ref group_sar_sarmux section for more guidance. */ typedef enum { /* SARMUX pins to Vplus */ CY_SAR_MUX_FW_P0_VPLUS = SAR_MUX_SWITCH0_MUX_FW_P0_VPLUS_Msk, /**< Switch between Pin 0 of SARMUX and Vplus of SARADC */ CY_SAR_MUX_FW_P1_VPLUS = SAR_MUX_SWITCH0_MUX_FW_P1_VPLUS_Msk, /**< Switch between Pin 1 of SARMUX and Vplus of SARADC */ CY_SAR_MUX_FW_P2_VPLUS = SAR_MUX_SWITCH0_MUX_FW_P2_VPLUS_Msk, /**< Switch between Pin 2 of SARMUX and Vplus of SARADC */ CY_SAR_MUX_FW_P3_VPLUS = SAR_MUX_SWITCH0_MUX_FW_P3_VPLUS_Msk, /**< Switch between Pin 3 of SARMUX and Vplus of SARADC */ CY_SAR_MUX_FW_P4_VPLUS = SAR_MUX_SWITCH0_MUX_FW_P4_VPLUS_Msk, /**< Switch between Pin 4 of SARMUX and Vplus of SARADC */ CY_SAR_MUX_FW_P5_VPLUS = SAR_MUX_SWITCH0_MUX_FW_P5_VPLUS_Msk, /**< Switch between Pin 5 of SARMUX and Vplus of SARADC */ CY_SAR_MUX_FW_P6_VPLUS = SAR_MUX_SWITCH0_MUX_FW_P6_VPLUS_Msk, /**< Switch between Pin 6 of SARMUX and Vplus of SARADC */ CY_SAR_MUX_FW_P7_VPLUS = SAR_MUX_SWITCH0_MUX_FW_P7_VPLUS_Msk, /**< Switch between Pin 7 of SARMUX and Vplus of SARADC */ /* SARMUX pins to Vminus */ CY_SAR_MUX_FW_P0_VMINUS = SAR_MUX_SWITCH0_MUX_FW_P0_VMINUS_Msk, /**< Switch between Pin 0 of SARMUX and Vminus of SARADC */ CY_SAR_MUX_FW_P1_VMINUS = SAR_MUX_SWITCH0_MUX_FW_P1_VMINUS_Msk, /**< Switch between Pin 1 of SARMUX and Vminus of SARADC */ CY_SAR_MUX_FW_P2_VMINUS = SAR_MUX_SWITCH0_MUX_FW_P2_VMINUS_Msk, /**< Switch between Pin 2 of SARMUX and Vminus of SARADC */ CY_SAR_MUX_FW_P3_VMINUS = SAR_MUX_SWITCH0_MUX_FW_P3_VMINUS_Msk, /**< Switch between Pin 3 of SARMUX and Vminus of SARADC */ CY_SAR_MUX_FW_P4_VMINUS = SAR_MUX_SWITCH0_MUX_FW_P4_VMINUS_Msk, /**< Switch between Pin 4 of SARMUX and Vminus of SARADC */ CY_SAR_MUX_FW_P5_VMINUS = SAR_MUX_SWITCH0_MUX_FW_P5_VMINUS_Msk, /**< Switch between Pin 5 of SARMUX and Vminus of SARADC */ CY_SAR_MUX_FW_P6_VMINUS = SAR_MUX_SWITCH0_MUX_FW_P6_VMINUS_Msk, /**< Switch between Pin 6 of SARMUX and Vminus of SARADC */ CY_SAR_MUX_FW_P7_VMINUS = SAR_MUX_SWITCH0_MUX_FW_P7_VMINUS_Msk, /**< Switch between Pin 7 of SARMUX and Vminus of SARADC */ /* Vssa to Vminus and temperature sensor to Vplus */ CY_SAR_MUX_FW_VSSA_VMINUS = SAR_MUX_SWITCH0_MUX_FW_VSSA_VMINUS_Msk, /**< Switch between VSSA and Vminus of SARADC */ CY_SAR_MUX_FW_TEMP_VPLUS = SAR_MUX_SWITCH0_MUX_FW_TEMP_VPLUS_Msk, /**< Switch between the DieTemp sensor and vplus of SARADC */ /* Amuxbus A and B to Vplus and Vminus */ CY_SAR_MUX_FW_AMUXBUSA_VPLUS = SAR_MUX_SWITCH0_MUX_FW_AMUXBUSA_VPLUS_Msk, /**< Switch between AMUXBUSA and vplus of SARADC */ CY_SAR_MUX_FW_AMUXBUSB_VPLUS = SAR_MUX_SWITCH0_MUX_FW_AMUXBUSB_VPLUS_Msk, /**< Switch between AMUXBUSB and vplus of SARADC */ CY_SAR_MUX_FW_AMUXBUSA_VMINUS = SAR_MUX_SWITCH0_MUX_FW_AMUXBUSA_VMINUS_Msk, /**< Switch between AMUXBUSA and vminus of SARADC */ CY_SAR_MUX_FW_AMUXBUSB_VMINUS = SAR_MUX_SWITCH0_MUX_FW_AMUXBUSB_VMINUS_Msk, /**< Switch between AMUXBUSB and vminus of SARADC */ /* Sarbus 0 and 1 to Vplus and Vminus */ CY_SAR_MUX_FW_SARBUS0_VPLUS = SAR_MUX_SWITCH0_MUX_FW_SARBUS0_VPLUS_Msk, /**< Switch between SARBUS0 and vplus of SARADC */ CY_SAR_MUX_FW_SARBUS1_VPLUS = SAR_MUX_SWITCH0_MUX_FW_SARBUS1_VPLUS_Msk, /**< Switch between SARBUS1 and vplus of SARADC */ CY_SAR_MUX_FW_SARBUS0_VMINUS = SAR_MUX_SWITCH0_MUX_FW_SARBUS0_VMINUS_Msk, /**< Switch between SARBUS0 and vminus of SARADC */ CY_SAR_MUX_FW_SARBUS1_VMINUS = SAR_MUX_SWITCH0_MUX_FW_SARBUS1_VMINUS_Msk, /**< Switch between SARBUS1 and vminus of SARADC */ /* SARMUX pins to Core IO */ CY_SAR_MUX_FW_P4_COREIO0 = SAR_MUX_SWITCH0_MUX_FW_P4_COREIO0_Msk, /**< Switch between Pin 4 of SARMUX and coreio0, if present */ CY_SAR_MUX_FW_P5_COREIO1 = SAR_MUX_SWITCH0_MUX_FW_P5_COREIO1_Msk, /**< Switch between Pin 5 of SARMUX and coreio1, if present */ CY_SAR_MUX_FW_P6_COREIO2 = SAR_MUX_SWITCH0_MUX_FW_P6_COREIO2_Msk, /**< Switch between Pin 6 of SARMUX and coreio2, if present */ CY_SAR_MUX_FW_P7_COREIO3 = SAR_MUX_SWITCH0_MUX_FW_P7_COREIO3_Msk, /**< Switch between Pin 7 of SARMUX and coreio3, if present */ } cy_en_sar_mux_switch_fw_ctrl_t; /** Mask definitions of SARMUX switches that can be controlled by the SARSEQ. * * To enable sequencer control of multiple switches, "OR" the enum values together. * * See the \ref group_sar_sarmux section for more guidance. */ typedef enum { CY_SAR_MUX_SQ_CTRL_P0 = SAR_MUX_SWITCH_SQ_CTRL_MUX_SQ_CTRL_P0_Msk, /**< Enable SARSEQ control of Pin 0 switches (for Vplus and Vminus) of SARMUX dedicated port */ CY_SAR_MUX_SQ_CTRL_P1 = SAR_MUX_SWITCH_SQ_CTRL_MUX_SQ_CTRL_P1_Msk, /**< Enable SARSEQ control of Pin 1 switches (for Vplus and Vminus) of SARMUX dedicated port */ CY_SAR_MUX_SQ_CTRL_P2 = SAR_MUX_SWITCH_SQ_CTRL_MUX_SQ_CTRL_P2_Msk, /**< Enable SARSEQ control of Pin 2 switches (for Vplus and Vminus) of SARMUX dedicated port */ CY_SAR_MUX_SQ_CTRL_P3 = SAR_MUX_SWITCH_SQ_CTRL_MUX_SQ_CTRL_P3_Msk, /**< Enable SARSEQ control of Pin 3 switches (for Vplus and Vminus) of SARMUX dedicated port */ CY_SAR_MUX_SQ_CTRL_P4 = SAR_MUX_SWITCH_SQ_CTRL_MUX_SQ_CTRL_P4_Msk, /**< Enable SARSEQ control of Pin 4 switches (for Vplus and Vminus) of SARMUX dedicated port */ CY_SAR_MUX_SQ_CTRL_P5 = SAR_MUX_SWITCH_SQ_CTRL_MUX_SQ_CTRL_P5_Msk, /**< Enable SARSEQ control of Pin 5 switches (for Vplus and Vminus) of SARMUX dedicated port */ CY_SAR_MUX_SQ_CTRL_P6 = SAR_MUX_SWITCH_SQ_CTRL_MUX_SQ_CTRL_P6_Msk, /**< Enable SARSEQ control of Pin 6 switches (for Vplus and Vminus) of SARMUX dedicated port */ CY_SAR_MUX_SQ_CTRL_P7 = SAR_MUX_SWITCH_SQ_CTRL_MUX_SQ_CTRL_P7_Msk, /**< Enable SARSEQ control of Pin 7 switches (for Vplus and Vminus) of SARMUX dedicated port */ CY_SAR_MUX_SQ_CTRL_VSSA = SAR_MUX_SWITCH_SQ_CTRL_MUX_SQ_CTRL_VSSA_Msk, /**< Enable SARSEQ control of the switch between VSSA and Vminus */ CY_SAR_MUX_SQ_CTRL_TEMP = SAR_MUX_SWITCH_SQ_CTRL_MUX_SQ_CTRL_TEMP_Msk, /**< Enable SARSEQ control of the switch between DieTemp and Vplus */ CY_SAR_MUX_SQ_CTRL_AMUXBUSA = SAR_MUX_SWITCH_SQ_CTRL_MUX_SQ_CTRL_AMUXBUSA_Msk, /**< Enable SARSEQ control of AMUXBUSA switches (for Vplus and Vminus) */ CY_SAR_MUX_SQ_CTRL_AMUXBUSB = SAR_MUX_SWITCH_SQ_CTRL_MUX_SQ_CTRL_AMUXBUSB_Msk, /**< Enable SARSEQ control of AMUXBUSB switches (for Vplus and Vminus) */ CY_SAR_MUX_SQ_CTRL_SARBUS0 = SAR_MUX_SWITCH_SQ_CTRL_MUX_SQ_CTRL_SARBUS0_Msk, /**< Enable SARSEQ control of SARBUS0 switches (for Vplus and Vminus) */ CY_SAR_MUX_SQ_CTRL_SARBUS1 = SAR_MUX_SWITCH_SQ_CTRL_MUX_SQ_CTRL_SARBUS1_Msk, /**< Enable SARSEQ control of SARBUS1 switches (for Vplus and Vminus) */ } cy_en_sar_mux_switch_sq_ctrl_t; /* \} */ /** For PASS_V2 the SAR clock can come from: * - one of the CLK_PERI dividers * - PASS Deep Sleep Clock (CLK_DPSLP) */ typedef enum { CY_SAR_CLK_PERI = 0UL, /**< SAR clock source is one of \ref group_sysclk "PERI" dividers (SAR is only operational in chip ACTIVE mode) */ CY_SAR_CLK_DEEPSLEEP = 1UL /**< SAR clock source is \ref group_sysanalog_dpslp "CLK_DPSLP" (SAR can be operational in both chip ACTIVE and DEEPSLEEP modes) */ } cy_en_sar_clock_source_t; /** Definitions for simultaneous scan trigger signal event selection */ typedef enum { CY_SAR_SIMULT_TRIG_EVENT_EDGE = 0UL, /**< Positive edge detected on the trigger signal triggers a new scan */ CY_SAR_SIMULT_TRIG_EVENT_LEVEL = 1UL, /**< SAR will do continuous scans as long as the trigger signal remains high */ } cy_en_sar_simult_trig_event_sel_t; /** Definitions for simultaneous scan trigger synchronization */ typedef enum { CY_SAR_SIMULT_TRIG_SYNC_NONE = 0UL, /**< Bypass clock domain synchronization of the simultaneous trigger signal */ CY_SAR_SIMULT_TRIG_SYNC_SAR_CLOCK = 1UL, /**< Synchronize the simultaneous trigger signal to the SAR clock domain */ } cy_en_sar_simult_trig_sync_sel_t; /** Definitions for simultaneous scan sampling mode */ typedef enum { CY_SAR_SIMULT_TRIG_SAMPLE_SINGLE = 0UL, /**< Perform single scan on the trigger event */ CY_SAR_SIMULT_TRIG_SAMPLE_SCAN_CNT = 1UL, /**< On the trigger event perform number of scans, specified by scanCount */ } cy_en_sar_simult_trig_sample_sel_t; /** Definitions for simultaneous scan interrupt generation */ typedef enum { CY_SAR_SIMULT_TRIG_INTR_EOS = 0UL, /**< Generate interrupt on each End of Sample event */ CY_SAR_SIMULT_TRIG_INTR_SCAN_CNT = 1UL, /**< Generate interrupt on End of Sample event only when sample number = scanCount */ }cy_en_sar_simult_trig_intr_sel_t; /** \} group_sar_enums */ /** \addtogroup group_sar_data_structures * \{ */ /*************************************** * Configuration Structures ***************************************/ /** FIFO configuration structure **/ typedef struct { bool chanId; /**< Enable the channel ID in the results */ bool chainToNext; /**< Chain the FIFO to the next FIFO */ bool clrTrIntrOnRead; /**< Enable the FIFO level trigger (and optional level interrupt) clearing on FIFO read */ uint32_t level; /**< A trigger (and optional interrupt) event occurs when the number of FIFO entries overcomes the Level setting. Range: 1..256 */ bool trOut; /**< SAR output trigger is set by the 'level' condition */ } cy_stc_sar_fifo_config_t; /** This structure is used to initialize the SAR ADC subsystem. * * The SAR ADC subsystem is highly configurable with many options. * When calling \ref Cy_SAR_Init, provide a pointer to the structure containing this configuration data. * A set of enumerations is provided in this * driver to help with configuring this structure. * * See the \ref group_sar_initialization section for guidance. **/ typedef struct { uint32_t ctrl; /**< Control register settings (applies to all channels) */ uint32_t sampleCtrl; /**< Sample control register settings (applies to all channels) */ uint32_t sampleTime01; /**< Sample time in ADC clocks for Sample Time 0 and 1 */ uint32_t sampleTime23; /**< Sample time in ADC clocks for Sample Time 2 and 3 */ uint32_t rangeThres; /**< Range detect threshold register for all channels */ cy_en_sar_range_detect_condition_t rangeCond; /**< Range detect condition (below, inside, output, or above) for all channels */ uint32_t chanEn; /**< Enable bits for the channels */ uint32_t chanConfig[CY_SAR_NUM_CHANNELS]; /**< Channel configuration */ uint32_t intrMask; /**< Interrupt enable mask */ uint32_t satIntrMask; /**< Saturation detection interrupt enable mask */ uint32_t rangeIntrMask; /**< Range detection interrupt enable mask */ uint32_t muxSwitch; /**< SARMUX firmware switches to connect analog signals to SAR */ uint32_t muxSwitchSqCtrl; /**< Enable SARSEQ control of specific SARMUX switches */ bool configRouting; /**< Configure or ignore routing related registers (muxSwitch, muxSwitchSqCtrl) */ uint32_t vrefMvValue; /**< Reference voltage in millivolts used in converting counts to volts */ cy_en_sar_clock_source_t clock; /**< Clock source selection (enable/disable SAR operation in the Deep Sleep mode). Ignored for PASS_ver1. */ cy_stc_sar_fifo_config_t const * fifoCfgPtr; /**< Pointer to the FIFO configuration structure \ref cy_stc_sar_fifo_config_t, if NULL - the FIFO is not used. Should be NULL for PASS_ver1. */ bool trTimer; /**< SAR is being triggered from the Timer \ref group_sysanalog_timer . Ignored for PASS_ver1. */ bool scanCnt; /**< Enable the scanning counter, configured by \ref Cy_SAR_CommonInit. Ignored for PASS_ver1. */ bool scanCntIntr; /**< EOS interrupt on scanning counter event. Ignored for PASS_ver1. */ } cy_stc_sar_config_t; /** SAR triggering configuration structure */ typedef struct { uint32_t pwrUpDelay; /**< Power up delay for SAR blocks in Deep Sleep Clock cycles. Range 0..255. */ uint32_t scanCount; /**< Configures the number of samples SAR will take when triggered. Range 1..256. */ uint32_t simultControl; /**< Configures the SAR ADCs for simultaneous control. The value is a combined mask, created using following macros: * - CY_SAR_SAR0 * - CY_SAR_SAR1 * - CY_SAR_SAR2 * - CY_SAR_SAR3 * See \ref group_sysanalog_sar_select */ uint32_t simultTrigSource; /**< Configures the trigger source for simultaneous SAR hardware trigger. Use one of the following values: * - CY_SAR_SAR0 * - CY_SAR_SAR1 * - CY_SAR_SAR2 * - CY_SAR_SAR3 * - CY_SAR_TIMER * See \ref group_sysanalog_sar_select */ cy_en_sar_simult_trig_event_sel_t simultTrigEvent; /**< Configures simultaneous trigger signal event */ cy_en_sar_simult_trig_sync_sel_t simultTrigSync; /**< Enables synchronization of trigger signal */ cy_en_sar_simult_trig_sample_sel_t simultSamplesPerTrigger; /**< Configures scan sampling mode for each trigger event */ cy_en_sar_simult_trig_intr_sel_t simultEOSIntrSelect; /**< Configures EOS interrupt condition */ }cy_stc_sar_common_config_t ; /** This structure is used by the driver to backup the state of the SAR * before entering sleep so that it can be re-enabled after waking up */ typedef struct { uint32_t hwEnabled; /**< SAR enabled state */ uint32_t continuous; /**< State of the continuous bit */ } cy_stc_sar_state_backup_t; /** Structure to read the FIFO buffer */ typedef struct { uint16_t value; /**< SAR sample */ uint16_t channel; /**< SAR channel */ } cy_stc_sar_fifo_read_t; /** \} group_sar_data_structures */ /** \addtogroup group_sar_functions * \{ */ /** This macro is for backward compatibility macro for driver v1.10 and before, * the preferred API is \ref Cy_SAR_DeepSleep */ #define Cy_SAR_Sleep Cy_SAR_DeepSleep /*************************************** * Function Prototypes ***************************************/ /** \addtogroup group_sar_functions_trig * This set of functions is for initialization and usage of SAR common settings * and simultaneous triggering. * \{ */ cy_en_sar_status_t Cy_SAR_CommonInit(PASS_Type *base, const cy_stc_sar_common_config_t * trigConfig); __STATIC_INLINE void Cy_SAR_SimultStart(PASS_Type *base, uint32_t sarMask, cy_en_sar_start_convert_sel_t mode); __STATIC_INLINE void Cy_SAR_SimultStop(PASS_Type *base, uint32_t sarMask); /** \} */ /** \addtogroup group_sar_functions_basic * This set of functions is for initialization and basic usage * \{ */ cy_en_sar_status_t Cy_SAR_Init(SAR_Type *base, const cy_stc_sar_config_t *config); cy_en_sar_status_t Cy_SAR_DeInit(SAR_Type *base, bool deInitRouting); void Cy_SAR_Enable(SAR_Type *base); void Cy_SAR_Disable(SAR_Type *base); void Cy_SAR_StartConvert(SAR_Type *base, cy_en_sar_start_convert_sel_t startSelect); void Cy_SAR_StopConvert(SAR_Type *base); cy_en_sar_status_t Cy_SAR_IsEndConversion(SAR_Type *base, cy_en_sar_return_mode_t retMode); int16_t Cy_SAR_GetResult16(const SAR_Type *base, uint32_t chan); int32_t Cy_SAR_GetResult32(const SAR_Type *base, uint32_t chan); __STATIC_INLINE uint32_t Cy_SAR_GetChanResultUpdated(const SAR_Type *base); __STATIC_INLINE void Cy_SAR_EnableInjection(SAR_Type *base, bool tailgating); /** \} */ /** \addtogroup group_sar_functions_power * This set of functions is for Deep Sleep entry and exit * \{ */ cy_en_syspm_status_t Cy_SAR_DeepSleepCallback(const cy_stc_syspm_callback_params_t *callbackParams, cy_en_syspm_callback_mode_t mode); void Cy_SAR_DeepSleep(SAR_Type *base); void Cy_SAR_Wakeup(SAR_Type *base); /** \} */ /** \addtogroup group_sar_functions_config * This set of functions allows changes to the SAR configuration * after initialization. * \{ */ void Cy_SAR_SetConvertMode(SAR_Type *base, cy_en_sar_sample_ctrl_trigger_mode_t mode); __STATIC_INLINE void Cy_SAR_SetChanMask(SAR_Type *base, uint32_t enableMask); void Cy_SAR_SetLowLimit(SAR_Type *base, uint32_t lowLimit); void Cy_SAR_SetHighLimit(SAR_Type *base, uint32_t highLimit); __STATIC_INLINE void Cy_SAR_SetRangeCond(SAR_Type *base, cy_en_sar_range_detect_condition_t cond); /** \} */ /** \addtogroup group_sar_functions_countsto * This set of functions performs counts to *volts conversions. * \{ */ int16_t Cy_SAR_RawCounts2Counts(const SAR_Type *base, uint32_t chan, int16_t adcCounts); float32_t Cy_SAR_CountsTo_Volts(const SAR_Type *base, uint32_t chan, int16_t adcCounts); int16_t Cy_SAR_CountsTo_mVolts(const SAR_Type *base, uint32_t chan, int16_t adcCounts); int32_t Cy_SAR_CountsTo_uVolts(const SAR_Type *base, uint32_t chan, int16_t adcCounts); cy_en_sar_status_t Cy_SAR_SetChannelOffset(const SAR_Type *base, uint32_t chan, int16_t offset); cy_en_sar_status_t Cy_SAR_SetChannelGain(const SAR_Type *base, uint32_t chan, int32_t adcGain); /** \} */ /** \cond * Deprecated functions * Don't support multi-instance * For existing projects the mapping is on SAR0 instance * Strongly not recommended for new designs * Use Cy_SAR_SetChannelOffset and Cy_SAR_SetChannelGain instead */ __STATIC_INLINE cy_en_sar_status_t Cy_SAR_SetOffset(uint32_t chan, int16_t offset) { return (Cy_SAR_SetChannelOffset(CY_SAR0_BASE, chan, offset)); } __STATIC_INLINE cy_en_sar_status_t Cy_SAR_SetGain(uint32_t chan, int32_t adcGain) { return (Cy_SAR_SetChannelGain(CY_SAR0_BASE, chan, adcGain)); } /** \endcond */ /** \addtogroup group_sar_functions_switches * This set of functions is for controlling/querying the SARMUX switches * \{ */ void Cy_SAR_SetAnalogSwitch(SAR_Type *base, cy_en_sar_switch_register_sel_t switchSelect, uint32_t switchMask, cy_en_sar_switch_state_t state); uint32_t Cy_SAR_GetAnalogSwitch(const SAR_Type *base, cy_en_sar_switch_register_sel_t switchSelect); __STATIC_INLINE void Cy_SAR_SetVssaVminusSwitch(SAR_Type *base, cy_en_sar_switch_state_t state); void Cy_SAR_SetSwitchSarSeqCtrl(SAR_Type *base, uint32_t switchMask, cy_en_sar_switch_sar_seq_ctrl_t ctrl); __STATIC_INLINE void Cy_SAR_SetVssaSarSeqCtrl(SAR_Type *base, cy_en_sar_switch_sar_seq_ctrl_t ctrl); /** \} */ /** \addtogroup group_sar_functions_interrupt * This set of functions are related to SAR interrupts. * \{ */ __STATIC_INLINE uint32_t Cy_SAR_GetInterruptStatus(const SAR_Type *base); __STATIC_INLINE void Cy_SAR_ClearInterrupt(SAR_Type *base, uint32_t intrMask); __STATIC_INLINE void Cy_SAR_SetInterrupt(SAR_Type *base, uint32_t intrMask); __STATIC_INLINE void Cy_SAR_SetInterruptMask(SAR_Type *base, uint32_t intrMask); __STATIC_INLINE uint32_t Cy_SAR_GetInterruptMask(const SAR_Type *base); __STATIC_INLINE uint32_t Cy_SAR_GetInterruptStatusMasked(const SAR_Type *base); __STATIC_INLINE uint32_t Cy_SAR_GetRangeInterruptStatus(const SAR_Type *base); __STATIC_INLINE void Cy_SAR_ClearRangeInterrupt(SAR_Type *base, uint32_t chanMask); __STATIC_INLINE void Cy_SAR_SetRangeInterrupt(SAR_Type *base, uint32_t chanMask); __STATIC_INLINE void Cy_SAR_SetRangeInterruptMask(SAR_Type *base, uint32_t chanMask); __STATIC_INLINE uint32_t Cy_SAR_GetRangeInterruptMask(const SAR_Type *base); __STATIC_INLINE uint32_t Cy_SAR_GetRangeInterruptStatusMasked(const SAR_Type *base); __STATIC_INLINE uint32_t Cy_SAR_GetSatInterruptStatus(const SAR_Type *base); __STATIC_INLINE void Cy_SAR_ClearSatInterrupt(SAR_Type *base, uint32_t chanMask); __STATIC_INLINE void Cy_SAR_SetSatInterrupt(SAR_Type *base, uint32_t chanMask); __STATIC_INLINE void Cy_SAR_SetSatInterruptMask(SAR_Type *base, uint32_t chanMask); __STATIC_INLINE uint32_t Cy_SAR_GetSatInterruptMask(const SAR_Type *base); __STATIC_INLINE uint32_t Cy_SAR_GetSatInterruptStatusMasked(const SAR_Type *base); __STATIC_INLINE uint32_t Cy_SAR_GetInterruptCause(const SAR_Type *base); /** \} */ /** \addtogroup group_sar_functions_helper * This set of functions is for useful configuration query * \{ */ bool Cy_SAR_IsChannelSigned(const SAR_Type *base, uint32_t chan); bool Cy_SAR_IsChannelSingleEnded(const SAR_Type *base, uint32_t chan); __STATIC_INLINE bool Cy_SAR_IsChannelDifferential(const SAR_Type *base, uint32_t chan); /** \} */ /** \addtogroup group_sar_functions_lp * \{ */ cy_en_sar_status_t Cy_SAR_ScanCountEnable(const SAR_Type * base); __STATIC_INLINE void Cy_SAR_ScanCountDisable(const SAR_Type * base); __STATIC_INLINE void Cy_SAR_SelectClock(const SAR_Type * base, cy_en_sar_clock_source_t clock); /** \} */ /** \addtogroup group_sar_functions_fifo * \{ */ __STATIC_INLINE void Cy_SAR_FifoRead(const SAR_Type *base, cy_stc_sar_fifo_read_t * readStruct); __STATIC_INLINE uint32_t Cy_SAR_FifoGetDataCount(const SAR_Type *base); __STATIC_INLINE void Cy_SAR_FifoSetLevel(const SAR_Type *base, uint32_t level); __STATIC_INLINE void Cy_SAR_ClearFifoInterrupt(const SAR_Type *base, uint32_t intrMask); __STATIC_INLINE void Cy_SAR_SetFifoInterrupt(const SAR_Type *base, uint32_t intrMask); __STATIC_INLINE void Cy_SAR_SetFifoInterruptMask(const SAR_Type *base, uint32_t intrMask); __STATIC_INLINE uint32_t Cy_SAR_GetFifoInterruptStatus(const SAR_Type *base); __STATIC_INLINE uint32_t Cy_SAR_GetFifoInterruptMask(const SAR_Type *base); __STATIC_INLINE uint32_t Cy_SAR_GetFifoInterruptStatusMasked(const SAR_Type *base); /** \} */ /** \addtogroup group_sar_functions_basic * \{ */ /******************************************************************************* * Function Name: Cy_SAR_GetChanResultUpdated ****************************************************************************//** * * Return whether the RESULT register has been updated or not. * If the bit is high, the corresponding channel RESULT register was updated, * i.e. was sampled during the previous scan and, in case of Interleaved averaging, * reached the averaging count. * If the bit is low, the corresponding channel is not enabled or the averaging count * is not yet reached for Interleaved averaging. * * \param base * Pointer to structure describing registers * * \return * Each bit of the result corresponds to the channel. * Bit 0 is for channel 0, etc. * * \funcusage * * \snippet sar/snippet/main.c SNIPPET_SAR_GET_CHAN_RESULT_UPDATED * *******************************************************************************/ __STATIC_INLINE uint32_t Cy_SAR_GetChanResultUpdated(const SAR_Type *base) { return SAR_CHAN_RESULT_UPDATED(base); } /******************************************************************************* * Function Name: Cy_SAR_EnableInjection ****************************************************************************//** * * Triggers the injection channel sample. * * \param base * Pointer to structure describing registers * * \param tailgating * Injection channel tailgating enable: * - true: The addressed pin is sampled after the next trigger and after all enabled channels have been scanned. * - false: SAR is immediately triggered when the SAR is not busy. * If the SAR is busy, the INJ channel addressed pin is sampled at the end of the current scan. * * \funcusage \snippet sar/snippet/main.c SNIPPET_SAR_IS_END_CONVERSION * *******************************************************************************/ __STATIC_INLINE void Cy_SAR_EnableInjection(SAR_Type *base, bool tailgating) { SAR_INJ_CHAN_CONFIG(base) = _CLR_SET_FLD32U(SAR_INJ_CHAN_CONFIG(base), SAR_INJ_CHAN_CONFIG_INJ_TAILGATING, tailgating ? 1UL : 0UL) | SAR_INJ_CHAN_CONFIG_INJ_START_EN_Msk; } /** \} */ /** \addtogroup group_sar_functions_config * \{ */ /******************************************************************************* * Function Name: Cy_SAR_SetChanMask ****************************************************************************//** * * Set the enable/disable mask for the channels. * * \param base * Pointer to structure describing registers * * \param enableMask * Channel enable/disable mask. Each bit corresponds to a channel. * - 0: the corresponding channel is disabled. * - 1: the corresponding channel is enabled; it will be included in the next scan. * * \return None * * \funcusage * * \snippet sar/snippet/main.c SNIPPET_SAR_SET_CHAN_MASK * *******************************************************************************/ __STATIC_INLINE void Cy_SAR_SetChanMask(SAR_Type *base, uint32_t enableMask) { CY_ASSERT_L2(CY_SAR_CHANMASK(enableMask)); SAR_CHAN_EN(base) = enableMask; } /******************************************************************************* * Function Name: Cy_SAR_SetRangeCond ****************************************************************************//** * * Set the condition in which range detection interrupts are triggered. * * \param base * Pointer to structure describing registers * * \param cond * A value of the enum \ref cy_en_sar_range_detect_condition_t. * * \return None * * \funcusage * * \snippet sar/snippet/main.c SNIPPET_SAR_SET_RANGE_COND * *******************************************************************************/ __STATIC_INLINE void Cy_SAR_SetRangeCond(SAR_Type *base, cy_en_sar_range_detect_condition_t cond) { CY_ASSERT_L3(CY_SAR_RANGECOND(cond)); SAR_RANGE_COND(base) = (uint32_t)cond << SAR_RANGE_COND_RANGE_COND_Pos; } /** \} */ /** \addtogroup group_sar_functions_interrupt * \{ */ /******************************************************************************* * Function Name: Cy_SAR_GetInterruptStatus ****************************************************************************//** * * Return the interrupt register status. * * \param base * Pointer to structure describing registers * * \return Interrupt status * * \funcusage * * \snippet sar/snippet/main.c SNIPPET_SAR_ISR * *******************************************************************************/ __STATIC_INLINE uint32_t Cy_SAR_GetInterruptStatus(const SAR_Type *base) { return SAR_INTR(base); } /******************************************************************************* * Function Name: Cy_SAR_ClearInterrupt ****************************************************************************//** * * Clear the interrupt. * The interrupt must be cleared with this function so that the hardware * can set subsequent interrupts and those interrupts can be forwarded * to the interrupt controller, if enabled. * * \param base * Pointer to structure describing registers * * \param intrMask * The mask of interrupts to clear. Typically this will be the value returned * from \ref Cy_SAR_GetInterruptStatus. * Alternately, select one or more values from \ref group_sar_macros_interrupt and "OR" them together. * - \ref CY_SAR_INTR_EOS * - \ref CY_SAR_INTR_OVERFLOW * - \ref CY_SAR_INTR_FW_COLLISION * - \ref CY_SAR_INTR_INJ_EOC * - \ref CY_SAR_INTR_INJ_SATURATE * - \ref CY_SAR_INTR_INJ_RANGE * - \ref CY_SAR_INTR_INJ_COLLISION * * \return None * *******************************************************************************/ __STATIC_INLINE void Cy_SAR_ClearInterrupt(SAR_Type *base, uint32_t intrMask) { CY_ASSERT_L2(CY_SAR_INTRMASK(intrMask)); SAR_INTR(base) = intrMask & CY_SAR_INTR; /* This dummy reading is necessary here. It provides a guarantee that interrupt is cleared at returning from this function. */ (void) SAR_INTR(base); } /******************************************************************************* * Function Name: Cy_SAR_SetInterrupt ****************************************************************************//** * * Trigger an interrupt with software. * * \param base * Pointer to structure describing registers * * \param intrMask * The mask of interrupts to set. * Select one or more values from \ref group_sar_macros_interrupt and "OR" them together. * - \ref CY_SAR_INTR_EOS * - \ref CY_SAR_INTR_OVERFLOW * - \ref CY_SAR_INTR_FW_COLLISION * - \ref CY_SAR_INTR_INJ_EOC * - \ref CY_SAR_INTR_INJ_SATURATE * - \ref CY_SAR_INTR_INJ_RANGE * - \ref CY_SAR_INTR_INJ_COLLISION * * \return None * *******************************************************************************/ __STATIC_INLINE void Cy_SAR_SetInterrupt(SAR_Type *base, uint32_t intrMask) { CY_ASSERT_L2(CY_SAR_INTRMASK(intrMask)); SAR_INTR_SET(base) = intrMask & CY_SAR_INTR; } /******************************************************************************* * Function Name: Cy_SAR_SetInterruptMask ****************************************************************************//** * * Enable which interrupts can trigger the CPU interrupt controller. * * \param base * Pointer to structure describing registers * * \param intrMask * The mask of interrupts. Select one or more values from \ref group_sar_macros_interrupt * and "OR" them together: * - \ref CY_SAR_INTR_EOS * - \ref CY_SAR_INTR_OVERFLOW * - \ref CY_SAR_INTR_FW_COLLISION * - \ref CY_SAR_INTR_INJ_EOC * - \ref CY_SAR_INTR_INJ_SATURATE * - \ref CY_SAR_INTR_INJ_RANGE * - \ref CY_SAR_INTR_INJ_COLLISION * * \return None * * \funcusage * * \snippet sar/snippet/main.c SNIPPET_SAR_SET_INTERRUPT_MASK * *******************************************************************************/ __STATIC_INLINE void Cy_SAR_SetInterruptMask(SAR_Type *base, uint32_t intrMask) { CY_ASSERT_L2(CY_SAR_INTRMASK(intrMask)); SAR_INTR_MASK(base) = intrMask & CY_SAR_INTR; } /******************************************************************************* * Function Name: Cy_SAR_GetInterruptMask ****************************************************************************//** * * Return which interrupts can trigger the CPU interrupt controller * as configured by \ref Cy_SAR_SetInterruptMask. * * \param base * Pointer to structure describing registers * * \return * Interrupt mask. Compare this value with masks in \ref group_sar_macros_interrupt. * * \funcusage * * \snippet sar/snippet/main.c SNIPPET_SAR_GET_INTERRUPT_MASK * *******************************************************************************/ __STATIC_INLINE uint32_t Cy_SAR_GetInterruptMask(const SAR_Type *base) { return SAR_INTR_MASK(base); } /******************************************************************************* * Function Name: Cy_SAR_GetInterruptStatusMasked ****************************************************************************//** * * Return the bitwise AND between the interrupt request and mask registers. * See \ref Cy_SAR_GetInterruptStatus and \ref Cy_SAR_GetInterruptMask. * * \param base * Pointer to structure describing registers * * \return * Bitwise AND of the interrupt request and mask registers * *******************************************************************************/ __STATIC_INLINE uint32_t Cy_SAR_GetInterruptStatusMasked(const SAR_Type *base) { return SAR_INTR_MASKED(base); } /******************************************************************************* * Function Name: Cy_SAR_GetRangeInterruptStatus ****************************************************************************//** * * Return the range interrupt register status. * If the status bit is low for a channel, the channel may not be enabled * (\ref Cy_SAR_SetChanMask), range detection is not enabled for the * channel (\ref Cy_SAR_SetRangeInterruptMask), or range detection was not * triggered for the channel. * * \param base * Pointer to structure describing registers * * \return * The range interrupt status for all channels. Bit 0 is for channel 0, etc. * * \funcusage * * \snippet sar/snippet/main.c SNIPPET_SAR_GET_RANGE_INTERRUPT_STATUS * *******************************************************************************/ __STATIC_INLINE uint32_t Cy_SAR_GetRangeInterruptStatus(const SAR_Type *base) { return SAR_RANGE_INTR(base); } /******************************************************************************* * Function Name: Cy_SAR_ClearRangeInterrupt ****************************************************************************//** * * Clear the range interrupt for the specified channel mask. * The interrupt must be cleared with this function so that * the hardware can set subset interrupts and those interrupts can * be forwarded to the interrupt controller, if enabled. * * \param base * Pointer to structure describing registers * * \param chanMask * The channel mask. Bit 0 is for channel 0, etc. * Typically, this is the value returned from \ref Cy_SAR_GetRangeInterruptStatus. * * \return None * *******************************************************************************/ __STATIC_INLINE void Cy_SAR_ClearRangeInterrupt(SAR_Type *base, uint32_t chanMask) { CY_ASSERT_L2(CY_SAR_CHANMASK(chanMask)); SAR_RANGE_INTR(base) = chanMask & CY_SAR_CHANNELS_MASK; /* This dummy reading is necessary here. It provides a guarantee that interrupt is cleared at returning from this function. */ (void) SAR_RANGE_INTR(base); } /******************************************************************************* * Function Name: Cy_SAR_SetRangeInterrupt ****************************************************************************//** * * Trigger a range interrupt with software for the specific channel mask. * * \param base * Pointer to structure describing registers * * \param chanMask * The channel mask. Bit 0 is for channel 0, etc. * * \return None * *******************************************************************************/ __STATIC_INLINE void Cy_SAR_SetRangeInterrupt(SAR_Type *base, uint32_t chanMask) { CY_ASSERT_L2(CY_SAR_CHANMASK(chanMask)); SAR_RANGE_INTR_SET(base) = chanMask & CY_SAR_CHANNELS_MASK; } /******************************************************************************* * Function Name: Cy_SAR_SetRangeInterruptMask ****************************************************************************//** * * Enable which channels can trigger a range interrupt. * * \param base * Pointer to structure describing registers * * \param chanMask * The channel mask. Bit 0 is for channel 0, etc. * * \return None * * \funcusage * * \snippet sar/snippet/main.c SNIPPET_SAR_SET_RANGE_INTERRUPT_MASK * *******************************************************************************/ __STATIC_INLINE void Cy_SAR_SetRangeInterruptMask(SAR_Type *base, uint32_t chanMask) { CY_ASSERT_L2(CY_SAR_CHANMASK(chanMask)); SAR_RANGE_INTR_MASK(base) = chanMask & CY_SAR_CHANNELS_MASK; } /******************************************************************************* * Function Name: Cy_SAR_GetRangeInterruptMask ****************************************************************************//** * * Return which interrupts can trigger a range interrupt as configured by * \ref Cy_SAR_SetRangeInterruptMask. * * \param base * Pointer to structure describing registers * * \return * The range interrupt mask * *******************************************************************************/ __STATIC_INLINE uint32_t Cy_SAR_GetRangeInterruptMask(const SAR_Type *base) { return SAR_RANGE_INTR_MASK(base); } /******************************************************************************* * Function Name: Cy_SAR_GetRangeInterruptStatusMasked ****************************************************************************//** * * Return the bitwise AND between the range interrupt request and mask registers. * See \ref Cy_SAR_GetRangeInterruptStatus and \ref Cy_SAR_GetRangeInterruptMask. * * \param base * Pointer to structure describing registers * * \return * Bitwise AND between of range interrupt request and mask * *******************************************************************************/ __STATIC_INLINE uint32_t Cy_SAR_GetRangeInterruptStatusMasked(const SAR_Type *base) { return SAR_RANGE_INTR_MASKED(base); } /******************************************************************************* * Function Name: Cy_SAR_GetSatInterruptStatus ****************************************************************************//** * * Return the saturate interrupt register status. * If the status bit is low for a channel, the channel may not be enabled * (\ref Cy_SAR_SetChanMask), saturation detection is not enabled for the * channel (\ref Cy_SAR_SetSatInterruptMask), or saturation detection was not * triggered for the channel. * * \param base * Pointer to structure describing registers * * \return * The saturate interrupt status for all channels. Bit 0 is for channel 0, etc. * * \funcusage * * \snippet sar/snippet/main.c SNIPPET_SAR_GET_SAT_INTERRUPT_STATUS * *******************************************************************************/ __STATIC_INLINE uint32_t Cy_SAR_GetSatInterruptStatus(const SAR_Type *base) { return SAR_SATURATE_INTR(base); } /******************************************************************************* * Function Name: Cy_SAR_ClearSatInterrupt ****************************************************************************//** * * Clear the saturate interrupt for the specified channel mask. * The interrupt must be cleared with this function so that the hardware * can set subsequent interrupts and those interrupts can be forwarded * to the interrupt controller, if enabled. * * \param base * Pointer to structure describing registers * * \param chanMask * The channel mask. Bit 0 is for channel 0, etc. * Typically, this is the value returned from \ref Cy_SAR_GetSatInterruptStatus. * * \return None * *******************************************************************************/ __STATIC_INLINE void Cy_SAR_ClearSatInterrupt(SAR_Type *base, uint32_t chanMask) { CY_ASSERT_L2(CY_SAR_CHANMASK(chanMask)); SAR_SATURATE_INTR(base) = chanMask & CY_SAR_CHANNELS_MASK; /* This dummy reading is necessary here. It provides a guarantee that interrupt is cleared at returning from this function. */ (void) SAR_SATURATE_INTR(base); } /******************************************************************************* * Function Name: Cy_SAR_SetSatInterrupt ****************************************************************************//** * * Trigger a saturate interrupt with software for the specific channel mask. * * \param base * Pointer to structure describing registers * * \param chanMask * The channel mask. Bit 0 is for channel 0, etc. * * \return None * *******************************************************************************/ __STATIC_INLINE void Cy_SAR_SetSatInterrupt(SAR_Type *base, uint32_t chanMask) { CY_ASSERT_L2(CY_SAR_CHANMASK(chanMask)); SAR_SATURATE_INTR_SET(base) = chanMask & CY_SAR_CHANNELS_MASK; } /******************************************************************************* * Function Name: Cy_SAR_SetSatInterruptMask ****************************************************************************//** * * Enable which channels can trigger a saturate interrupt. * * \param base * Pointer to structure describing registers * * \param chanMask * The channel mask. Bit 0 is for channel 0, etc. * * \return None * * \funcusage * * \snippet sar/snippet/main.c SNIPPET_SAR_GET_SAT_INTERRUPT_MASK * *******************************************************************************/ __STATIC_INLINE void Cy_SAR_SetSatInterruptMask(SAR_Type *base, uint32_t chanMask) { CY_ASSERT_L2(CY_SAR_CHANMASK(chanMask)); SAR_SATURATE_INTR_MASK(base) = chanMask & CY_SAR_CHANNELS_MASK; } /******************************************************************************* * Function Name: Cy_SAR_GetSatInterruptMask ****************************************************************************//** * * Return which interrupts can trigger a saturate interrupt as configured * by \ref Cy_SAR_SetSatInterruptMask. * * \param base * Pointer to structure describing registers * * \return * The saturate interrupt mask. Bit 0 is for channel 0, etc. * *******************************************************************************/ __STATIC_INLINE uint32_t Cy_SAR_GetSatInterruptMask(const SAR_Type *base) { return SAR_SATURATE_INTR_MASK(base); } /******************************************************************************* * Function Name: Cy_SAR_GetSatInterruptStatusMasked ****************************************************************************//** * * Return the bitwise AND between the saturate interrupt request and mask registers. * See \ref Cy_SAR_GetSatInterruptStatus and \ref Cy_SAR_GetSatInterruptMask. * * \param base * Pointer to structure describing registers * * \return * Bitwise AND of the saturate interrupt request and mask * *******************************************************************************/ __STATIC_INLINE uint32_t Cy_SAR_GetSatInterruptStatusMasked(const SAR_Type *base) { return SAR_SATURATE_INTR_MASKED(base); } /******************************************************************************* * Function Name: Cy_SAR_GetInterruptCause ****************************************************************************//** * * Return the cause of the interrupt. * The interrupt routine can be called due to one of the following events: * - End of scan (EOS) * - Overflow * - Firmware collision * - Saturation detected on one or more channels * - Range detected on one or more channels * * \param base * Pointer to structure describing registers * * \return * Mask of what caused the interrupt. Compare this value with one of these masks: * - SAR_INTR_CAUSE_EOS_MASKED_MIR_Msk : EOS caused the interrupt * - SAR_INTR_CAUSE_OVERFLOW_MASKED_MIR_Msk : Overflow caused the interrupt * - SAR_INTR_CAUSE_FW_COLLISION_MASKED_MIR_Msk : Firmware collision cause the interrupt * - SAR_INTR_CAUSE_SATURATE_MASKED_RED_Msk : Saturation detection on one or more channels caused the interrupt * - SAR_INTR_CAUSE_RANGE_MASKED_RED_Msk : Range detection on one or more channels caused the interrupt * *******************************************************************************/ __STATIC_INLINE uint32_t Cy_SAR_GetInterruptCause(const SAR_Type *base) { return SAR_INTR_CAUSE(base); } /** \} */ /** \addtogroup group_sar_functions_helper * \{ */ /******************************************************************************* * Function Name: Cy_SAR_IsChannelDifferential ****************************************************************************//** * * Return true of channel is differential, else false. * * \param base * Pointer to structure describing registers * * \param chan * The channel to check, starting at 0. * * \return * A false is return if chan is invalid. * * \funcusage * * \snippet sar/snippet/main.c SNIPPET_SAR_IS_CHANNEL_DIFF * *******************************************************************************/ __STATIC_INLINE bool Cy_SAR_IsChannelDifferential(const SAR_Type *base, uint32_t chan) { return !Cy_SAR_IsChannelSingleEnded(base, chan); } /** \} */ /** \addtogroup group_sar_functions_switches * \{ */ /******************************************************************************* * Function Name: Cy_SAR_SetVssaVminusSwitch ****************************************************************************//** * * Open or close the switch between VSSA and Vminus of the SARADC through firmware. * This function calls \ref Cy_SAR_SetAnalogSwitch with switchSelect set to * \ref CY_SAR_MUX_SWITCH0 and switchMask set to SAR_MUX_SWITCH0_MUX_FW_VSSA_VMINUS_Msk. * * \param base * Pointer to structure describing registers * * \param state * Open or close the switch. Select a value from \ref cy_en_sar_switch_state_t. * * \return None * * \funcusage * * \snippet sar/snippet/main.c SNIPPET_SAR_VSSA_VMINUS_SWITCH * *******************************************************************************/ __STATIC_INLINE void Cy_SAR_SetVssaVminusSwitch(SAR_Type *base, cy_en_sar_switch_state_t state) { Cy_SAR_SetAnalogSwitch(base, CY_SAR_MUX_SWITCH0, SAR_MUX_SWITCH0_MUX_FW_VSSA_VMINUS_Msk, state); } /******************************************************************************* * Function Name: Cy_SAR_SetVssaSarSeqCtrl ****************************************************************************//** * * Enable or disable SARSEQ control of the switch between VSSA and Vminus of the SARADC. * This function calls \ref Cy_SAR_SetSwitchSarSeqCtrl * with switchMask set to SAR_MUX_SWITCH_SQ_CTRL_MUX_SQ_CTRL_VSSA_Msk. * * \param base * Pointer to structure describing registers * * \param ctrl * Enable or disable control. Select a value from \ref cy_en_sar_switch_sar_seq_ctrl_t. * * \return None * * \funcusage * * \snippet sar/snippet/main.c SNIPPET_SAR_VSSA_SARSEQ_CTRL * *******************************************************************************/ __STATIC_INLINE void Cy_SAR_SetVssaSarSeqCtrl(SAR_Type *base, cy_en_sar_switch_sar_seq_ctrl_t ctrl) { Cy_SAR_SetSwitchSarSeqCtrl(base, SAR_MUX_SWITCH_SQ_CTRL_MUX_SQ_CTRL_VSSA_Msk, ctrl); } /** \} */ /** \addtogroup group_sar_functions_lp * \{ */ /******************************************************************************* * Function Name: Cy_SAR_ScanCountDisable ****************************************************************************//** * * Disables the Scanning Counter. * * \param base * Pointer to the structure of SAR instance registers. * * \funcusage \snippet sar/snippet/main.c SNIPPET_SAR_DS * *******************************************************************************/ __STATIC_INLINE void Cy_SAR_ScanCountDisable(const SAR_Type *base) { if (!CY_PASS_V1) { uint32_t interruptState = Cy_SysLib_EnterCriticalSection(); PASS_SAR_OVR_CTRL(CY_PASS_V2_ADDR) &= ~(CY_SAR_INSTANCE_MASK(base) << PASS_V2_SAR_OVR_CTRL_TR_SCAN_CNT_SEL_Pos); Cy_SysLib_ExitCriticalSection(interruptState); } } /******************************************************************************* * Function Name: Cy_SAR_SelectClock ****************************************************************************//** * * Switch the SAR input clock source. * Suitable for PASS_V2 only. * In case of CY_SAR_CLK_DEEPSLEEP it enables SAR operation in Deep Sleep mode. * * \param base * Pointer to the structure of SAR instance registers. * * \param clock * The SAR clock source \ref cy_en_sar_clock_source_t. * * \funcusage \snippet sar/snippet/main.c SNIPPET_SAR_DS * *******************************************************************************/ __STATIC_INLINE void Cy_SAR_SelectClock(const SAR_Type * base, cy_en_sar_clock_source_t clock) { CY_ASSERT_L1(!CY_PASS_V1); /* Deep Sleep Clock is not supported */ if (!CY_PASS_V1) { CY_ASSERT_L3(CY_SAR_IS_CLK_VALID(clock)); PASS_SAR_CLOCK_SEL(base) = _VAL2FLD(PASS_V2_SAR_CLOCK_SEL_CLOCK_SEL, clock); PASS_SAR_DPSLP_CTRL(base) = _BOOL2FLD(PASS_V2_SAR_DPSLP_CTRL_ENABLED, (CY_SAR_CLK_DEEPSLEEP == clock)); } } /** \} */ /** \addtogroup group_sar_functions_fifo * \{ */ /******************************************************************************* * Function Name: Cy_SAR_FifoRead ****************************************************************************//** * * Reads FIFO word-by-word. * * \return Subsequent data sample * * \funcusage \snippet sar/snippet/main.c SNIPPET_FIFO * *******************************************************************************/ __STATIC_INLINE void Cy_SAR_FifoRead(const SAR_Type * base, cy_stc_sar_fifo_read_t * readStruct) { CY_ASSERT_L1(!CY_PASS_V1); /* FIFO is not supported */ if(!CY_PASS_V1) { uint32_t locReg = PASS_FIFO_RD_DATA(base); readStruct->channel = (uint16_t)_FLD2VAL(PASS_FIFO_V2_RD_DATA_CHAN_ID, locReg); readStruct->value = (uint16_t)_FLD2VAL(PASS_FIFO_V2_RD_DATA_RESULT, locReg); } } /******************************************************************************* * Function Name: Cy_SAR_FifoGetDataCount ****************************************************************************//** * * Returns a number of non-empty FIFO cells. * * \return Number of FIFO samples. * * \funcusage \snippet sar/snippet/main.c SNIPPET_FIFO * *******************************************************************************/ __STATIC_INLINE uint32_t Cy_SAR_FifoGetDataCount(const SAR_Type * base) { uint32_t retVal = 0UL; CY_ASSERT_L1(!CY_PASS_V1); /* FIFO is not supported */ if(!CY_PASS_V1) { retVal = PASS_FIFO_USED(base); } return (retVal); } /******************************************************************************* * Function Name: Cy_SAR_ClearFifoInterrupt ****************************************************************************//** * * Clear the FIFO interrupt. * The interrupt must be cleared with this function so that the hardware * can set subsequent interrupts and those interrupts can be forwarded * to the interrupt controller, if enabled. * * \param base * Pointer to structure describing registers * * \param intrMask * The mask of interrupts to clear. Typically this will be the value returned * from \ref Cy_SAR_GetFifoInterruptStatus. * Alternately, select one or more values from \ref group_sar_macros_interrupt and "OR" them together. * - \ref CY_SAR_INTR_FIFO_LEVEL * - \ref CY_SAR_INTR_FIFO_OVERFLOW * - \ref CY_SAR_INTR_FIFO_UNDERFLOW * * \return None * *******************************************************************************/ __STATIC_INLINE void Cy_SAR_ClearFifoInterrupt(const SAR_Type * base, uint32_t intrMask) { CY_ASSERT_L1(!CY_PASS_V1); /* FIFO is not supported */ if(!CY_PASS_V1) { CY_ASSERT_L2(CY_SAR_FIFO_INTRMASK(intrMask)); PASS_FIFO_INTR(base) = intrMask & CY_SAR_INTR_FIFO; /* This dummy reading is necessary here. It provides a guarantee that interrupt is cleared at returning from this function. */ (void) PASS_FIFO_INTR(base); } } /******************************************************************************* * Function Name: Cy_SAR_SetFifoInterrupt ****************************************************************************//** * * Trigger an interrupt with software. * * \param base * Pointer to structure describing registers * * \param intrMask * The mask of interrupts to set. * Select one or more values from \ref group_sar_macros_interrupt and "OR" them together. * - \ref CY_SAR_INTR_FIFO_LEVEL * - \ref CY_SAR_INTR_FIFO_OVERFLOW * - \ref CY_SAR_INTR_FIFO_UNDERFLOW * * \return None * *******************************************************************************/ __STATIC_INLINE void Cy_SAR_SetFifoInterrupt(const SAR_Type * base, uint32_t intrMask) { CY_ASSERT_L1(!CY_PASS_V1); /* FIFO is not supported */ if(!CY_PASS_V1) { CY_ASSERT_L2(CY_SAR_FIFO_INTRMASK(intrMask)); PASS_FIFO_INTR_SET(base) = intrMask & CY_SAR_INTR_FIFO; } } /******************************************************************************* * Function Name: Cy_SAR_SetFifoInterruptMask ****************************************************************************//** * * Enable which interrupts can trigger the CPU interrupt controller. * * \param base * Pointer to structure describing registers * * \param intrMask * The mask of interrupts. Select one or more values from \ref group_sar_macros_interrupt * and "OR" them together: * - \ref CY_SAR_INTR_FIFO_LEVEL * - \ref CY_SAR_INTR_FIFO_OVERFLOW * - \ref CY_SAR_INTR_FIFO_UNDERFLOW * * \return None * *******************************************************************************/ __STATIC_INLINE void Cy_SAR_SetFifoInterruptMask(const SAR_Type * base, uint32_t intrMask) { CY_ASSERT_L1(!CY_PASS_V1); /* FIFO is not supported */ if(!CY_PASS_V1) { CY_ASSERT_L2(CY_SAR_FIFO_INTRMASK(intrMask)); PASS_FIFO_INTR_MASK(base) = intrMask & CY_SAR_INTR_FIFO; } } /******************************************************************************* * Function Name: Cy_SAR_GetFifoInterruptStatus ****************************************************************************//** * * Return the interrupt register status. * * \param base * Pointer to structure describing registers * * \return Interrupt status \ref group_sar_macros_interrupt. * *******************************************************************************/ __STATIC_INLINE uint32_t Cy_SAR_GetFifoInterruptStatus(const SAR_Type * base) { uint32_t retVal = 0UL; CY_ASSERT_L1(!CY_PASS_V1); /* FIFO is not supported */ if(!CY_PASS_V1) { retVal = PASS_FIFO_INTR(base); } return (retVal); } /******************************************************************************* * Function Name: Cy_SAR_GetFifoInterruptMask ****************************************************************************//** * * Return which interrupts can trigger the CPU interrupt controller * as configured by \ref Cy_SAR_SetFifoInterruptMask. * * \param base * Pointer to structure describing registers * * \return * Interrupt mask. Compare this value with masks in \ref group_sar_macros_interrupt. * *******************************************************************************/ __STATIC_INLINE uint32_t Cy_SAR_GetFifoInterruptMask(const SAR_Type * base) { uint32_t retVal = 0UL; CY_ASSERT_L1(!CY_PASS_V1); /* FIFO is not supported */ if(!CY_PASS_V1) { retVal = PASS_FIFO_INTR_MASK(base); } return (retVal); } /******************************************************************************* * Function Name: Cy_SAR_GetFifoInterruptStatusMasked ****************************************************************************//** * * Return the bitwise AND between the interrupt request and mask registers. * See \ref Cy_SAR_GetFifoInterruptStatus and \ref Cy_SAR_GetFifoInterruptMask. * * \param base * Pointer to structure describing registers * * \return * Bitwise AND of the interrupt request and mask registers \ref group_sar_macros_interrupt. * *******************************************************************************/ __STATIC_INLINE uint32_t Cy_SAR_GetFifoInterruptStatusMasked(const SAR_Type * base) { uint32_t retVal = 0UL; CY_ASSERT_L1(!CY_PASS_V1); /* FIFO is not supported */ if(!CY_PASS_V1) { retVal = PASS_FIFO_INTR_MASKED(base); } return (retVal); } /******************************************************************************* * Function Name: Cy_SAR_FifoSetLevel ****************************************************************************//** * * Sets the FIFO trigger level which specifies how many samples FIFO should * contain in order to generate trigger event. * * \param base * Pointer to structure describing registers * * \param level The FIFO trigger level to be set. Range: 1..256. * * \return None * *******************************************************************************/ __STATIC_INLINE void Cy_SAR_FifoSetLevel(const SAR_Type *base, uint32_t level) { CY_ASSERT_L1(!CY_PASS_V1); /* FIFO is not supported */ if(!CY_PASS_V1) { uint32_t locLevel = level - 1UL; /* Convert the user value into the machine value */ CY_ASSERT_L2(CY_SAR_IS_FIFO_LEVEL_VALID(locLevel)); PASS_FIFO_LEVEL(base) = _VAL2FLD(PASS_FIFO_V2_LEVEL_LEVEL, locLevel); } } /** \} */ /******************************************************************************* * Function Name: Cy_SAR_SimultStart ****************************************************************************//** * * Simultaneously starts two or more SARs. * * \param base * Pointer to structure describing PASS registers. * * \param sarMask specifies which SAR instances will be started. * Mask should contain at least two SAR instances for operation. * * \param mode specifies mode of SARs operation. * * \return None * * \funcusage * \snippet sar/snippet/main.c SAR_SNIPPET_SIMULT_START_STOP * *******************************************************************************/ __STATIC_INLINE void Cy_SAR_SimultStart(PASS_Type *base, uint32_t sarMask, cy_en_sar_start_convert_sel_t mode) { CY_ASSERT_L1(!CY_PASS_V1); /* SAR simultaneous start feature is not supported on PASS_ver1 IP block. */ if (!CY_PASS_V1) { CY_MISRA_DEVIATE_LINE('MISRA C-2012 Rule 11.3', 'Deviate Pointer type conversions'); PASS_SAR_SIMULT_FW_START_CTRL(base) = (_VAL2FLD(PASS_V2_SAR_SIMULT_FW_START_CTRL_FW_TRIGGER, sarMask) | ((mode == CY_SAR_START_CONVERT_CONTINUOUS) ? _VAL2FLD(PASS_V2_SAR_SIMULT_FW_START_CTRL_CONTINUOUS, sarMask) : 0UL)); } } /******************************************************************************* * Function Name: Cy_SAR_SimultStop ****************************************************************************//** * * Stops the selected SARs. * * \param base * Pointer to structure describing PASS registers. * * \param sarMask specifies which SAR instances should be stopped. * * \return None * * \funcusage * \snippet sar/snippet/main.c SAR_SNIPPET_SIMULT_START_STOP * *******************************************************************************/ __STATIC_INLINE void Cy_SAR_SimultStop(PASS_Type *base, uint32_t sarMask) { if (!CY_PASS_V1) { CY_MISRA_DEVIATE_LINE('MISRA C-2012 Rule 11.3', 'Deviate Pointer type conversions'); PASS_SAR_SIMULT_FW_START_CTRL(base) = _VAL2FLD(PASS_V2_SAR_SIMULT_FW_START_CTRL_CONTINUOUS, (~sarMask)); } } /** \} group_sar_functions */ CY_MISRA_BLOCK_END('MISRA C-2012 Rule 11.3') #if defined(__cplusplus) } #endif #endif /* CY_IP_MXS40PASS_SAR */ #endif /** !defined(CY_SAR_H) */ /** \} group_sar */ /* [] END OF FILE */