I'm trying to read an analog signal on ADC 9 & 10. The issue I'm facing here is, despite setting the start bit to 1 the ADC is not launching the conversion sequence, i.e. the interrupt service routine isn't firing and also there is not update in the flag register. Kindly help. I have mentioned the initialization function below.
void adc_init()
{
LPC_SYSCON->SYSAHBCLKCTRL |= (1<<18); //Enable clock to IOCON
LPC_IOCON->PIO0_13 = 0x00000000; //Disable pull up and pull down resistors
LPC_IOCON->PIO0_17 = 0x00000000; //Disable pull up and pull down resistors
LPC_SYSCON->SYSAHBCLKCTRL |= (1<<7); //Enable clock to switch matrix
LPC_SWM->PINENABLE0 |= (0<<23); //Enable ADC_10 on PIO0_13
LPC_SWM->PINENABLE0 |= (0<<22); //Enable ADC_9 on PIO0_17
LPC_SYSCON->SYSAHBCLKCTRL |= (0<<7); //Disable clock to switch matrix
LPC_SYSCON->PDRUNCFG |= (0<<4); //Power the ADC
LPC_SYSCON->SYSAHBCLKCTRL |= (1<<24); //Enable clock to ADC
LPC_SYSCON->PRESETCTRL |= (0<<24); //RESET ADC
LPC_SYSCON->PRESETCTRL |= (1<<24);
LPC_ADC->SEQA_CTRL |= (0<<31); //Disable sequence ALPC_ADC->CTRL = 1; //Set clock div 1
LPC_ADC->SEQA_CTRL |= (1<<10)|(1<<9)|(1<<30); //Sequence A, channel 10, channel 9, EOS enabled
LPC_ADC->FLAGS = 0X00000000; //Clear all flags
LPC_ADC->INTEN |= (1<<0); //sequence A interupt enabledNVIC_EnableIRQ(ADC_SEQA_IRQn); //Enable NVIC interrupt
LPC_ADC->SEQA_CTRL |= (1<<31)|(1<<18); //Enable sequence A
}void start_adc()
{
LPC_ADC->SEQA_CTRL |= (1<<26); //start sequence A
}void ADC_SEQA_IRQHandler(void)
{
SendData0("In handler\n");
if((LPC_ADC->FLAGS & (1<<28)) == 1) //Check for Sequence completion
sequence_complete = 1;
LPC_ADC->FLAGS |= (0<<28); //clear flags
}uint16_t get_data_adc(int chno)
{
uint16_t data;
rawvalue = LPC_ADC->DAT[chno];
data = (rawvalue & 0X0000FFF0)>>4;
rawvalue = 0;
return data;
}int main()
{
int v1,v2;
SystemCoreClockUpdate();
GpioInit();
Uart0Init(9600,8,'N',1);
adc_init();
while(1)
{
start_adc();
while(sequence_complete != 1);
sequence_complete = 0;
v1 = get_data_adc(10);
v2= get_data_adc(9);
sprintf(result,"%d %d\n",v1,v2);
SendData0(result);
}
}
Hi, Flourisha,
Regarding your code, I think you have to check the bit configuration.
1)clear bit4 to power the ADC, but you do nothing with the code. Setting bit4 to power down rather than power up.
LPC_SYSCON->PDRUNCFG |= (0<<4); //Power the ADC
modify it to:
LPC_SYSCON->PDRUNCFG &= ~(0<<4); //Power the ADC
2)clear the bit in PINENABLE0 to enable the ADC function for the pin, but you set the bit with the code:
LPC_SWM->PINENABLE0 |= (0<<23); //Enable ADC_10 on PIO0_13
LPC_SWM->PINENABLE0 |= (0<<22); //Enable ADC_9 on PIO0_17
You should use
LPC_SWM->PINENABLE0 &=~ (0<<23); //Enable ADC_10 on PIO0_13
LPC_SWM->PINENABLE0 &= ~(0<<22); //Enable ADC_9 on PIO0_17
3)for reset:
LPC_SYSCON->PRESETCTRL &= ~(0<<24); //RESET ADC
LPC_SYSCON->PRESETCTRL |= (1<<24);
Pls have a try.
BR
XiangJun Rong
Thanks a lot. This solved the issue.