Test Ver
Dependencies: mbed FatFileSystem
HighSpeedAnalogIn/HighSpeedAnalogIn.cpp@0:269589d8d2c2, 2012-11-17 (annotated)
- Committer:
- jksoft
- Date:
- Sat Nov 17 13:22:00 2012 +0000
- Revision:
- 0:269589d8d2c2
Test Program
Who changed what in which revision?
User | Revision | Line number | New 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 | } |