X-Git-Url: https://codewiz.org/gitweb?a=blobdiff_plain;f=bertos%2Fcpu%2Fcortex-m3%2Fdrv%2Fadc_sam3.c;h=303689f10ce7745118603f5393ed06d1801e7615;hb=53716ae692a6352c1b230a568f4dbb2a779bda85;hp=7dd48bf650584aeac165613c71d940fe784a3465;hpb=314ed649e840e0f398bf5d1f66cc01db6f8aec01;p=bertos.git diff --git a/bertos/cpu/cortex-m3/drv/adc_sam3.c b/bertos/cpu/cortex-m3/drv/adc_sam3.c index 7dd48bf6..303689f1 100644 --- a/bertos/cpu/cortex-m3/drv/adc_sam3.c +++ b/bertos/cpu/cortex-m3/drv/adc_sam3.c @@ -58,11 +58,21 @@ #include +/* 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) { @@ -85,7 +95,6 @@ void adc_hw_select_ch(uint8_t ch) ADC_CHER = BV(ch); } - /** * Start an ADC convertion. */ @@ -110,7 +119,6 @@ void adc_hw_init(void) /* Clock ADC peripheral */ pmc_periphEnable(ADC_ID); - /* Reset adc controller */ ADC_CR = ADC_SWRST; @@ -134,14 +142,14 @@ void adc_hw_init(void) 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);