diff --git a/libraries/mbed/targets/hal/TARGET_NXP/TARGET_LPC15XX/analogin_api.c b/libraries/mbed/targets/hal/TARGET_NXP/TARGET_LPC15XX/analogin_api.c index d5059fd5a0..cb6f70ca37 100644 --- a/libraries/mbed/targets/hal/TARGET_NXP/TARGET_LPC15XX/analogin_api.c +++ b/libraries/mbed/targets/hal/TARGET_NXP/TARGET_LPC15XX/analogin_api.c @@ -59,25 +59,25 @@ void analogin_init(analogin_t *obj, PinName pin) { error("ADC pin mapping failed"); } uint32_t port = (pin >> 5); - // enable clock for GPIOx + // enable clock for GPIOx LPC_SYSCON->SYSAHBCLKCTRL0 |= (1UL << (14 + port)); - // pin enable - LPC_SWM->PINENABLE0 &= ~(1UL << obj->adc); + // pin enable + LPC_SWM->PINENABLE0 &= ~(1UL << obj->adc); // configure GPIO as input LPC_GPIO_PORT->DIR[port] &= ~(1UL << (pin & 0x1F)); - + // power up ADC if (obj->adc < ADC1_0) { // ADC0 LPC_SYSCON->PDRUNCFG &= ~(1 << 10); LPC_SYSCON->SYSAHBCLKCTRL0 |= (1 << 27); - } - else { - // ADC1 + } + else { + // ADC1 LPC_SYSCON->PDRUNCFG &= ~(1 << 11); LPC_SYSCON->SYSAHBCLKCTRL0 |= (1 << 28); - } + } // select IRC as async. clock, divided by 1 LPC_SYSCON->ADCASYNCCLKSEL = 0; @@ -95,12 +95,18 @@ void analogin_init(analogin_t *obj, PinName pin) { } static inline uint32_t adc_read(analogin_t *obj) { + volatile uint32_t channels; __IO LPC_ADC0_Type *adc_reg = (obj->adc < ADC1_0) ? (__IO LPC_ADC0_Type*)(LPC_ADC0) : (__IO LPC_ADC0_Type*)(LPC_ADC1); + if (obj->adc >= ADC1_0) + channels = ((obj->adc - ADC1_0) & 0x1F); + else + channels = (obj->adc & 0x1F); + // select channel adc_reg->SEQA_CTRL &= ~(0xFFF); - adc_reg->SEQA_CTRL |= (1UL << (obj->adc & 0x1F)); + adc_reg->SEQA_CTRL |= (1UL << channels); // start conversion and sequence enable adc_reg->SEQA_CTRL |= ((1UL << 26) | (1UL << 31));