blob: b00d1b4512d555b1dcb156c33ca032ebe1276fc6 [file] [log] [blame]
Brian Silvermanf92396c2013-09-12 20:13:13 -07001#include "analog.h"
brians0ab60bb2013-01-31 02:21:51 +00002
Brian Silverman74acd622013-10-26 14:47:14 -07003#include "LPC17xx.h"
Austin Schuh63d0e9b2013-03-27 04:43:14 +00004
Brian Silverman6ad00b82013-03-27 19:02:38 -07005void analog_init(void) {
Brian Silverman6ad00b82013-03-27 19:02:38 -07006 SC->PCONP |= PCONP_PCAD;
brians0ab60bb2013-01-31 02:21:51 +00007
Brian Silverman6ad00b82013-03-27 19:02:38 -07008 // Enable AD0.0, AD0.1, AD0.2, AD0.3
Brian Silverman74acd622013-10-26 14:47:14 -07009 PINCON->PINSEL1 &= ~(2 << 14 | 2 << 16 | 2 << 18 | 2 << 20);
10 PINCON->PINSEL1 |= 1 << 14 | 1 << 16 | 1 << 18 | 1 << 20;
Brian Silverman6ad00b82013-03-27 19:02:38 -070011 ADC->ADCR = 0x00200500;
Brian Silverman74acd622013-10-26 14:47:14 -070012 ADC->ADCR = (1 << 0 | 1 << 1 | 1 << 2 | 1 << 3) /* enable all 4 */ |
13 7 << 8 /* 100MHz / 8 = 12.5MHz */ |
14 1 << 16 /* enable burst mode */ |
15 1 << 21 /* turn on ADC */;
brians0ab60bb2013-01-31 02:21:51 +000016}
17
Brian Silverman74acd622013-10-26 14:47:14 -070018uint16_t analog(int channel) {
19 uint32_t value;
20 do {
21 switch (channel) {
22 case 0:
23 value = ADC->ADDR0;
24 break;
25 case 1:
26 value = ADC->ADDR1;
27 break;
28 case 2:
29 value = ADC->ADDR2;
30 break;
31 case 3:
32 value = ADC->ADDR3;
33 break;
34 default:
35 return 0xFFFF;
36 }
37 } while (!(value & 1 << 31));
brians0ab60bb2013-01-31 02:21:51 +000038
Brian Silverman74acd622013-10-26 14:47:14 -070039 return ((value & 0xFFF0) >> 4);
brians0ab60bb2013-01-31 02:21:51 +000040}