It is a library for controlling Wallbot

Dependents:   wallbot_test

Committer:
jksoft
Date:
Sun Jul 28 08:20:17 2013 +0000
Revision:
0:f8571ffd252a
First

Who changed what in which revision?

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