2008-10-14 12:38 PM
adc1 and dma reliability issue
2011-05-17 03:40 AM
After a few million scans my set of scan data shifts (circularly) one channel. It stays shifted until I reset the processor.
This is an unlivable bug, and I can't reliably detect if the shift has occurred just be looking at the data. I am using DMA to store the conversions. Since the data shifts circularly (DMA only writes to the correct addresses) it seems that the adc sequencer must be at fault. I trigger the scan via the software start bit, called from a 1kHz periodic timer routine (the system timer tick). I use bitband access for the start scan bit (cr2 bit 22). I set the settling time to the maximum (to minimize one channel's value from affecting another's). I process the scanned values in the DMA ISR. When I stop the processor after the fault all of the ADC configuration values are unchanged from my initialization. Since a single software conversion is actually a scan of 1 channel I have no confidence that asking for conversions one at a time is going to solve the problem. Am I alone in my using the adc in this way? Am I alone in needing the hardware to work correctly more than 30 million times in a row? ---- The only truly weird thing I do is to use structs for access to the adc controller registers. Using a struct requires that the controller register support single byte accesses, and the manual doesn't state which registers require 16 or 32 bit access. Some peripherals don't work with 8 bit accesses but I can't imagine that being intermittent, and after configuration is completed I use bit-band access so the use of a struct should be moot.2011-05-17 03:40 AM
Hi Andy.
Can you post here the revelant parts of your code? Thanks, Steve.2011-05-17 03:40 AM
Andy,
Are you setting the continuous bit (Bit 1 - CONT) in ADC_CR2? If so then you shouldn't keep hitting the ADC with a SWSTART every 1ms. Just once will do. I'll assume there is no issue with the structs you're using (since you've checked the register contents with a debugger) Have the DMA automatically reload its counter and use continuous conversions for the ADC and then it's pretty much hands off after that. I'm scanning with dual-convertors (8 channels total) and using the DMA to store 4 sets of conversions for each channel and it has never gone out of sync. Ryan2011-05-17 03:40 AM
my bad,
I was running the ADC at 16MHz, its max frequency is 14MHz. I finally noticed a comment in my code: //todo: set the adc prescaler.