blob: 8dcaf26c58312a16c701c85f54be5f6f325b4914 [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 Silverman3e9464f2013-11-01 15:36:08 -07005#define USE_BURST 0
6
Brian Silverman6ad00b82013-03-27 19:02:38 -07007void analog_init(void) {
Brian Silverman6ad00b82013-03-27 19:02:38 -07008 SC->PCONP |= PCONP_PCAD;
brians0ab60bb2013-01-31 02:21:51 +00009
Brian Silverman3e9464f2013-11-01 15:36:08 -070010 // Enable AD0.0, AD0.1, AD0.2, and AD0.3.
Brian Silverman1ba46c72013-10-31 16:05:57 -070011 PINCON->PINSEL1 &= ~(3 << 14 | 3 << 16 | 3 << 18 | 3 << 20);
Brian Silverman74acd622013-10-26 14:47:14 -070012 PINCON->PINSEL1 |= 1 << 14 | 1 << 16 | 1 << 18 | 1 << 20;
Brian Silverman3e9464f2013-11-01 15:36:08 -070013
14#if USE_BURST
Brian Silverman74acd622013-10-26 14:47:14 -070015 ADC->ADCR = (1 << 0 | 1 << 1 | 1 << 2 | 1 << 3) /* enable all 4 */ |
16 7 << 8 /* 100MHz / 8 = 12.5MHz */ |
17 1 << 16 /* enable burst mode */ |
18 1 << 21 /* turn on ADC */;
Brian Silverman3e9464f2013-11-01 15:36:08 -070019#else
20 ADC->ADCR = 7 << 8 /* 100MHz / 8 = 12.5MHz */ |
21 1 << 21 /* turn on ADC */;
22#endif
brians0ab60bb2013-01-31 02:21:51 +000023}
24
Brian Silverman74acd622013-10-26 14:47:14 -070025uint16_t analog(int channel) {
Brian Silverman3e9464f2013-11-01 15:36:08 -070026#if !USE_BURST
27 // Set the channel number to the one we want.
28 ADC->ADCR = (ADC->ADCR & ~0xFF) | (1 << channel);
29 ADC->ADCR |= 1 << 24; // start conversion
30#endif
Brian Silverman74acd622013-10-26 14:47:14 -070031 uint32_t value;
32 do {
33 switch (channel) {
34 case 0:
35 value = ADC->ADDR0;
36 break;
37 case 1:
38 value = ADC->ADDR1;
39 break;
40 case 2:
41 value = ADC->ADDR2;
42 break;
43 case 3:
44 value = ADC->ADDR3;
45 break;
46 default:
47 return 0xFFFF;
48 }
49 } while (!(value & 1 << 31));
brians0ab60bb2013-01-31 02:21:51 +000050
Brian Silverman1ba46c72013-10-31 16:05:57 -070051 return (value >> 4) & 0x3FF;
brians0ab60bb2013-01-31 02:21:51 +000052}