t
Fork of mbed-dev by
Diff: targets/hal/TARGET_Silicon_Labs/TARGET_EFM32/analogin_api.c
- Revision:
- 50:a417edff4437
- Parent:
- 0:9b334a45a8ff
- Child:
- 144:ef7eb2e8f9f7
diff -r 57ac6e3cdfd3 -r a417edff4437 targets/hal/TARGET_Silicon_Labs/TARGET_EFM32/analogin_api.c --- a/targets/hal/TARGET_Silicon_Labs/TARGET_EFM32/analogin_api.c Wed Jan 13 12:45:11 2016 +0000 +++ b/targets/hal/TARGET_Silicon_Labs/TARGET_EFM32/analogin_api.c Fri Jan 15 07:45:16 2016 +0000 @@ -41,26 +41,16 @@ #include "em_adc.h" #include "em_cmu.h" -uint8_t analogin_get_index(analogin_t *obj) +void analogin_init(analogin_t *obj, PinName pin) { - return 0; //only one module availalbe -} + static uint8_t adc_initialized = 0; -void analogin_preinit(analogin_t *obj, PinName pin) -{ + /* Init structure */ obj->adc = (ADC_TypeDef *) pinmap_peripheral(pin, PinMap_ADC); MBED_ASSERT((int) obj->adc != NC); obj->channel = pin_location(pin, PinMap_ADC); MBED_ASSERT((int) obj->channel != NC); -} - -void analogin_init(analogin_t *obj, PinName pin) -{ - static uint8_t adc_initialized = 0; - - /* Init structure */ - analogin_preinit(obj, pin); /* Only initialize the ADC once */ if (!adc_initialized) { @@ -86,31 +76,6 @@ } } -void analogin_enable(analogin_t *obj, uint8_t enable) -{ - //not avail for EFM32 -} - -void analogin_enable_pins(analogin_t *obj, uint8_t enable) -{ - //not avail for EFM32 -} - -void analogin_enable_interrupt(analogin_t *obj, uint32_t address, uint8_t enable) -{ - NVIC_SetVector(ADC0_IRQn, address); - if (enable) { - // enable end of conversion interrupt - ADC_IntEnable(obj->adc, ADC_IEN_SCAN); - ADC_IntSet(obj->adc, ADC_IF_SCAN); - NVIC_EnableIRQ(ADC0_IRQn); - } else { - ADC_IntDisable(obj->adc, ADC_IEN_SCAN); - ADC_IntClear(obj->adc, ADC_IF_SCAN); - NVIC_DisableIRQ(ADC0_IRQn); - } -} - uint16_t analogin_read_u16(analogin_t *obj) { ADC_TypeDef *adc = obj->adc; @@ -120,7 +85,11 @@ adc->CMD = ADC_CMD_SINGLESTOP; // Make sure we are checking the correct channel +#if defined _ADC_SINGLECTRL_INPUTSEL_MASK adc->SINGLECTRL = (adc->SINGLECTRL & ~_ADC_SINGLECTRL_INPUTSEL_MASK) | obj->channel; +#elif _ADC_SINGLECTRL_POSSEL_MASK + adc->SINGLECTRL = (adc->SINGLECTRL & ~_ADC_SINGLECTRL_POSSEL_MASK) | obj->channel << _ADC_SINGLECTRL_POSSEL_SHIFT; +#endif ADC_Start(adc, adcStartSingle);