Fork of Smoothie to port to mbed non-LPC targets.

Dependencies:   mbed

Fork of Smoothie by Stéphane Cachat

Committer:
Michael J. Spencer
Date:
Fri Feb 28 18:52:52 2014 -0800
Revision:
2:1df0b61d3b5a
Update to latest Smoothie.

Who changed what in which revision?

UserRevisionLine numberNew contents of line
Michael J. Spencer 2:1df0b61d3b5a 1 /* mbed Library - ADC
Michael J. Spencer 2:1df0b61d3b5a 2 * Copyright (c) 2010, sblandford
Michael J. Spencer 2:1df0b61d3b5a 3 * released under MIT license http://mbed.org/licence/mit
Michael J. Spencer 2:1df0b61d3b5a 4 */
Michael J. Spencer 2:1df0b61d3b5a 5
Michael J. Spencer 2:1df0b61d3b5a 6 #ifndef MBED_ADC_H
Michael J. Spencer 2:1df0b61d3b5a 7 #define MBED_ADC_H
Michael J. Spencer 2:1df0b61d3b5a 8
Michael J. Spencer 2:1df0b61d3b5a 9 #include "PinNames.h" // mbed.h lib
Michael J. Spencer 2:1df0b61d3b5a 10 #define XTAL_FREQ 12000000
Michael J. Spencer 2:1df0b61d3b5a 11 #define MAX_ADC_CLOCK 13000000
Michael J. Spencer 2:1df0b61d3b5a 12 #define CLKS_PER_SAMPLE 64
Michael J. Spencer 2:1df0b61d3b5a 13
Michael J. Spencer 2:1df0b61d3b5a 14 class ADC {
Michael J. Spencer 2:1df0b61d3b5a 15 public:
Michael J. Spencer 2:1df0b61d3b5a 16
Michael J. Spencer 2:1df0b61d3b5a 17 //Initialize ADC with ADC maximum sample rate of
Michael J. Spencer 2:1df0b61d3b5a 18 //sample_rate and system clock divider of cclk_div
Michael J. Spencer 2:1df0b61d3b5a 19 //Maximum recommened sample rate is 184000
Michael J. Spencer 2:1df0b61d3b5a 20 ADC(int sample_rate, int cclk_div);
Michael J. Spencer 2:1df0b61d3b5a 21
Michael J. Spencer 2:1df0b61d3b5a 22 //Enable/disable ADC on pin according to state
Michael J. Spencer 2:1df0b61d3b5a 23 //and also select/de-select for next conversion
Michael J. Spencer 2:1df0b61d3b5a 24 void setup(PinName pin, int state);
Michael J. Spencer 2:1df0b61d3b5a 25
Michael J. Spencer 2:1df0b61d3b5a 26 //Return enabled/disabled state of ADC on pin
Michael J. Spencer 2:1df0b61d3b5a 27 int setup(PinName pin);
Michael J. Spencer 2:1df0b61d3b5a 28
Michael J. Spencer 2:1df0b61d3b5a 29 //Enable/disable burst mode according to state
Michael J. Spencer 2:1df0b61d3b5a 30 void burst(int state);
Michael J. Spencer 2:1df0b61d3b5a 31
Michael J. Spencer 2:1df0b61d3b5a 32 //Select channel already setup
Michael J. Spencer 2:1df0b61d3b5a 33 void select(PinName pin);
Michael J. Spencer 2:1df0b61d3b5a 34
Michael J. Spencer 2:1df0b61d3b5a 35 //Return burst mode enabled/disabled
Michael J. Spencer 2:1df0b61d3b5a 36 int burst(void);
Michael J. Spencer 2:1df0b61d3b5a 37
Michael J. Spencer 2:1df0b61d3b5a 38 /*Set start condition and edge according to mode:
Michael J. Spencer 2:1df0b61d3b5a 39 0 - No start (this value should be used when clearing PDN to 0).
Michael J. Spencer 2:1df0b61d3b5a 40 1 - Start conversion now.
Michael J. Spencer 2:1df0b61d3b5a 41 2 - Start conversion when the edge selected by bit 27 occurs on the P2.10 / EINT0 / NMI pin.
Michael J. Spencer 2:1df0b61d3b5a 42 3 - Start conversion when the edge selected by bit 27 occurs on the P1.27 / CLKOUT /
Michael J. Spencer 2:1df0b61d3b5a 43 USB_OVRCRn / CAP0.1 pin.
Michael J. Spencer 2:1df0b61d3b5a 44 4 - Start conversion when the edge selected by bit 27 occurs on MAT0.1. Note that this does
Michael J. Spencer 2:1df0b61d3b5a 45 not require that the MAT0.1 function appear on a device pin.
Michael J. Spencer 2:1df0b61d3b5a 46 5 - Start conversion when the edge selected by bit 27 occurs on MAT0.3. Note that it is not
Michael J. Spencer 2:1df0b61d3b5a 47 possible to cause the MAT0.3 function to appear on a device pin.
Michael J. Spencer 2:1df0b61d3b5a 48 6 - Start conversion when the edge selected by bit 27 occurs on MAT1.0. Note that this does
Michael J. Spencer 2:1df0b61d3b5a 49 not require that the MAT1.0 function appear on a device pin.
Michael J. Spencer 2:1df0b61d3b5a 50 7 - Start conversion when the edge selected by bit 27 occurs on MAT1.1. Note that this does
Michael J. Spencer 2:1df0b61d3b5a 51 not require that the MAT1.1 function appear on a device pin.
Michael J. Spencer 2:1df0b61d3b5a 52 When mode >= 2, conversion is triggered by edge:
Michael J. Spencer 2:1df0b61d3b5a 53 0 - Rising edge
Michael J. Spencer 2:1df0b61d3b5a 54 1 - Falling edge
Michael J. Spencer 2:1df0b61d3b5a 55 */
Michael J. Spencer 2:1df0b61d3b5a 56 void startmode(int mode, int edge);
Michael J. Spencer 2:1df0b61d3b5a 57
Michael J. Spencer 2:1df0b61d3b5a 58 //Return startmode state according to mode_edge=0: mode and mode_edge=1: edge
Michael J. Spencer 2:1df0b61d3b5a 59 int startmode(int mode_edge);
Michael J. Spencer 2:1df0b61d3b5a 60
Michael J. Spencer 2:1df0b61d3b5a 61 //Start ADC conversion
Michael J. Spencer 2:1df0b61d3b5a 62 void start(void);
Michael J. Spencer 2:1df0b61d3b5a 63
Michael J. Spencer 2:1df0b61d3b5a 64 //Set interrupt enable/disable for pin to state
Michael J. Spencer 2:1df0b61d3b5a 65 void interrupt_state(PinName pin, int state);
Michael J. Spencer 2:1df0b61d3b5a 66
Michael J. Spencer 2:1df0b61d3b5a 67 //Return enable/disable state of interrupt for pin
Michael J. Spencer 2:1df0b61d3b5a 68 int interrupt_state(PinName pin);
Michael J. Spencer 2:1df0b61d3b5a 69
Michael J. Spencer 2:1df0b61d3b5a 70 //Attach custom interrupt handler replacing default
Michael J. Spencer 2:1df0b61d3b5a 71 void attach(void(*fptr)(void));
Michael J. Spencer 2:1df0b61d3b5a 72
Michael J. Spencer 2:1df0b61d3b5a 73 //Restore default interrupt handler
Michael J. Spencer 2:1df0b61d3b5a 74 void detach(void);
Michael J. Spencer 2:1df0b61d3b5a 75
Michael J. Spencer 2:1df0b61d3b5a 76 //Append custom interrupt handler for pin
Michael J. Spencer 2:1df0b61d3b5a 77 void append(PinName pin, void(*fptr)(uint32_t value));
Michael J. Spencer 2:1df0b61d3b5a 78
Michael J. Spencer 2:1df0b61d3b5a 79 //Unappend custom interrupt handler for pin
Michael J. Spencer 2:1df0b61d3b5a 80 void unappend(PinName pin);
Michael J. Spencer 2:1df0b61d3b5a 81
Michael J. Spencer 2:1df0b61d3b5a 82 //Append custom global interrupt handler
Michael J. Spencer 2:1df0b61d3b5a 83 void append(void(*fptr)(int chan, uint32_t value));
Michael J. Spencer 2:1df0b61d3b5a 84
Michael J. Spencer 2:1df0b61d3b5a 85 //Unappend custom global interrupt handler
Michael J. Spencer 2:1df0b61d3b5a 86 void unappend(void);
Michael J. Spencer 2:1df0b61d3b5a 87
Michael J. Spencer 2:1df0b61d3b5a 88 //Set ADC offset to a value 0-7
Michael J. Spencer 2:1df0b61d3b5a 89 void offset(int offset);
Michael J. Spencer 2:1df0b61d3b5a 90
Michael J. Spencer 2:1df0b61d3b5a 91 //Return current ADC offset
Michael J. Spencer 2:1df0b61d3b5a 92 int offset(void);
Michael J. Spencer 2:1df0b61d3b5a 93
Michael J. Spencer 2:1df0b61d3b5a 94 //Return value of ADC on pin
Michael J. Spencer 2:1df0b61d3b5a 95 int read(PinName pin);
Michael J. Spencer 2:1df0b61d3b5a 96
Michael J. Spencer 2:1df0b61d3b5a 97 //Return DONE flag of ADC on pin
Michael J. Spencer 2:1df0b61d3b5a 98 int done(PinName pin);
Michael J. Spencer 2:1df0b61d3b5a 99
Michael J. Spencer 2:1df0b61d3b5a 100 //Return OVERRUN flag of ADC on pin
Michael J. Spencer 2:1df0b61d3b5a 101 int overrun(PinName pin);
Michael J. Spencer 2:1df0b61d3b5a 102
Michael J. Spencer 2:1df0b61d3b5a 103 //Return actual ADC clock
Michael J. Spencer 2:1df0b61d3b5a 104 int actual_adc_clock(void);
Michael J. Spencer 2:1df0b61d3b5a 105
Michael J. Spencer 2:1df0b61d3b5a 106 //Return actual maximum sample rate
Michael J. Spencer 2:1df0b61d3b5a 107 int actual_sample_rate(void);
Michael J. Spencer 2:1df0b61d3b5a 108
Michael J. Spencer 2:1df0b61d3b5a 109 //Return pin ID of ADC channel
Michael J. Spencer 2:1df0b61d3b5a 110 PinName channel_to_pin(int chan);
Michael J. Spencer 2:1df0b61d3b5a 111
Michael J. Spencer 2:1df0b61d3b5a 112 //Return pin number of ADC channel
Michael J. Spencer 2:1df0b61d3b5a 113 int channel_to_pin_number(int chan);
Michael J. Spencer 2:1df0b61d3b5a 114
Michael J. Spencer 2:1df0b61d3b5a 115
Michael J. Spencer 2:1df0b61d3b5a 116 private:
Michael J. Spencer 2:1df0b61d3b5a 117 int _pin_to_channel(PinName pin);
Michael J. Spencer 2:1df0b61d3b5a 118 uint32_t _data_of_pin(PinName pin);
Michael J. Spencer 2:1df0b61d3b5a 119
Michael J. Spencer 2:1df0b61d3b5a 120 int _adc_clk_freq;
Michael J. Spencer 2:1df0b61d3b5a 121 void adcisr(void);
Michael J. Spencer 2:1df0b61d3b5a 122 static void _adcisr(void);
Michael J. Spencer 2:1df0b61d3b5a 123 static ADC *instance;
Michael J. Spencer 2:1df0b61d3b5a 124
Michael J. Spencer 2:1df0b61d3b5a 125 uint32_t _adc_data[8];
Michael J. Spencer 2:1df0b61d3b5a 126 void(*_adc_isr[8])(uint32_t value);
Michael J. Spencer 2:1df0b61d3b5a 127 void(*_adc_g_isr)(int chan, uint32_t value);
Michael J. Spencer 2:1df0b61d3b5a 128 void(*_adc_m_isr)(void);
Michael J. Spencer 2:1df0b61d3b5a 129 };
Michael J. Spencer 2:1df0b61d3b5a 130
Michael J. Spencer 2:1df0b61d3b5a 131 #endif