blob: b2ab48ffe476dc799ca4e7bad0f88fd2c9a99b8c [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 Silverman1ba46c72013-10-31 16:05:57 -07009 PINCON->PINSEL1 &= ~(3 << 14 | 3 << 16 | 3 << 18 | 3 << 20);
Brian Silverman74acd622013-10-26 14:47:14 -070010 PINCON->PINSEL1 |= 1 << 14 | 1 << 16 | 1 << 18 | 1 << 20;
Brian Silverman74acd622013-10-26 14:47:14 -070011 ADC->ADCR = (1 << 0 | 1 << 1 | 1 << 2 | 1 << 3) /* enable all 4 */ |
12 7 << 8 /* 100MHz / 8 = 12.5MHz */ |
13 1 << 16 /* enable burst mode */ |
14 1 << 21 /* turn on ADC */;
brians0ab60bb2013-01-31 02:21:51 +000015}
16
Brian Silverman74acd622013-10-26 14:47:14 -070017uint16_t analog(int channel) {
18 uint32_t value;
19 do {
20 switch (channel) {
21 case 0:
22 value = ADC->ADDR0;
23 break;
24 case 1:
25 value = ADC->ADDR1;
26 break;
27 case 2:
28 value = ADC->ADDR2;
29 break;
30 case 3:
31 value = ADC->ADDR3;
32 break;
33 default:
34 return 0xFFFF;
35 }
36 } while (!(value & 1 << 31));
brians0ab60bb2013-01-31 02:21:51 +000037
Brian Silverman1ba46c72013-10-31 16:05:57 -070038 return (value >> 4) & 0x3FF;
brians0ab60bb2013-01-31 02:21:51 +000039}