/***************************************************************************//** * @brief * Reset ADC to same state as after a HW reset. * * @note * The ROUTE register is NOT reset by this function, in order to allow for * centralized setup of this feature. * * @param[in] adc * Pointer to ADC peripheral register block. ******************************************************************************/ void ADC_Reset(ADC_TypeDef *adc) { /* Stop conversions, before resetting other registers. */ adc->CMD = ADC_CMD_SINGLESTOP | ADC_CMD_SCANSTOP; adc->SINGLECTRL = _ADC_SINGLECTRL_RESETVALUE; adc->SCANCTRL = _ADC_SCANCTRL_RESETVALUE; adc->CTRL = _ADC_CTRL_RESETVALUE; adc->IEN = _ADC_IEN_RESETVALUE; adc->IFC = _ADC_IFC_MASK; adc->BIASPROG = _ADC_BIASPROG_RESETVALUE; /* Load calibration values for the 1V25 internal reference. */ ADC_CalibrateLoadSingle(adc, adcRef1V25); ADC_CalibrateLoadScan(adc, adcRef1V25); /* Do not reset route register, setting should be done independently */ }
/***************************************************************************//** * @brief * Initialize single ADC sample conversion. * * @details * Please refer to ADC_StartSingle() for starting single conversion. * * When selecting an external reference, the gain and offset calibration * must be set explicitly (CAL register). For other references, the * calibration is updated with values defined during manufacturing. * * @note * This function will stop any ongoing single conversion. * * @param[in] adc * Pointer to ADC peripheral register block. * * @param[in] init * Pointer to ADC initialization structure. ******************************************************************************/ void ADC_InitSingle(ADC_TypeDef *adc, const ADC_InitSingle_TypeDef *init) { uint32_t tmp; EFM_ASSERT(ADC_REF_VALID(adc)); /* Make sure single conversion is not in progress */ adc->CMD = ADC_CMD_SINGLESTOP; /* Load proper calibration data depending on selected reference */ ADC_CalibrateLoadSingle(adc, init->reference); tmp = ((uint32_t)(init->prsSel) << _ADC_SINGLECTRL_PRSSEL_SHIFT) | ((uint32_t)(init->acqTime) << _ADC_SINGLECTRL_AT_SHIFT) | ((uint32_t)(init->reference) << _ADC_SINGLECTRL_REF_SHIFT) | ((uint32_t)(init->input) << _ADC_SINGLECTRL_INPUTSEL_SHIFT) | ((uint32_t)(init->resolution) << _ADC_SINGLECTRL_RES_SHIFT); if (init->prsEnable) { tmp |= ADC_SINGLECTRL_PRSEN; } if (init->leftAdjust) { tmp |= ADC_SINGLECTRL_ADJ_LEFT; } if (init->diff) { tmp |= ADC_SINGLECTRL_DIFF; } if (init->rep) { tmp |= ADC_SINGLECTRL_REP; } adc->SINGLECTRL = tmp; }