Skip to content

Commit aaa0811

Browse files
jeremybrodt0xc0170
authored andcommitted
Cleaned up analogin.
1 parent ac18ffe commit aaa0811

File tree

1 file changed

+46
-47
lines changed

1 file changed

+46
-47
lines changed

hal/targets/hal/TARGET_Maxim/TARGET_MAX32620/analogin_api.c

Lines changed: 46 additions & 47 deletions
Original file line numberDiff line numberDiff line change
@@ -35,19 +35,16 @@
3535
#include "analogin_api.h"
3636
#include "clkman_regs.h"
3737
#include "pwrman_regs.h"
38+
#include "trim_regs.h"
3839
#include "PeripheralPins.h"
3940

40-
#define UNTRIM
41-
#define MXC_BASE_FTR_TRIM_REG11 0x4000102C
42-
#define MXC_BASE_FTR_TRIM_REG12 0x40001030
43-
4441
#define PGA_TRK_CNT 0x1F
4542
#define ADC_ACT_CNT 0x1
4643
#define ADC_PGA_CNT 0x1
4744
#define ADC_ACQ_CNT 0x1
4845
#define ADC_SLP_CNT 0x1
4946

50-
#define ADC_FULL_SCALE 0x3FF
47+
#define ADC_FULL_SCALE 0x3FF
5148
#define ADC_EXTERNAL_LAST_INPUT 3
5249

5350
// Only allow initialization once
@@ -57,44 +54,45 @@ static int initialized = 0;
5754
void analogin_init(analogin_t *obj, PinName pin)
5855
{
5956
// Make sure pin is an analog pin we can use for ADC
60-
MBED_ASSERT((ADCName)pinmap_peripheral(pin, PinMap_ADC) != (ADCName)NC);
57+
MBED_ASSERT((ADCName)pinmap_peripheral(pin, PinMap_ADC) != (ADCName)NC);
6158

6259
// Set the object pointer
6360
obj->adc = MXC_ADC;
6461
obj->adc_pin = pin;
6562

66-
if (initialized == 0) {
67-
// Enable AFE power
68-
MXC_PWRMAN->pwr_rst_ctrl |= MXC_F_PWRMAN_PWR_RST_CTRL_AFE_POWERED;
63+
if (initialized == 0) {
64+
// Enable AFE power
65+
MXC_PWRMAN->pwr_rst_ctrl |= MXC_F_PWRMAN_PWR_RST_CTRL_AFE_POWERED;
6966

70-
// Enable the clock
71-
MXC_CLKMAN->clk_ctrl |= MXC_F_CLKMAN_CLK_CTRL_ADC_CLOCK_ENABLE;
67+
// Enable the clock
68+
MXC_CLKMAN->clk_ctrl |= MXC_F_CLKMAN_CLK_CTRL_ADC_CLOCK_ENABLE;
7269

73-
// Enable clock gate
74-
MXC_CLKMAN->clk_gate_ctrl2 |= MXC_F_CLKMAN_CLK_GATE_CTRL2_ADC_CLK_GATER;
70+
// Enable clock gate
71+
MXC_CLKMAN->clk_gate_ctrl2 |= MXC_F_CLKMAN_CLK_GATE_CTRL2_ADC_CLK_GATER;
7572

76-
// Enable interface clock
77-
obj->adc->ctrl |= MXC_F_ADC_CTRL_ADC_CLK_EN;
73+
// Enable interface clock
74+
obj->adc->ctrl |= MXC_F_ADC_CTRL_ADC_CLK_EN;
7875

79-
#ifdef UNTRIM
80-
*(volatile uint32_t *) MXC_BASE_FTR_TRIM_REG11 = 0x02000200;
81-
*(volatile uint32_t *) MXC_BASE_FTR_TRIM_REG12 = 0x02000200;
82-
#endif
76+
if ((MXC_TRIM->reg11_adc_trim0 == 0xFFFFFFFF) && (MXC_TRIM->reg12_adc_trim1 == 0xFFFFFFFF)) {
77+
// Set default trim for untrimmed parts.
78+
MXC_TRIM->reg11_adc_trim0 = 0x02000200;
79+
MXC_TRIM->reg12_adc_trim1 = 0x02000200;
80+
}
8381

84-
// Clear ADC ready interrupt (wite 1 to clr)
85-
obj->adc->intr = (obj->adc->intr & 0xFFFF) | MXC_F_ADC_INTR_ADC_REF_READY_IF;
82+
// Clear ADC ready interrupt (wite 1 to clr)
83+
obj->adc->intr = (obj->adc->intr & 0xFFFF) | MXC_F_ADC_INTR_ADC_REF_READY_IF;
8684

87-
// Using internal reference of 1.20V
85+
// Using internal reference of 1.20V
8886

89-
// Enable ADC power bypass the buffer
90-
obj->adc->ctrl |= (MXC_F_ADC_CTRL_ADC_PU | MXC_F_ADC_CTRL_ADC_REFBUF_PU |
91-
MXC_F_ADC_CTRL_ADC_CHGPUMP_PU | MXC_F_ADC_CTRL_BUF_BYPASS);
87+
// Enable ADC power bypass the buffer
88+
obj->adc->ctrl |= (MXC_F_ADC_CTRL_ADC_PU | MXC_F_ADC_CTRL_ADC_REFBUF_PU |
89+
MXC_F_ADC_CTRL_ADC_CHGPUMP_PU | MXC_F_ADC_CTRL_BUF_BYPASS);
9290

93-
// Wait for ADC ready
94-
while ( !(obj->adc->intr & MXC_F_ADC_INTR_ADC_REF_READY_IF) );
91+
// Wait for ADC ready
92+
while (!(obj->adc->intr & MXC_F_ADC_INTR_ADC_REF_READY_IF));
9593

96-
initialized = 1;
97-
}
94+
initialized = 1;
95+
}
9896
}
9997

