It is a library for controlling Wallbot
HighSpeedAnalogIn/HighSpeedAnalogIn.cpp@0:f8571ffd252a, 2013-07-28 (annotated)
- Committer:
- jksoft
- Date:
- Sun Jul 28 08:20:17 2013 +0000
- Revision:
- 0:f8571ffd252a
First
Who changed what in which revision?
User | Revision | Line number | New 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 | } |