#include <io/cm3.h>
+/* We use event to signal the end of conversion */
static Event data_ready;
+/* The last converted data */
static uint32_t data;
/**
* ADC ISR.
+ *
+ * The interrupt is connected to ready data, so when the
+ * adc ends the conversion we generate an event and then
+ * we return the converted value.
+ *
+ * \note to clear the Ready data bit and End of conversion
+ * bit we should read the Last Converted Data register, otherwise
+ * the ready data interrupt loop on this call.
*/
static DECLARE_ISR(adc_conversion_end_irq)
{
ADC_CHER = BV(ch);
}
-
/**
* Start an ADC convertion.
*/
/* Clock ADC peripheral */
pmc_periphEnable(ADC_ID);
-
/* Reset adc controller */
ADC_CR = ADC_SWRST;
LOG_INFO("Computed ADC_CLOCK %ld\n", ADC_CLOCK);
ADC_MR |= ((ADC_PRESCALER << ADC_PRESCALER_SHIFT) & ADC_PRESCALER_MASK);
LOG_INFO("prescaler[%ld]\n", ADC_PRESCALER);
- ADC_MR |= ((ADC_SUT512 << ADC_STARTUP_SHIFT) & ADC_STARTUP_MASK);
- LOG_INFO("starup[%d]\n", ADC_SUT512);
- ADC_MR |= ((ADC_AST17 << ADC_SETTLING_SHIFT) & ADC_SETTLING_MASK);
- LOG_INFO("sttime[%d]\n", ADC_AST17);
- ADC_MR |= ((0 << ADC_TRACKTIM_SHIFT) & ADC_TRACKTIM_MASK);
- LOG_INFO("tracking[%d]\n", 0);
- ADC_MR |= ((1 << ADC_TRANSFER_SHIFT) & ADC_TRANSFER_MASK);
- LOG_INFO("tranfer[%d]\n", 1);
+ ADC_MR |= ((CONFIG_ADC_SUT << ADC_STARTUP_SHIFT) & ADC_STARTUP_MASK);
+ LOG_INFO("starup[%d]\n", CONFIG_ADC_SUT);
+ ADC_MR |= ((CONFIG_ADC_STTLING << ADC_SETTLING_SHIFT) & ADC_SETTLING_MASK);
+ LOG_INFO("sttime[%d]\n", CONFIG_ADC_STTLING);
+ ADC_MR |= ((CONFIG_ADC_TRACKTIM << ADC_TRACKTIM_SHIFT) & ADC_TRACKTIM_MASK);
+ LOG_INFO("tracking[%d]\n", CONFIG_ADC_TRACKTIM);
+ ADC_MR |= ((CONFIG_ADC_TRANSFER << ADC_TRANSFER_SHIFT) & ADC_TRANSFER_MASK);
+ LOG_INFO("tranfer[%d]\n", CONFIG_ADC_TRANSFER);
/* Register and enable irq for adc. */
sysirq_setHandler(INT_ADC, adc_conversion_end_irq);