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.