Test Ver

Dependencies:   mbed FatFileSystem

Committer:
jksoft
Date:
Sat Nov 17 13:22:00 2012 +0000
Revision:
0:269589d8d2c2
Test Program

Who changed what in which revision?

UserRevisionLine numberNew contents of line
jksoft 0:269589d8d2c2 1
jksoft 0:269589d8d2c2 2 #include "HighSpeedAnalogIn.h"
jksoft 0:269589d8d2c2 3
jksoft 0:269589d8d2c2 4 HighSpeedAnalogIn *HighSpeedAnalogIn::instance;
jksoft 0:269589d8d2c2 5 int HighSpeedAnalogIn::refcnt = 0;
jksoft 0:269589d8d2c2 6
jksoft 0:269589d8d2c2 7 HighSpeedAnalogIn::HighSpeedAnalogIn(PinName pin0, PinName pin1, PinName pin2, PinName pin3, PinName pin4, PinName pin5) {
jksoft 0:269589d8d2c2 8
jksoft 0:269589d8d2c2 9 refcnt++;
jksoft 0:269589d8d2c2 10 if (refcnt > 1) {
jksoft 0:269589d8d2c2 11 error("Please do not use over an object.");
jksoft 0:269589d8d2c2 12 }
jksoft 0:269589d8d2c2 13
jksoft 0:269589d8d2c2 14 static const int sample_rate = 200000;
jksoft 0:269589d8d2c2 15 static const int cclk_div = 1;
jksoft 0:269589d8d2c2 16
jksoft 0:269589d8d2c2 17 int adc_clk_freq = CLKS_PER_SAMPLE * sample_rate;
jksoft 0:269589d8d2c2 18 int m = (LPC_SC->PLL0CFG & 0xFFFF) + 1;
jksoft 0:269589d8d2c2 19 int n = (LPC_SC->PLL0CFG >> 16) + 1;
jksoft 0:269589d8d2c2 20 int cclkdiv = LPC_SC->CCLKCFG + 1;
jksoft 0:269589d8d2c2 21 int Fcco = (2 * m * XTAL_FREQ) / n;
jksoft 0:269589d8d2c2 22 int cclk = Fcco / cclkdiv;
jksoft 0:269589d8d2c2 23
jksoft 0:269589d8d2c2 24 LPC_SC->PCONP |= (1 << 12);
jksoft 0:269589d8d2c2 25 LPC_SC->PCLKSEL0 &= ~(0x3 << 24);
jksoft 0:269589d8d2c2 26 switch (cclk_div) {
jksoft 0:269589d8d2c2 27 case 1:
jksoft 0:269589d8d2c2 28 LPC_SC->PCLKSEL0 |= 0x1 << 24;
jksoft 0:269589d8d2c2 29 break;
jksoft 0:269589d8d2c2 30 case 2:
jksoft 0:269589d8d2c2 31 LPC_SC->PCLKSEL0 |= 0x2 << 24;
jksoft 0:269589d8d2c2 32 break;
jksoft 0:269589d8d2c2 33 case 4:
jksoft 0:269589d8d2c2 34 LPC_SC->PCLKSEL0 |= 0x0 << 24;
jksoft 0:269589d8d2c2 35 break;
jksoft 0:269589d8d2c2 36 case 8:
jksoft 0:269589d8d2c2 37 LPC_SC->PCLKSEL0 |= 0x3 << 24;
jksoft 0:269589d8d2c2 38 break;
jksoft 0:269589d8d2c2 39 default:
jksoft 0:269589d8d2c2 40 fprintf(stderr, "Warning: ADC CCLK clock divider must be 1, 2, 4 or 8. %u supplied.\n", cclk_div);
jksoft 0:269589d8d2c2 41 fprintf(stderr, "Defaulting to 1.\n");
jksoft 0:269589d8d2c2 42 LPC_SC->PCLKSEL0 |= 0x1 << 24;
jksoft 0:269589d8d2c2 43 break;
jksoft 0:269589d8d2c2 44 }
jksoft 0:269589d8d2c2 45 int pclk = cclk / cclk_div;
jksoft 0:269589d8d2c2 46 int clock_div = pclk / adc_clk_freq;
jksoft 0:269589d8d2c2 47
jksoft 0:269589d8d2c2 48 if (clock_div > 0xFF) {
jksoft 0:269589d8d2c2 49 fprintf(stderr, "Warning: Clock division is %u which is above 255 limit. Re-Setting at limit.\n", clock_div);
jksoft 0:269589d8d2c2 50 clock_div = 0xFF;
jksoft 0:269589d8d2c2 51 }
jksoft 0:269589d8d2c2 52 if (clock_div == 0) {
jksoft 0:269589d8d2c2 53 fprintf(stderr, "Warning: Clock division is 0. Re-Setting to 1.\n");
jksoft 0:269589d8d2c2 54 clock_div = 1;
jksoft 0:269589d8d2c2 55 }
jksoft 0:269589d8d2c2 56
jksoft 0:269589d8d2c2 57 int _adc_clk_freq = pclk / clock_div;
jksoft 0:269589d8d2c2 58 if (_adc_clk_freq > MAX_ADC_CLOCK) {
jksoft 0:269589d8d2c2 59 fprintf(stderr, "Warning: Actual ADC sample rate of %u which is above %u limit\n", _adc_clk_freq / CLKS_PER_SAMPLE, MAX_ADC_CLOCK / CLKS_PER_SAMPLE);
jksoft 0:269589d8d2c2 60 int max_div = 1;
jksoft 0:269589d8d2c2 61 while ((pclk / max_div) > MAX_ADC_CLOCK) {
jksoft 0:269589d8d2c2 62 max_div++;
jksoft 0:269589d8d2c2 63 }
jksoft 0:269589d8d2c2 64 fprintf(stderr, "Maximum recommended sample rate is %u\n", (pclk / max_div) / CLKS_PER_SAMPLE);
jksoft 0:269589d8d2c2 65 }
jksoft 0:269589d8d2c2 66
jksoft 0:269589d8d2c2 67 LPC_ADC->ADCR = ((clock_div - 1) << 8) | (1 << 21);
jksoft 0:269589d8d2c2 68 LPC_ADC->ADCR &= ~0xFF;
jksoft 0:269589d8d2c2 69
jksoft 0:269589d8d2c2 70 for (int i = 0; i < 8; i++) {
jksoft 0:269589d8d2c2 71 _adc_data[i] = 0;
jksoft 0:269589d8d2c2 72 }
jksoft 0:269589d8d2c2 73
jksoft 0:269589d8d2c2 74 // Attach IRQ
jksoft 0:269589d8d2c2 75 instance = this;
jksoft 0:269589d8d2c2 76 NVIC_SetVector(ADC_IRQn, (uint32_t)&static_adcisr);
jksoft 0:269589d8d2c2 77
jksoft 0:269589d8d2c2 78 // Disable global interrupt
jksoft 0:269589d8d2c2 79 LPC_ADC->ADINTEN &= ~0x100;
jksoft 0:269589d8d2c2 80
jksoft 0:269589d8d2c2 81 // Clock frequency.
jksoft 0:269589d8d2c2 82 printf("Clock frequency:%d\n", _adc_clk_freq);
jksoft 0:269589d8d2c2 83
jksoft 0:269589d8d2c2 84 // Actual sampling rate.
jksoft 0:269589d8d2c2 85 printf("Actual sampling rate:%d\n", _adc_clk_freq / CLKS_PER_SAMPLE);
jksoft 0:269589d8d2c2 86
jksoft 0:269589d8d2c2 87 int tmp = LPC_ADC->ADCR & ~(0x0F << 24);
jksoft 0:269589d8d2c2 88 tmp |= ((0x0 & 7) << 24) | ((0x0 & 1) << 27);
jksoft 0:269589d8d2c2 89 LPC_ADC->ADCR = tmp;
jksoft 0:269589d8d2c2 90 LPC_ADC->ADCR |= (1 << 16);
jksoft 0:269589d8d2c2 91
jksoft 0:269589d8d2c2 92 if (pin0 != NC) setup(pin0, 1);
jksoft 0:269589d8d2c2 93 if (pin1 != NC) setup(pin1, 1);
jksoft 0:269589d8d2c2 94 if (pin2 != NC) setup(pin2, 1);
jksoft 0:269589d8d2c2 95 if (pin3 != NC) setup(pin3, 1);
jksoft 0:269589d8d2c2 96 if (pin4 != NC) setup(pin4, 1);
jksoft 0:269589d8d2c2 97 if (pin5 != NC) setup(pin5, 1);
jksoft 0:269589d8d2c2 98
jksoft 0:269589d8d2c2 99 interrupt_state(pin0, 1);
jksoft 0:269589d8d2c2 100 }
jksoft 0:269589d8d2c2 101
jksoft 0:269589d8d2c2 102 HighSpeedAnalogIn::~HighSpeedAnalogIn() {
jksoft 0:269589d8d2c2 103 }
jksoft 0:269589d8d2c2 104
jksoft 0:269589d8d2c2 105 void HighSpeedAnalogIn::static_adcisr(void) {
jksoft 0:269589d8d2c2 106 instance->adcisr();
jksoft 0:269589d8d2c2 107 }
jksoft 0:269589d8d2c2 108
jksoft 0:269589d8d2c2 109 void HighSpeedAnalogIn::adcisr(void) {
jksoft 0:269589d8d2c2 110 uint32_t stat = LPC_ADC->ADSTAT;
jksoft 0:269589d8d2c2 111 // Scan channels for over-run or done and update array
jksoft 0:269589d8d2c2 112 if (stat & 0x0101) _adc_data[0] = LPC_ADC->ADDR0;
jksoft 0:269589d8d2c2 113 if (stat & 0x0202) _adc_data[1] = LPC_ADC->ADDR1;
jksoft 0:269589d8d2c2 114 if (stat & 0x0404) _adc_data[2] = LPC_ADC->ADDR2;
jksoft 0:269589d8d2c2 115 if (stat & 0x0808) _adc_data[3] = LPC_ADC->ADDR3;
jksoft 0:269589d8d2c2 116 if (stat & 0x1010) _adc_data[4] = LPC_ADC->ADDR4;
jksoft 0:269589d8d2c2 117 if (stat & 0x2020) _adc_data[5] = LPC_ADC->ADDR5;
jksoft 0:269589d8d2c2 118 if (stat & 0x4040) _adc_data[6] = LPC_ADC->ADDR6;
jksoft 0:269589d8d2c2 119 if (stat & 0x8080) _adc_data[7] = LPC_ADC->ADDR7;
jksoft 0:269589d8d2c2 120 }
jksoft 0:269589d8d2c2 121
jksoft 0:269589d8d2c2 122 int HighSpeedAnalogIn::get_channel(PinName pin) {
jksoft 0:269589d8d2c2 123 int ch;
jksoft 0:269589d8d2c2 124 switch (pin) {
jksoft 0:269589d8d2c2 125 case p15:// =p0.23 of LPC1768
jksoft 0:269589d8d2c2 126 ch = 0;
jksoft 0:269589d8d2c2 127 break;
jksoft 0:269589d8d2c2 128 case p16:// =p0.24 of LPC1768
jksoft 0:269589d8d2c2 129 ch = 1;
jksoft 0:269589d8d2c2 130 break;
jksoft 0:269589d8d2c2 131 case p17:// =p0.25 of LPC1768
jksoft 0:269589d8d2c2 132 ch = 2;
jksoft 0:269589d8d2c2 133 break;
jksoft 0:269589d8d2c2 134 case p18:// =p0.26 of LPC1768
jksoft 0:269589d8d2c2 135 ch = 3;
jksoft 0:269589d8d2c2 136 break;
jksoft 0:269589d8d2c2 137 case p19:// =p1.30 of LPC1768
jksoft 0:269589d8d2c2 138 ch = 4;
jksoft 0:269589d8d2c2 139 break;
jksoft 0:269589d8d2c2 140 case p20:// =p1.31 of LPC1768
jksoft 0:269589d8d2c2 141 ch = 5;
jksoft 0:269589d8d2c2 142 break;
jksoft 0:269589d8d2c2 143 default:
jksoft 0:269589d8d2c2 144 ch = 0;
jksoft 0:269589d8d2c2 145 break;
jksoft 0:269589d8d2c2 146 }
jksoft 0:269589d8d2c2 147 return ch;
jksoft 0:269589d8d2c2 148 }
jksoft 0:269589d8d2c2 149
jksoft 0:269589d8d2c2 150 uint32_t HighSpeedAnalogIn::get_data(PinName pin) {
jksoft 0:269589d8d2c2 151 // If in burst mode and at least one interrupt enabled then
jksoft 0:269589d8d2c2 152 // take all values from _adc_data
jksoft 0:269589d8d2c2 153 if (LPC_ADC->ADINTEN & 0x3F) {
jksoft 0:269589d8d2c2 154 return (_adc_data[get_channel(pin)]);
jksoft 0:269589d8d2c2 155 } else {
jksoft 0:269589d8d2c2 156 // Return current register value or last value from interrupt
jksoft 0:269589d8d2c2 157 switch (pin) {
jksoft 0:269589d8d2c2 158 case p15:// =p0.23 of LPC1768
jksoft 0:269589d8d2c2 159 return ((LPC_ADC->ADINTEN & 0x01) ? _adc_data[0] : LPC_ADC->ADDR0);
jksoft 0:269589d8d2c2 160 case p16:// =p0.24 of LPC1768
jksoft 0:269589d8d2c2 161 return ((LPC_ADC->ADINTEN & 0x02) ? _adc_data[1] : LPC_ADC->ADDR1);
jksoft 0:269589d8d2c2 162 case p17:// =p0.25 of LPC1768
jksoft 0:269589d8d2c2 163 return ((LPC_ADC->ADINTEN & 0x04) ? _adc_data[2] : LPC_ADC->ADDR2);
jksoft 0:269589d8d2c2 164 case p18:// =p0.26 of LPC1768:
jksoft 0:269589d8d2c2 165 return ((LPC_ADC->ADINTEN & 0x08) ? _adc_data[3] : LPC_ADC->ADDR3);
jksoft 0:269589d8d2c2 166 case p19:// =p1.30 of LPC1768
jksoft 0:269589d8d2c2 167 return ((LPC_ADC->ADINTEN & 0x10) ? _adc_data[4] : LPC_ADC->ADDR4);
jksoft 0:269589d8d2c2 168 case p20:// =p1.31 of LPC1768
jksoft 0:269589d8d2c2 169 return ((LPC_ADC->ADINTEN & 0x20) ? _adc_data[5] : LPC_ADC->ADDR5);
jksoft 0:269589d8d2c2 170 default:
jksoft 0:269589d8d2c2 171 return 0;
jksoft 0:269589d8d2c2 172 }
jksoft 0:269589d8d2c2 173 }
jksoft 0:269589d8d2c2 174 }
jksoft 0:269589d8d2c2 175
jksoft 0:269589d8d2c2 176 // Enable or disable an HighSpeedAnalogIn pin
jksoft 0:269589d8d2c2 177 void HighSpeedAnalogIn::setup(PinName pin, int state) {
jksoft 0:269589d8d2c2 178 int ch = get_channel(pin);
jksoft 0:269589d8d2c2 179 if ((state & 1) == 1) {
jksoft 0:269589d8d2c2 180 switch (pin) {
jksoft 0:269589d8d2c2 181 case p15:// =p0.23 of LPC1768
jksoft 0:269589d8d2c2 182 LPC_PINCON->PINSEL1 &= ~((unsigned int)0x3 << 14);
jksoft 0:269589d8d2c2 183 LPC_PINCON->PINSEL1 |= (unsigned int)0x1 << 14;
jksoft 0:269589d8d2c2 184 LPC_PINCON->PINMODE1 &= ~((unsigned int)0x3 << 14);
jksoft 0:269589d8d2c2 185 LPC_PINCON->PINMODE1 |= (unsigned int)0x2 << 14;
jksoft 0:269589d8d2c2 186 break;
jksoft 0:269589d8d2c2 187 case p16:// =p0.24 of LPC1768
jksoft 0:269589d8d2c2 188 LPC_PINCON->PINSEL1 &= ~((unsigned int)0x3 << 16);
jksoft 0:269589d8d2c2 189 LPC_PINCON->PINSEL1 |= (unsigned int)0x1 << 16;
jksoft 0:269589d8d2c2 190 LPC_PINCON->PINMODE1 &= ~((unsigned int)0x3 << 16);
jksoft 0:269589d8d2c2 191 LPC_PINCON->PINMODE1 |= (unsigned int)0x2 << 16;
jksoft 0:269589d8d2c2 192 break;
jksoft 0:269589d8d2c2 193 case p17:// =p0.25 of LPC1768
jksoft 0:269589d8d2c2 194 LPC_PINCON->PINSEL1 &= ~((unsigned int)0x3 << 18);
jksoft 0:269589d8d2c2 195 LPC_PINCON->PINSEL1 |= (unsigned int)0x1 << 18;
jksoft 0:269589d8d2c2 196 LPC_PINCON->PINMODE1 &= ~((unsigned int)0x3 << 18);
jksoft 0:269589d8d2c2 197 LPC_PINCON->PINMODE1 |= (unsigned int)0x2 << 18;
jksoft 0:269589d8d2c2 198 break;
jksoft 0:269589d8d2c2 199 case p18:// =p0.26 of LPC1768:
jksoft 0:269589d8d2c2 200 LPC_PINCON->PINSEL1 &= ~((unsigned int)0x3 << 20);
jksoft 0:269589d8d2c2 201 LPC_PINCON->PINSEL1 |= (unsigned int)0x1 << 20;
jksoft 0:269589d8d2c2 202 LPC_PINCON->PINMODE1 &= ~((unsigned int)0x3 << 20);
jksoft 0:269589d8d2c2 203 LPC_PINCON->PINMODE1 |= (unsigned int)0x2 << 20;
jksoft 0:269589d8d2c2 204 break;
jksoft 0:269589d8d2c2 205 case p19:// =p1.30 of LPC1768
jksoft 0:269589d8d2c2 206 LPC_PINCON->PINSEL3 &= ~((unsigned int)0x3 << 28);
jksoft 0:269589d8d2c2 207 LPC_PINCON->PINSEL3 |= (unsigned int)0x3 << 28;
jksoft 0:269589d8d2c2 208 LPC_PINCON->PINMODE3 &= ~((unsigned int)0x3 << 28);
jksoft 0:269589d8d2c2 209 LPC_PINCON->PINMODE3 |= (unsigned int)0x2 << 28;
jksoft 0:269589d8d2c2 210 break;
jksoft 0:269589d8d2c2 211 case p20:// =p1.31 of LPC1768
jksoft 0:269589d8d2c2 212 LPC_PINCON->PINSEL3 &= ~((unsigned int)0x3 << 30);
jksoft 0:269589d8d2c2 213 LPC_PINCON->PINSEL3 |= (unsigned int)0x3 << 30;
jksoft 0:269589d8d2c2 214 LPC_PINCON->PINMODE3 &= ~((unsigned int)0x3 << 30);
jksoft 0:269589d8d2c2 215 LPC_PINCON->PINMODE3 |= (unsigned int)0x2 << 30;
jksoft 0:269589d8d2c2 216 break;
jksoft 0:269589d8d2c2 217 default:
jksoft 0:269589d8d2c2 218 error("Invalid pin.");
jksoft 0:269589d8d2c2 219 break;
jksoft 0:269589d8d2c2 220 }
jksoft 0:269589d8d2c2 221 // Select channel
jksoft 0:269589d8d2c2 222 LPC_ADC->ADCR |= (1 << ch);
jksoft 0:269589d8d2c2 223 } else {
jksoft 0:269589d8d2c2 224 switch (pin) {
jksoft 0:269589d8d2c2 225 case p15://=p0.23 of LPC1768
jksoft 0:269589d8d2c2 226 LPC_PINCON->PINSEL1 &= ~((unsigned int)0x3 << 14);
jksoft 0:269589d8d2c2 227 LPC_PINCON->PINMODE1 &= ~((unsigned int)0x3 << 14);
jksoft 0:269589d8d2c2 228 break;
jksoft 0:269589d8d2c2 229 case p16://=p0.24 of LPC1768
jksoft 0:269589d8d2c2 230 LPC_PINCON->PINSEL1 &= ~((unsigned int)0x3 << 16);
jksoft 0:269589d8d2c2 231 LPC_PINCON->PINMODE1 &= ~((unsigned int)0x3 << 16);
jksoft 0:269589d8d2c2 232 break;
jksoft 0:269589d8d2c2 233 case p17://=p0.25 of LPC1768
jksoft 0:269589d8d2c2 234 LPC_PINCON->PINSEL1 &= ~((unsigned int)0x3 << 18);
jksoft 0:269589d8d2c2 235 LPC_PINCON->PINMODE1 &= ~((unsigned int)0x3 << 18);
jksoft 0:269589d8d2c2 236 break;
jksoft 0:269589d8d2c2 237 case p18://=p0.26 of LPC1768:
jksoft 0:269589d8d2c2 238 LPC_PINCON->PINSEL1 &= ~((unsigned int)0x3 << 20);
jksoft 0:269589d8d2c2 239 LPC_PINCON->PINMODE1 &= ~((unsigned int)0x3 << 20);
jksoft 0:269589d8d2c2 240 break;
jksoft 0:269589d8d2c2 241 case p19://=p1.30 of LPC1768
jksoft 0:269589d8d2c2 242 LPC_PINCON->PINSEL3 &= ~((unsigned int)0x3 << 28);
jksoft 0:269589d8d2c2 243 LPC_PINCON->PINMODE3 &= ~((unsigned int)0x3 << 28);
jksoft 0:269589d8d2c2 244 break;
jksoft 0:269589d8d2c2 245 case p20://=p1.31 of LPC1768
jksoft 0:269589d8d2c2 246 LPC_PINCON->PINSEL3 &= ~((unsigned int)0x3 << 30);
jksoft 0:269589d8d2c2 247 LPC_PINCON->PINMODE3 &= ~((unsigned int)0x3 << 30);
jksoft 0:269589d8d2c2 248 break;
jksoft 0:269589d8d2c2 249 default:
jksoft 0:269589d8d2c2 250 error("Invalid pin.");
jksoft 0:269589d8d2c2 251 break;
jksoft 0:269589d8d2c2 252 }
jksoft 0:269589d8d2c2 253 LPC_ADC->ADCR &= ~(1 << ch);
jksoft 0:269589d8d2c2 254 }
jksoft 0:269589d8d2c2 255 }
jksoft 0:269589d8d2c2 256
jksoft 0:269589d8d2c2 257 void HighSpeedAnalogIn::interrupt_state(PinName pin, int state) {
jksoft 0:269589d8d2c2 258 int ch = get_channel(pin);
jksoft 0:269589d8d2c2 259 if (state == 1) {
jksoft 0:269589d8d2c2 260 LPC_ADC->ADINTEN &= ~0x100;
jksoft 0:269589d8d2c2 261 LPC_ADC->ADINTEN |= 1 << ch;
jksoft 0:269589d8d2c2 262 /* Enable the HighSpeedAnalogIn Interrupt */
jksoft 0:269589d8d2c2 263 NVIC_EnableIRQ(ADC_IRQn);
jksoft 0:269589d8d2c2 264 } else {
jksoft 0:269589d8d2c2 265 LPC_ADC->ADINTEN &= ~(1 << ch);
jksoft 0:269589d8d2c2 266 //Disable interrrupt if no active pins left
jksoft 0:269589d8d2c2 267 if ((LPC_ADC->ADINTEN & 0xFF) == 0)
jksoft 0:269589d8d2c2 268 NVIC_DisableIRQ(ADC_IRQn);
jksoft 0:269589d8d2c2 269 }
jksoft 0:269589d8d2c2 270 }
jksoft 0:269589d8d2c2 271
jksoft 0:269589d8d2c2 272 float HighSpeedAnalogIn::read(PinName pin) {
jksoft 0:269589d8d2c2 273 /*
jksoft 0:269589d8d2c2 274 * Reset DONE and OVERRUN.
jksoft 0:269589d8d2c2 275 *
jksoft 0:269589d8d2c2 276 * bit 31 : DONE
jksoft 0:269589d8d2c2 277 * bit 30 : OVERRUN
jksoft 0:269589d8d2c2 278 */
jksoft 0:269589d8d2c2 279 _adc_data[get_channel(pin)] &= ~(((uint32_t)0x01 << 31) | ((uint32_t)0x01 << 30));
jksoft 0:269589d8d2c2 280 return (float)((get_data(pin) >> 4) & 0xFFF) / (float)0xFFF;
jksoft 0:269589d8d2c2 281 }
jksoft 0:269589d8d2c2 282
jksoft 0:269589d8d2c2 283 unsigned short HighSpeedAnalogIn::read_u16(PinName pin) {
jksoft 0:269589d8d2c2 284 /*
jksoft 0:269589d8d2c2 285 * Reset DONE and OVERRUN.
jksoft 0:269589d8d2c2 286 *
jksoft 0:269589d8d2c2 287 * bit 31 : DONE
jksoft 0:269589d8d2c2 288 * bit 30 : OVERRUN
jksoft 0:269589d8d2c2 289 */
jksoft 0:269589d8d2c2 290 _adc_data[get_channel(pin)] &= ~(((uint32_t)0x01 << 31) | ((uint32_t)0x01 << 30));
jksoft 0:269589d8d2c2 291 return ((get_data(pin) >> 4) & 0xFFF);
jksoft 0:269589d8d2c2 292 }