Skip to content

Commit eeee8b3

Browse files
committed
Fix ANALOGIN support for LPC55S69
1. Update to handle 12-bit resolution 2. Properly handle the pin configuration 3. Update the pin setup to handle the ADC B channel Signed-off-by: Mahesh Mahadevan <[email protected]>
1 parent 417a9fe commit eeee8b3

File tree

4 files changed

+67
-34
lines changed

4 files changed

+67
-34
lines changed

targets/TARGET_NXP/TARGET_MCUXpresso_MCUS/TARGET_LPC/lp_analogin_api.c

Lines changed: 26 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -77,9 +77,15 @@ void analogin_init(analogin_t *obj, PinName pin)
7777

7878
pinmap_pinout(pin, PinMap_ADC);
7979

80+
/* Need to ensure the pin is in input mode */
81+
gpio_init(&gpio, pin);
82+
gpio_dir(&gpio, PIN_INPUT);
83+
8084
reg = IOCON->PIO[port_number][pin_number];
81-
/* Clear the DIGIMODE bit */
82-
reg &= ~IOCON_PIO_DIGIMODE_MASK;
85+
86+
/* Clear the MODE & DIGIMODE bit */
87+
reg &= ~(IOCON_PIO_DIGIMODE_MASK | IOCON_PIO_MODE_MASK);
88+
8389
/* For pins PIO0_9, PIO0_11, PIO0_12, PIO0_15, PIO0_18, PIO0_31, PIO1_0 and
8490
PIO1_9, leave ASW bit at '0' in the related IOCON register. */
8591
if (((port_number == 0) && ((pin_number == 9) || (pin_number == 11) || (pin_number == 12) ||
@@ -91,11 +97,8 @@ void analogin_init(analogin_t *obj, PinName pin)
9197
/* Enable Analog Switch Input control */
9298
reg |= IOCON_PIO_ASW_MASK;
9399
}
94-
IOCON->PIO[port_number][pin_number] = reg;
95100

96-
/* Need to ensure the pin is in input mode */
97-
gpio_init(&gpio, pin);
98-
gpio_dir(&gpio, PIN_INPUT);
101+
IOCON->PIO[port_number][pin_number] = reg;
99102
}
100103

101104
uint16_t analogin_read_u16(analogin_t *obj)
@@ -110,16 +113,30 @@ uint16_t analogin_read_u16(analogin_t *obj)
110113
memset(&mLpadcCommandConfigStruct, 0, sizeof(mLpadcCommandConfigStruct));
111114
memset(&mLpadcResultConfigStruct, 0, sizeof(mLpadcResultConfigStruct));
112115

116+
#if (defined(FSL_FEATURE_LPADC_FIFO_COUNT) && (FSL_FEATURE_LPADC_FIFO_COUNT == 2))
117+
LPADC_DoResetFIFO0(adc_addrs[instance]);
118+
LPADC_DoResetFIFO1(adc_addrs[instance]);
119+
#else
120+
LPADC_DoResetFIFO(adc_addrs[instance]);
121+
#endif /* FSL_FEATURE_LPADC_FIFO_COUNT */
122+
113123
/* Set conversion CMD configuration. */
114124
LPADC_GetDefaultConvCommandConfig(&mLpadcCommandConfigStruct);
125+
126+
/* Check if we should use the B channel */
127+
if (obj->adc >> ADC_B_CHANNEL_SHIFT) {
128+
mLpadcCommandConfigStruct.sampleChannelMode = kLPADC_SampleChannelSingleEndSideB;
129+
}
130+
115131
mLpadcCommandConfigStruct.channelNumber = channel;
132+
mLpadcCommandConfigStruct.conversionResoultuionMode = kLPADC_ConversionResolutionStandard;
116133
LPADC_SetConvCommandConfig(adc_addrs[instance], LPADC_USER_CMDID, &mLpadcCommandConfigStruct);
117134

118135
/* Set trigger configuration. */
119136
LPADC_GetDefaultConvTriggerConfig(&mLpadcTriggerConfigStruct);
120137
mLpadcTriggerConfigStruct.targetCommandId = LPADC_USER_CMDID;
121138
mLpadcTriggerConfigStruct.enableHardwareTrigger = false;
122-
LPADC_SetConvTriggerConfig(adc_addrs[instance], 0U, &mLpadcTriggerConfigStruct); /* Configurate the trigger0. */
139+
LPADC_SetConvTriggerConfig(adc_addrs[instance], 0U, &mLpadcTriggerConfigStruct); /* Configure the trigger0. */
123140

124141
LPADC_DoSoftwareTrigger(adc_addrs[instance], 1U); /* 1U is trigger0 mask. */
125142

@@ -131,13 +148,13 @@ uint16_t analogin_read_u16(analogin_t *obj)
131148
}
132149
#endif /* FSL_FEATURE_LPADC_FIFO_COUNT */
133150

134-
return ((mLpadcResultConfigStruct.convValue) >> 3U);
151+
return (mLpadcResultConfigStruct.convValue << 1);
135152
}
136153

137154
float analogin_read(analogin_t *obj)
138155
{
139156
uint16_t value = analogin_read_u16(obj);
140-
return (float)value * (1.0f / (float)0xFFFF);
157+
return (float)value * (1.0f / (float)0xFFF0);
141158
}
142159

143160
const PinMap *analogin_pinmap()

