I have just started writing a simple application for the LPC2129. I have a problem with polling the DONE bit of the ADC. The ADC clock is 3.68 MHz. I set the ADC to be 10 bits, single shot. I start the ADC and then poll the done bit like this:- while( !(ADDR & 0x80000000) ); The code is compiled using the Keil ARM tools (demo version). When I run the code on the simulator it works correctly, when I run it on the target it returns incorrect values. The returned value does track the input voltage but is quantised to 0x0000, 0x6000, 0x8000 or 0xE000 (Only 4 discrete values). If I single step or place a delay function before polling the DONE bit then the code runs correctly. Am I doing something wrong or is there a problem with polling this bit?
The UM is ambiguous about the state of the sample value when DONE=0. Since I prefer not to depend on anything that isn't explicitly stated in the manual, I use the alternative coding
do { r = ADDR; } while (!(r & DONEMASK));
Thanks for your help guys. I looked through the assembly and couldn't see anything amiss (though I'm no expert in ARM assembly). One thing I did realise was that I am starting a conversion like this:- ADCR |= 0x01000000; // Set start condition to 'Now' but never reseting the start condition. I tried adding 'ADCR &= 0x00FFFFFF;' after finding the DONE bit set. This resets the start condition to 'none'. This fixes the problem. So I now read the result like this:- do { r = ADDR; } while (!(r & 0x80000000)); ADCR &= 0x00FFFFFF; // Clear start condition return( r & 0x0000FFFF); (incorporating the change that Bruce sugested because I take your point about not doing anything not explicitly defined in the manual). It's now working a treat. Thank you both for pointing me in the right direction. Paul