/***************************************************************************//** * @file em_idac.h * @brief Current Digital to Analog Converter (IDAC) peripheral API * @version 4.0.0 ******************************************************************************* * @section License * (C) Copyright 2014 Silicon Labs, http://www.silabs.com ******************************************************************************* * * Permission is granted to anyone to use this software for any purpose, * including commercial applications, and to alter it and redistribute it * freely, subject to the following restrictions: * * 1. The origin of this software must not be misrepresented; you must not * claim that you wrote the original software. * 2. Altered source versions must be plainly marked as such, and must not be * misrepresented as being the original software. * 3. This notice may not be removed or altered from any source distribution. * * DISCLAIMER OF WARRANTY/LIMITATION OF REMEDIES: Silicon Labs has no * obligation to support this Software. Silicon Labs is providing the * Software "AS IS", with no express or implied warranties of any kind, * including, but not limited to, any implied warranties of merchantability * or fitness for any particular purpose or warranties against infringement * of any proprietary rights of a third party. * * Silicon Labs will not be liable for any consequential, incidental, or * special damages, or any other relief, or for any claim by any third party, * arising from your use of this Software. * ******************************************************************************/ #ifndef __SILICON_LABS_EM_IDAC_H_ #define __SILICON_LABS_EM_IDAC_H_ #include "em_device.h" #if defined(IDAC_COUNT) && (IDAC_COUNT > 0) #include #ifdef __cplusplus extern "C" { #endif /***************************************************************************//** * @addtogroup EM_Library * @{ ******************************************************************************/ /***************************************************************************//** * @addtogroup IDAC * @{ ******************************************************************************/ /** @cond DO_NOT_INCLUDE_WITH_DOXYGEN */ /** Validation of IDAC register block pointer reference for assert statements. */ #define IDAC_REF_VALID(ref) ((ref) == IDAC0) /** @endcond */ /******************************************************************************* ******************************** ENUMS ************************************ ******************************************************************************/ /** Output mode. */ typedef enum { idacOutputPin = IDAC_CTRL_OUTMODE_PIN, /**< Output to IDAC OUT pin */ idacOutputADC = IDAC_CTRL_OUTMODE_ADC /**< Output to ADC */ } IDAC_OutMode_TypeDef; /** Selects which Peripheral Reflex System (PRS) signal to use when PRS is set to control the IDAC output. */ typedef enum { idacPRSSELCh0 = IDAC_CTRL_PRSSEL_PRSCH0, /**< PRS channel 0. */ idacPRSSELCh1 = IDAC_CTRL_PRSSEL_PRSCH1, /**< PRS channel 1. */ idacPRSSELCh2 = IDAC_CTRL_PRSSEL_PRSCH2, /**< PRS channel 2. */ idacPRSSELCh3 = IDAC_CTRL_PRSSEL_PRSCH3, /**< PRS channel 3. */ #if defined( IDAC_CTRL_PRSSEL_PRSCH4 ) idacPRSSELCh4 = IDAC_CTRL_PRSSEL_PRSCH4, /**< PRS channel 4. */ #endif #if defined( IDAC_CTRL_PRSSEL_PRSCH5 ) idacPRSSELCh5 = IDAC_CTRL_PRSSEL_PRSCH5, /**< PRS channel 5. */ #endif #if defined( IDAC_CTRL_PRSSEL_PRSCH6 ) idacPRSSELCh6 = IDAC_CTRL_PRSSEL_PRSCH6, /**< PRS channel 6. */ #endif #if defined( IDAC_CTRL_PRSSEL_PRSCH7 ) idacPRSSELCh7 = IDAC_CTRL_PRSSEL_PRSCH7, /**< PRS channel 7. */ #endif #if defined( IDAC_CTRL_PRSSEL_PRSCH8 ) idacPRSSELCh8 = IDAC_CTRL_PRSSEL_PRSCH8, /**< PRS channel 8. */ #endif #if defined( IDAC_CTRL_PRSSEL_PRSCH9 ) idacPRSSELCh9 = IDAC_CTRL_PRSSEL_PRSCH9, /**< PRS channel 9. */ #endif #if defined( IDAC_CTRL_PRSSEL_PRSCH10 ) idacPRSSELCh10 = IDAC_CTRL_PRSSEL_PRSCH10, /**< PRS channel 10 */ #endif #if defined( IDAC_CTRL_PRSSEL_PRSCH11 ) idacPRSSELCh11 = IDAC_CTRL_PRSSEL_PRSCH11, /**< PRS channel 11 */ #endif } IDAC_PRSSEL_TypeDef; /** Selects which current range to use. */ typedef enum { idacCurrentRange0 = IDAC_CURPROG_RANGESEL_RANGE0, /**< current range 0. */ idacCurrentRange1 = IDAC_CURPROG_RANGESEL_RANGE1, /**< current range 1. */ idacCurrentRange2 = IDAC_CURPROG_RANGESEL_RANGE2, /**< current range 2. */ idacCurrentRange3 = IDAC_CURPROG_RANGESEL_RANGE3, /**< current range 3. */ } IDAC_Range_TypeDef; /******************************************************************************* ******************************* STRUCTS *********************************** ******************************************************************************/ /** IDAC init structure, common for both channels. */ typedef struct { /** Enable IDAC. */ bool enable; /** Output mode */ IDAC_OutMode_TypeDef outMode; /** * Enable Peripheral reflex system (PRS) to control IDAC output. If false, * the IDAC output is controlled by writing to IDAC_OUTEN in IDAC_CTRL or * by calling IDAC_OutEnable(). */ bool prsEnable; /** * Peripheral reflex system channel selection. Only applicable if @p prsEnable * is enabled. */ IDAC_PRSSEL_TypeDef prsSel; /** Enable/disable current sink mode. */ bool sinkEnable; } IDAC_Init_TypeDef; /** Default config for IDAC init structure. */ #define IDAC_INIT_DEFAULT \ { false, /* Leave IDAC disabled when init done. */ \ idacOutputPin, /* Output to IDAC OUT pin. */ \ false, /* Disable PRS triggering. */ \ idacPRSSELCh0, /* Select PRS ch0 (if PRS triggering enabled). */ \ false /* Disable current sink mode. */ \ } /******************************************************************************* ***************************** PROTOTYPES ********************************** ******************************************************************************/ /***************************************************************************//** * @brief * Initialize IDAC. * * @details * Initializes IDAC according to the initialization structure parameter, and * sets the default calibration value stored in the DEVINFO structure. * * @note * This function will disable the IDAC prior to configuration. * * @param[in] idac * Pointer to IDAC peripheral register block. * * @param[in] init * Pointer to IDAC initialization structure. ******************************************************************************/ void IDAC_Init(IDAC_TypeDef *idac, const IDAC_Init_TypeDef *init); /***************************************************************************//** * @brief * Enable/disable IDAC. * * @param[in] idac * Pointer to IDAC peripheral register block. * * @param[in] enable * true to enable IDAC, false to disable. ******************************************************************************/ void IDAC_Enable(IDAC_TypeDef *idac, bool enable); /***************************************************************************//** * @brief * Reset IDAC to same state as after a HW reset. * * @param[in] idac * Pointer to IDAC peripheral register block. ******************************************************************************/ void IDAC_Reset(IDAC_TypeDef *idac); /***************************************************************************//** * @brief * Enable/disable Minimal Output Transition mode. * * @param[in] idac * Pointer to IDAC peripheral register block. * * @param[in] enable * true to enable Minimal Output Transition mode, false to disable. ******************************************************************************/ void IDAC_MinimalOutputTransitionMode(IDAC_TypeDef *idac, bool enable); /***************************************************************************//** * @brief * Set the current range of the IDAC output. * * @details * This function sets the current range of the IDAC output. The function * also updates the IDAC calibration register (IDAC_CAL) with the default * calibration value (from DEVINFO, factory setting) corresponding to the * specified range. * * @param[in] idac * Pointer to IDAC peripheral register block. * * @param[in] range * Current range value. ******************************************************************************/ void IDAC_RangeSet(IDAC_TypeDef *idac, const IDAC_Range_TypeDef range); /***************************************************************************//** * @brief * Set the current step of the IDAC output. * * @param[in] idac * Pointer to IDAC peripheral register block. * * @param[in] step * Step value for IDAC output. Valid range is 0-31. ******************************************************************************/ void IDAC_StepSet(IDAC_TypeDef *idac, const uint32_t step); /***************************************************************************//** * @brief * Enable/disable the IDAC OUT pin. * * @param[in] idac * Pointer to IDAC peripheral register block. * * @param[in] enable * true to enable the IDAC OUT pin, false to disable. ******************************************************************************/ void IDAC_OutEnable(IDAC_TypeDef *idac, bool enable); /** @} (end addtogroup IDAC) */ /** @} (end addtogroup EM_Library) */ #ifdef __cplusplus } #endif #endif /* defined(IDAC_COUNT) && (IDAC_COUNT > 0) */ #endif /* __SILICON_LABS_EM_IDAC_H_ */