10098
//******************************************************************************
@@ -111,36 +109,37 @@ uint16_t analogin_read_u16(analogin_t *obj)
111109
uint32_t adc_input = PINNAME_TO_PIN(obj->adc_pin);
112110

113111
// Select the channel
114-
obj->adc->ctrl &= ~MXC_F_ADC_CTRL_ADC_CHSEL;
115-
obj->adc->ctrl |= (adc_input << MXC_F_ADC_CTRL_ADC_CHSEL_POS) & MXC_F_ADC_CTRL_ADC_CHSEL;
112+
obj->adc->ctrl &= ~MXC_F_ADC_CTRL_ADC_CHSEL;
113+
obj->adc->ctrl |= (adc_input << MXC_F_ADC_CTRL_ADC_CHSEL_POS) & MXC_F_ADC_CTRL_ADC_CHSEL;
116114

117-
// We want unity gain, to get full 0-Vref range
118-
// So, both ref and adc input scale should be enabled
119-
obj->adc->ctrl |= MXC_F_ADC_CTRL_ADC_SCALE | MXC_F_ADC_CTRL_ADC_REFSCL;
115+
// We want unity gain, to get full 0-Vref range
116+
// So, both ref and adc input scale should be enabled
117+
obj->adc->ctrl |= MXC_F_ADC_CTRL_ADC_SCALE | MXC_F_ADC_CTRL_ADC_REFSCL;
120118

121-
// Not using internal buffer, disable anyway
122-
obj->adc->ctrl &= ~MXC_F_ADC_CTRL_BUF_PU;
123-
obj->adc->ctrl |= MXC_F_ADC_CTRL_BUF_BYPASS;
119+
// Not using internal buffer, disable anyway
120+
obj->adc->ctrl &= ~MXC_F_ADC_CTRL_BUF_PU;
121+
obj->adc->ctrl |= MXC_F_ADC_CTRL_BUF_BYPASS;
124122

125-
// Normal LSB justified data alignment
123+
// Normal LSB justified data alignment
126124

127-
// Not using limits
125+
// Not using limits
128126

129127
// Clear ADC done flag (wite 1 to clr)
130128
obj->adc->intr = (obj->adc->intr & 0xFFFF) | MXC_F_ADC_INTR_ADC_DONE_IF;
131129

132-
// Start the conversion
133-
obj->adc->ctrl |= MXC_F_ADC_CTRL_CPU_ADC_START;
130+
// Start the conversion
131+
obj->adc->ctrl |= MXC_F_ADC_CTRL_CPU_ADC_START;
134132

135-
// Wait for ADC done
136-
while ( !(obj->adc->intr & MXC_F_ADC_INTR_ADC_DONE_IF) );
133+
// Wait for ADC done
134+
while (!(obj->adc->intr & MXC_F_ADC_INTR_ADC_DONE_IF));
137135

138136
// Get sample from the fifo
139-
uint16_t sample = (uint16_t)(obj->adc->data & 0xFFFF);
137+
uint16_t sample = obj->adc->data;
140138

141-
// Check for overflow, hardware will report overflow as 0
142-
if ( (obj->adc->status & MXC_F_ADC_STATUS_ADC_OVERFLOW) == MXC_F_ADC_STATUS_ADC_OVERFLOW )
143-
sample = (uint16_t)ADC_FULL_SCALE;
139+
// Check for overflow, hardware will report overflow as 0
140+
if (obj->adc->status & MXC_F_ADC_STATUS_ADC_OVERFLOW) {
141+
sample = (uint16_t)ADC_FULL_SCALE;
142+
}
144143

145144
return sample;
146145
}

0 commit comments

Comments
 (0)