targets/TARGET_NXP/TARGET_MCUXpresso_MCUS/TARGET_LPC55S69/TARGET_LPCXpresso/PeripheralNames.h

Lines changed: 32 additions & 16 deletions
Original file line numberDiff line numberDiff line change
@@ -81,22 +81,38 @@ typedef enum {
8181
#define ADC_B_CHANNEL_SHIFT 5
8282

8383
typedef enum {
84-
ADC0_SE0 = 0,
85-
ADC0_SE1 = 1,
86-
ADC0_SE2 = 2,
87-
ADC0_SE3 = 3,
88-
ADC0_SE4 = 4,
89-
ADC0_SE5 = 5,
90-
ADC0_SE6 = 6,
91-
ADC0_SE7 = 7,
92-
ADC0_SE8 = 8,
93-
ADC0_SE9 = 9,
94-
ADC0_SE10 = 10,
95-
ADC0_SE11 = 11,
96-
ADC0_SE12 = 12,
97-
ADC0_SE13 = 13,
98-
ADC0_SE14 = 14,
99-
ADC0_SE15 = 15
84+
ADC0_SE0 = 0,
85+
ADC0_SE1 = 1,
86+
ADC0_SE2 = 2,
87+
ADC0_SE3 = 3,
88+
ADC0_SE4 = 4,
89+
ADC0_SE5 = 5,
90+
ADC0_SE6 = 6,
91+
ADC0_SE7 = 7,
92+
ADC0_SE8 = 8,
93+
ADC0_SE9 = 9,
94+
ADC0_SE10 = 10,
95+
ADC0_SE11 = 11,
96+
ADC0_SE12 = 12,
97+
ADC0_SE13 = 13,
98+
ADC0_SE14 = 14,
99+
ADC0_SE15 = 15,
100+
ADC0_SE0_B = (1 << ADC_B_CHANNEL_SHIFT) | 0,
101+
ADC0_SE1_B = (1 << ADC_B_CHANNEL_SHIFT) | 1,
102+
ADC0_SE2_B = (1 << ADC_B_CHANNEL_SHIFT) | 2,
103+
ADC0_SE3_B = (1 << ADC_B_CHANNEL_SHIFT) | 3,
104+
ADC0_SE4_B = (1 << ADC_B_CHANNEL_SHIFT) | 4,
105+
ADC0_SE5_B = (1 << ADC_B_CHANNEL_SHIFT) | 5,
106+
ADC0_SE6_B = (1 << ADC_B_CHANNEL_SHIFT) | 6,
107+
ADC0_SE7_B = (1 << ADC_B_CHANNEL_SHIFT) | 7,
108+
ADC0_SE8_B = (1 << ADC_B_CHANNEL_SHIFT) | 8,
109+
ADC0_SE9_B = (1 << ADC_B_CHANNEL_SHIFT) | 9,
110+
ADC0_SE10_B = (1 << ADC_B_CHANNEL_SHIFT) | 10,
111+
ADC0_SE11_B = (1 << ADC_B_CHANNEL_SHIFT) | 11,
112+
ADC0_SE12_B = (1 << ADC_B_CHANNEL_SHIFT) | 12,
113+
ADC0_SE13_B = (1 << ADC_B_CHANNEL_SHIFT) | 13,
114+
ADC0_SE14_B = (1 << ADC_B_CHANNEL_SHIFT) | 14,
115+
ADC0_SE15_B = (1 << ADC_B_CHANNEL_SHIFT) | 15
100116
} ADCName;
101117

102118
typedef enum {

targets/TARGET_NXP/TARGET_MCUXpresso_MCUS/TARGET_LPC55S69/TARGET_LPCXpresso/PeripheralPins.c

Lines changed: 8 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -23,15 +23,14 @@ const PinMap PinMap_RTC[] = {
2323

2424
/************ADC***************/
2525
const PinMap PinMap_ADC[] = {
26-
{P0_23, ADC0_SE0, 0},
27-
{P0_10, ADC0_SE1, 0},
28-
{P0_31, ADC0_SE3, 0},
29-
{P1_8, ADC0_SE4, 0},
30-
{P2_0, ADC0_SE5, 0},
31-
{P2_13, ADC0_SE6, 0},
32-
{P2_11, ADC0_SE7, 0},
33-
{P0_16, ADC0_SE8, 0},
34-
{NC , NC , 0}
26+
{P0_23, ADC0_SE0, 0},
27+
{P0_10, ADC0_SE1, 0},
28+
{P0_31, ADC0_SE3, 0},
29+
{P1_8, ADC0_SE4, 0},
30+
{P2_0, ADC0_SE5, 0},
31+
{P2_13, ADC0_SE6, 0},
32+
{P2_11, ADC0_SE7, 0},
33+
{NC , NC , 0}
3534
};
3635

3736
/************CAN***************/

targets/TARGET_NXP/TARGET_MCUXpresso_MCUS/TARGET_LPC55S69/TARGET_LPCXpresso/mbed_overrides.c

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -54,6 +54,7 @@ void ADC_ClockPower_Configuration(void)
5454

5555
/* Disable LDOGPADC power down */
5656
POWER_DisablePD(kPDRUNCFG_PD_LDOGPADC);
57+
RESET_PeripheralReset(kADC0_RST_SHIFT_RSTn);
5758
}
5859

5960
void sdio_clock_setup(void)

0 commit comments

Comments
 (0)