lpcXpresso55s16 adc support

キャンセル
次の結果を表示 
表示  限定  | 次の代わりに検索 
もしかして: 

lpcXpresso55s16 adc support

490件の閲覧回数
ArjunDinesh
Contributor I

Hi Team,

Please help me to provide the configuration steps and sample codes of adc read for lpcXpresso55s16 which has to be work with zephyr 3.3.99

0 件の賞賛
3 返答(返信)

401件の閲覧回数
ArjunDinesh
Contributor I

Hi Jun Zhang,

I posted the same query in github.

https://github.com/zephyrproject-rtos/zephyr/discussions/58309

 

Thanking you,

Arjun Dinesh

0 件の賞賛

455件の閲覧回数
ArjunDinesh
Contributor I

Hi Team,

I referred the following tutorial and the ADC reference of Zephyr :

https://www.youtube.com/watch?v=Y8FaEcAp_kY 

https://docs.zephyrproject.org/latest/samples/drivers/adc/README.html 

I made changes to the LPCXpresso55s16 board file by referring the board file of LPCXpresso55s69:

1) Added pinmux_lpadc0 configuration to lpcxpresso55s16-pinctrl.dtsi file
pinmux_lpadc0: pinmux_lpadc0 {
group0 {
pinmux = <ADC0_CH0_PIO0_23>,
<ADC0_CH8_PIO0_16>,
<ADC0_CH4_PIO1_8>,
<ADC0_CH12_PIO1_9>;
slew-rate = "standard";
nxp,analog-mode;
};
};

2) Enabled ADC through adding the below code to lpcxpresso55s16.dts file
&adc0 {
status = "okay";
pinctrl-0 = <&pinmux_lpadc0>;
pinctrl-names = "default";
};

3) Added 'adc' under supported section of the lpcxpresso55s16.yaml file
identifier: lpcxpresso55s16
name: NXP LPCXpresso55S16
type: mcu
arch: arm
ram: 96
flash: 256
toolchain:
- zephyr
- gnuarmemb
- xtools
supported:
- adc
- arduino_gpio
- arduino_i2c
- arduino_spi
- can
- gpio
- i2c
- spi
- usb_device

4) Added adc0 under the aliases field of the lpcxpresso55s16_common.dtsi file
aliases{
led0 = &red_led;
led1 = &green_led;
led2 = &blue_led;
sw0 = &btn_wk;
sw1 = &btn_usr;
sw2 = &btn_isp;
adcctrl = &adc0;
usart-0 = &flexcomm0;
magn0 = &fxos8700;
accel0 = &fxos8700;
};

I used the below code to read the adc samples from LPCXpresso55s16 through PIO0_23/ADC0_0 (12th pin - LPC55S16JBD64)

#include <stdint.h>
#include <stdio.h>
#include <zephyr.h>
#include <device.h>
#include <drivers/adc.h>
#include "logging/osal_log.h"
#include <can_com.h>
#include "can/osal_can.h"

#define ADC_DEVICE_NAME "DT_LABEL(DT_ALIAS(adcctrl))"
OSAL_LOG_MODULE_REGISTER(com_data_handler);

void main(void)
{
enum adc_gain {
ADC_GAIN_1_6,
ADC_GAIN_1_5,
ADC_GAIN_1_4,
ADC_GAIN_1_3,
ADC_GAIN_1_2,
ADC_GAIN_2_3,
ADC_GAIN_1,
ADC_GAIN_2,
ADC_GAIN_3,
ADC_GAIN_4,
ADC_GAIN_8,
ADC_GAIN_16,
ADC_GAIN_32,
ADC_GAIN_64,
};

enum adc_reference {
ADC_REF_VDD_1,
ADC_REF_VDD_1_2,
ADC_REF_VDD_1_3,
ADC_REF_VDD_1_4,
ADC_REF_INTERNAL,
ADC_REF_EXTERNAL0,
ADC_REF_EXTERNAL1,
};

enum adc_input_positive {
ADC_POSITIVE_INPUT_AIN0,
ADC_POSITIVE_INPUT_AIN1,
ADC_POSITIVE_INPUT_AIN2,
ADC_POSITIVE_INPUT_AIN3,
ADC_POSITIVE_INPUT_AIN4,
ADC_POSITIVE_INPUT_AIN5,
ADC_POSITIVE_INPUT_AIN6,
ADC_POSITIVE_INPUT_AIN7,
ADC_POSITIVE_INPUT_AIN8,
ADC_POSITIVE_INPUT_AIN9,
ADC_POSITIVE_INPUT_AIN10,
ADC_POSITIVE_INPUT_AIN11,
ADC_POSITIVE_INPUT_AIN12,
ADC_POSITIVE_INPUT_AIN13,
ADC_POSITIVE_INPUT_AIN14,
ADC_POSITIVE_INPUT_AIN15,
};

struct adc_channel_cfg {
uint32_t acquisition_time;
uint8_t channel_id;
enum adc_input_positive input_positive;
enum adc_gain gain;
enum adc_reference reference;
};

struct adc_sequence {
uint16_t *buffer;
uint16_t buffer_size;
uint8_t resolution;
uint8_t channels;
struct adc_channel_cfg *channels_cfg;
const struct adc_sequence_options *options;
uint32_t timeout;
bool calibrate;
};

const struct device *adc_dev;
struct adc_channel_cfg channel_cfg;
struct adc_sequence sequence;
uint16_t buffer[4];

adc_dev = device_get_binding(ADC_DEVICE_NAME);
if (!adc_dev) {
OSAL_LOG_INF("Failed to get ADC device\n");
return;
}

channel_cfg.gain = ADC_GAIN_1_6;
channel_cfg.reference = ADC_REF_INTERNAL;
channel_cfg.acquisition_time = ADC_ACQ_TIME(ADC_ACQ_TIME_MICROSECONDS, 40);
channel_cfg.channel_id = 0;
channel_cfg.input_positive = ADC_POSITIVE_INPUT_AIN0;

sequence.buffer = buffer;
sequence.buffer_size = sizeof(buffer);
sequence.resolution = 16;
sequence.channels = 1;

sequence.options = NULL;
sequence.timeout = SYS_FOREVER_MS;
sequence.calibrate = false;
sequence.channels_cfg = &channel_cfg;

while (1) {
if (adc_read(adc_dev, &sequence) != 0) {
OSAL_LOG_INF("ADC read failed\n");
return;
}

OSAL_LOG_INF("ADC value: %u\n", buffer[0]);

k_sleep(K_SECONDS(1));
}
}

I am able to build the code without any error. But, after connecting the real LPCXpresso55s16 board and flashed the hex file into the board.
The output is showing error:

*** Booting Zephyr OS build zephyr-v3.3.0-3441-g3154e03c454a ***
[00:00:00.005,000] <inf> com_data_handler: Failed to get ADC device

I am not sure where I made mistakes. If there is any possibilities, please guide me to resolve this issue.
Any suggestions and corrections are greatly appreciated.

Thanks in advance.

 

 

0 件の賞賛

426件の閲覧回数
ZhangJennie
NXP TechSupport
NXP TechSupport

HI ArjunDinesh 

This is Zephr related question, please create a Discussion to GitHub: 

https://github.com/zephyrproject-rtos/zephyr/discussions

Thanks,

Jun Zhang

0 件の賞賛