Merge pull request #330 from toyowata/master

[LPC1549] Fixed #327 ADC channel 1 issue
pull/333/head
Martin Kojtal 2014-05-27 09:14:13 +02:00
commit 9574629e27
1 changed files with 15 additions and 9 deletions

View File

@ -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));