34 #if defined(IDAC_COUNT) && (IDAC_COUNT > 0) 
   51 #if defined(_SILICON_LABS_32B_SERIES_0)  \ 
   52     && (defined(_EFM32_ZERO_FAMILY) || defined(_EFM32_HAPPY_FAMILY)) 
   53 #define ERRATA_FIX_IDAC_E101_EN 
   79 void IDAC_Init(IDAC_TypeDef *idac, 
const IDAC_Init_TypeDef *init)
 
   83   EFM_ASSERT(IDAC_REF_VALID(idac));
 
   85   tmp = (uint32_t)(init->prsSel);
 
   95 #if defined(_IDAC_CTRL_OUTENPRS_MASK) 
   96     tmp |= IDAC_CTRL_OUTENPRS;
 
   98     tmp |= IDAC_CTRL_APORTOUTENPRS;
 
  101   if (init->sinkEnable)
 
  103     tmp |= IDAC_CTRL_CURSINK;
 
  120 void IDAC_Enable(IDAC_TypeDef *idac, 
bool enable)
 
  122   EFM_ASSERT(IDAC_REF_VALID(idac));
 
  134 void IDAC_Reset(IDAC_TypeDef *idac)
 
  136   EFM_ASSERT(IDAC_REF_VALID(idac));
 
  138 #if defined(ERRATA_FIX_IDAC_E101_EN) 
  144   idac->CTRL = _IDAC_CTRL_RESETVALUE | IDAC_CTRL_EN;
 
  147   idac->CURPROG = IDAC_CURPROG_RANGESEL_RANGE0 |
 
  148                   (0x0 << _IDAC_CURPROG_STEPSEL_SHIFT);
 
  151   idac->DUTYCONFIG = IDAC_DUTYCONFIG_DUTYCYCLEEN;
 
  153   idac->CTRL       = _IDAC_CTRL_RESETVALUE;
 
  154   idac->CURPROG    = _IDAC_CURPROG_RESETVALUE;
 
  155   idac->DUTYCONFIG = _IDAC_DUTYCONFIG_RESETVALUE;
 
  157 #if defined ( _IDAC_CAL_MASK ) 
  158   idac->CAL        = _IDAC_CAL_RESETVALUE;
 
  173 void IDAC_MinimalOutputTransitionMode(IDAC_TypeDef *idac, 
bool enable)
 
  175   EFM_ASSERT(IDAC_REF_VALID(idac));
 
  196 void IDAC_RangeSet(IDAC_TypeDef *idac, 
const IDAC_Range_TypeDef range)
 
  199 #if defined( _IDAC_CURPROG_TUNING_MASK ) 
  204   EFM_ASSERT(IDAC_REF_VALID(idac));
 
  205   EFM_ASSERT(((uint32_t)range >> _IDAC_CURPROG_RANGESEL_SHIFT)
 
  206              <= (_IDAC_CURPROG_RANGESEL_MASK >> _IDAC_CURPROG_RANGESEL_SHIFT));
 
  208 #if defined ( _IDAC_CAL_MASK ) 
  211   switch ((IDAC_Range_TypeDef)range)
 
  213     case idacCurrentRange0:
 
  214       idac->CAL = (
DEVINFO->IDAC0CAL0 & _DEVINFO_IDAC0CAL0_RANGE0_MASK)
 
  215                   >> _DEVINFO_IDAC0CAL0_RANGE0_SHIFT;
 
  217     case idacCurrentRange1:
 
  218       idac->CAL = (
DEVINFO->IDAC0CAL0 & _DEVINFO_IDAC0CAL0_RANGE1_MASK)
 
  219                   >> _DEVINFO_IDAC0CAL0_RANGE1_SHIFT;
 
  221     case idacCurrentRange2:
 
  222       idac->CAL = (
DEVINFO->IDAC0CAL0 & _DEVINFO_IDAC0CAL0_RANGE2_MASK)
 
  223                   >> _DEVINFO_IDAC0CAL0_RANGE2_SHIFT;
 
  225     case idacCurrentRange3:
 
  226       idac->CAL = (
DEVINFO->IDAC0CAL0 & _DEVINFO_IDAC0CAL0_RANGE3_MASK)
 
  227                   >> _DEVINFO_IDAC0CAL0_RANGE3_SHIFT;
 
  231   tmp  = idac->CURPROG & ~_IDAC_CURPROG_RANGESEL_MASK;
 
  232   tmp |= (uint32_t)range;
 
  234 #elif defined( _IDAC_CURPROG_TUNING_MASK ) 
  238   EFM_ASSERT(idac == IDAC0);
 
  242   tmp = idac->CURPROG & ~(_IDAC_CURPROG_TUNING_MASK
 
  243                           | _IDAC_CURPROG_RANGESEL_MASK);
 
  244   if (idac->CTRL & IDAC_CTRL_CURSINK)
 
  248       case idacCurrentRange0:
 
  249         tmp |= ((diCal1 & _DEVINFO_IDAC0CAL1_SINKRANGE0TUNING_MASK)
 
  250                 >> _DEVINFO_IDAC0CAL1_SINKRANGE0TUNING_SHIFT)
 
  251                << _IDAC_CURPROG_TUNING_SHIFT;
 
  254       case idacCurrentRange1:
 
  255         tmp |= ((diCal1 & _DEVINFO_IDAC0CAL1_SINKRANGE1TUNING_MASK)
 
  256                 >> _DEVINFO_IDAC0CAL1_SINKRANGE1TUNING_SHIFT)
 
  257                << _IDAC_CURPROG_TUNING_SHIFT;
 
  260       case idacCurrentRange2:
 
  261         tmp |= ((diCal1 & _DEVINFO_IDAC0CAL1_SINKRANGE2TUNING_MASK)
 
  262                 >> _DEVINFO_IDAC0CAL1_SINKRANGE2TUNING_SHIFT)
 
  263                << _IDAC_CURPROG_TUNING_SHIFT;
 
  266       case idacCurrentRange3:
 
  267         tmp |= ((diCal1 & _DEVINFO_IDAC0CAL1_SINKRANGE3TUNING_MASK)
 
  268                 >> _DEVINFO_IDAC0CAL1_SINKRANGE3TUNING_SHIFT)
 
  269                << _IDAC_CURPROG_TUNING_SHIFT;
 
  277       case idacCurrentRange0:
 
  278         tmp |= ((diCal0 & _DEVINFO_IDAC0CAL0_SOURCERANGE0TUNING_MASK)
 
  279                 >> _DEVINFO_IDAC0CAL0_SOURCERANGE0TUNING_SHIFT)
 
  280                << _IDAC_CURPROG_TUNING_SHIFT;
 
  283       case idacCurrentRange1:
 
  284         tmp |= ((diCal0 & _DEVINFO_IDAC0CAL0_SOURCERANGE1TUNING_MASK)
 
  285                 >> _DEVINFO_IDAC0CAL0_SOURCERANGE1TUNING_SHIFT)
 
  286                << _IDAC_CURPROG_TUNING_SHIFT;
 
  289       case idacCurrentRange2:
 
  290         tmp |= ((diCal0 & _DEVINFO_IDAC0CAL0_SOURCERANGE2TUNING_MASK)
 
  291                 >> _DEVINFO_IDAC0CAL0_SOURCERANGE2TUNING_SHIFT)
 
  292                << _IDAC_CURPROG_TUNING_SHIFT;
 
  295       case idacCurrentRange3:
 
  296         tmp |= ((diCal0 & _DEVINFO_IDAC0CAL0_SOURCERANGE3TUNING_MASK)
 
  297                 >> _DEVINFO_IDAC0CAL0_SOURCERANGE3TUNING_SHIFT)
 
  298                << _IDAC_CURPROG_TUNING_SHIFT;
 
  303   tmp |= (uint32_t)range;
 
  306 #warning "IDAC calibration register definition unknown." 
  323 void IDAC_StepSet(IDAC_TypeDef *idac, 
const uint32_t step)
 
  327   EFM_ASSERT(IDAC_REF_VALID(idac));
 
  328   EFM_ASSERT(step <= (_IDAC_CURPROG_STEPSEL_MASK >> _IDAC_CURPROG_STEPSEL_SHIFT));
 
  330   tmp  = idac->CURPROG & ~_IDAC_CURPROG_STEPSEL_MASK;
 
  331   tmp |= step << _IDAC_CURPROG_STEPSEL_SHIFT;
 
  347 void IDAC_OutEnable(IDAC_TypeDef *idac, 
bool enable)
 
  349   EFM_ASSERT(IDAC_REF_VALID(idac));
 
  350 #if defined(_IDAC_CTRL_OUTEN_MASK) 
Clock management unit (CMU) API. 
 
Emlib peripheral API "assert" implementation. 
 
RAM and peripheral bit-field set and clear API. 
 
Current Digital to Analog Converter (IDAC) peripheral API. 
 
__STATIC_INLINE void BUS_RegBitWrite(volatile uint32_t *addr, unsigned int bit, unsigned int val)
Perform a single-bit write operation on a peripheral register.