00001
00017
00018
00019
00020
00021
00022
00023
00024
00025
00026
00027
00028
00029
00030
00031
00032
00033
00034
00035
00036
00037
00038
00039
00040
00041
00042
00043
00044
00045
00046
00047
00048 #include <avr32/io.h>
00049 #include "compiler.h"
00050 #include "adc.h"
00051
00052
00053 void adc_configure(volatile avr32_adc_t * adc)
00054 {
00055 Assert( adc!=NULL );
00056
00057 #ifdef USE_ADC_8_BITS
00058 adc->mr |= 1<<AVR32_ADC_LOWRES_OFFSET;
00059 #endif
00060
00061 adc->mr |= 0xF << AVR32_ADC_SHTIM_OFFSET;
00062
00063 adc->mr |= 0x1F << AVR32_ADC_STARTUP_OFFSET;
00064 }
00065
00066 void adc_start(volatile avr32_adc_t * adc)
00067 {
00068 Assert( adc!=NULL );
00069
00070
00071 adc->cr = AVR32_ADC_START_MASK;
00072 }
00073
00074 void adc_enable(volatile avr32_adc_t * adc, unsigned short channel)
00075 {
00076 Assert( adc!=NULL );
00077 Assert( channel <= AVR32_ADC_CHANNELS_MSB );
00078
00079
00080 adc->cher = (1 << channel);
00081 }
00082
00083 void adc_disable(volatile avr32_adc_t * adc, unsigned short channel)
00084 {
00085 Assert( adc!=NULL );
00086 Assert( channel <= AVR32_ADC_CHANNELS_MSB );
00087
00088 if (adc_get_status(adc, channel) == ENABLED)
00089 {
00090
00091 adc->chdr |= (1 << channel);
00092 }
00093 }
00094
00095 Bool adc_get_status(volatile avr32_adc_t * adc, unsigned short channel)
00096 {
00097 Assert( adc!=NULL );
00098 Assert( channel <= AVR32_ADC_CHANNELS_MSB );
00099
00100 return ((adc->chsr & (1 << channel)) ? ENABLED : DISABLED);
00101 }
00102
00103 Bool adc_check_eoc(volatile avr32_adc_t * adc, unsigned short channel)
00104 {
00105 Assert( adc!=NULL );
00106 Assert( channel <= AVR32_ADC_CHANNELS_MSB );
00107
00108
00109 return ((adc->sr & (1 << channel)) ? HIGH : LOW);
00110 }
00111
00112 Bool adc_check_ovr(volatile avr32_adc_t * adc, unsigned short channel)
00113 {
00114 Assert( adc!=NULL );
00115 Assert( channel <= AVR32_ADC_CHANNELS_MSB );
00116
00117
00118 return ((adc->sr & (1 << (channel + 8))) ? FAIL : PASS);
00119 }
00120
00121 unsigned long adc_get_value(volatile avr32_adc_t * adc, unsigned short channel)
00122 {
00123 Assert( adc!=NULL );
00124 Assert( channel <= AVR32_ADC_CHANNELS_MSB );
00125
00126
00127 while(adc_check_eoc(adc, channel) != HIGH);
00128 return *((unsigned long * )((&(adc->cdr0)) + channel));
00129 }
00130
00131
00132 unsigned long adc_get_latest_value(volatile avr32_adc_t * adc)
00133 {
00134 Assert( adc!=NULL );
00135
00136
00137 while((adc->sr & AVR32_ADC_DRDY_MASK) != AVR32_ADC_DRDY_MASK);
00138 return adc->lcdr;
00139 }
00140