High speed analog input class.

Dependents:   HighSpeedAnalogIn_TestProgram WallbotR4_BTLE brunoDrome

Committer:
shintamainjp
Date:
Fri Feb 04 22:17:00 2011 +0000
Revision:
0:db55359719e7
Initial version.

Who changed what in which revision?

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