From 051a2b6cd0b90643f024b980b04187b43fce3ad9 Mon Sep 17 00:00:00 2001 From: Pierrick Curt Date: Tue, 10 Dec 2024 18:24:36 +0100 Subject: [PATCH] samples: drivers: adc: example to use AD4114 on stm32f3_disco This examples shows how to use the AD4114 ADC on a stm32f3_disco board. As the AD4114 is a 24bits ADC resolution we need to be able to pass 32bits buffer to get the samples. CONFIG_SEQUENCE_RESOLUTION is set to 12 instead of 24, and the gain zephyr,vref-mv is adapted to avoid overflows using the exisiting adc_raw_to_millivolts function. Signed-off-by: Pierrick Curt --- samples/drivers/adc/adc_sequence/Kconfig | 4 + .../adc_sequence/boards/stm32f3_disco.conf | 4 + .../adc_sequence/boards/stm32f3_disco.overlay | 146 ++++++++++++++++++ samples/drivers/adc/adc_sequence/sample.yaml | 1 + samples/drivers/adc/adc_sequence/src/main.c | 4 + 5 files changed, 159 insertions(+) create mode 100644 samples/drivers/adc/adc_sequence/boards/stm32f3_disco.conf create mode 100644 samples/drivers/adc/adc_sequence/boards/stm32f3_disco.overlay diff --git a/samples/drivers/adc/adc_sequence/Kconfig b/samples/drivers/adc/adc_sequence/Kconfig index c8351a5e712..e2d97244d4f 100644 --- a/samples/drivers/adc/adc_sequence/Kconfig +++ b/samples/drivers/adc/adc_sequence/Kconfig @@ -9,4 +9,8 @@ config SEQUENCE_RESOLUTION int "Set the resolution of the sequence readings." default 12 +config SEQUENCE_32BITS_REGISTERS + bool "ADC data sequences are on 32bits" + default n + source "Kconfig.zephyr" diff --git a/samples/drivers/adc/adc_sequence/boards/stm32f3_disco.conf b/samples/drivers/adc/adc_sequence/boards/stm32f3_disco.conf new file mode 100644 index 00000000000..08cc33d8603 --- /dev/null +++ b/samples/drivers/adc/adc_sequence/boards/stm32f3_disco.conf @@ -0,0 +1,4 @@ +# A4114 driver can only acquire one sequence sample +CONFIG_SEQUENCE_SAMPLES=1 +CONFIG_SEQUENCE_RESOLUTION=12 +CONFIG_SEQUENCE_32BITS_REGISTERS=y diff --git a/samples/drivers/adc/adc_sequence/boards/stm32f3_disco.overlay b/samples/drivers/adc/adc_sequence/boards/stm32f3_disco.overlay new file mode 100644 index 00000000000..7b171fe759c --- /dev/null +++ b/samples/drivers/adc/adc_sequence/boards/stm32f3_disco.overlay @@ -0,0 +1,146 @@ +/* + * Copyright (c) 2024 Pierrick Curt + * + * SPDX-License-Identifier: Apache-2.0 + */ + +/ { + aliases { + adc0 = &adc_ad4114; + }; +}; + +&spi1 { + pinctrl-0 = <&spi1_nss_pa4 &spi1_sck_pa5 + &spi1_miso_pa6 &spi1_mosi_pa7>; + pinctrl-names = "default"; + status = "okay"; + + adc_ad4114: adc_ad4114@0 { + compatible = "adi,ad4114-adc"; + spi-max-frequency = ; + status = "okay"; + reg = <0>; + #io-channel-cells = <1>; + #address-cells = <1>; + #size-cells = <0>; + + /* INPUTx mapping bits [9:0] for CH0 to CH15 */ + map-inputs = <0x10 0x30 0x50 0x70 0x90 0xB0 0xD0 0xF0 0x110 \ + 0x130 0x150 0x170 0x190 0x1B0 0x1D0 0x1F0>; + + + channel@0 { + reg = <0x0>; + zephyr,gain = "ADC_GAIN_1"; + zephyr,reference = "ADC_REF_EXTERNAL0"; + zephyr,vref-mv = <8>; + zephyr,acquisition-time = ; + }; + channel@1 { + reg = <1>; + zephyr,gain = "ADC_GAIN_1"; + zephyr,reference = "ADC_REF_EXTERNAL0"; + zephyr,vref-mv = <8>; + zephyr,acquisition-time = ; + }; + channel@2 { + reg = <2>; + zephyr,gain = "ADC_GAIN_1"; + zephyr,reference = "ADC_REF_EXTERNAL0"; + zephyr,vref-mv = <8>; + zephyr,acquisition-time = ; + }; + channel@3 { + reg = <3>; + zephyr,gain = "ADC_GAIN_1"; + zephyr,reference = "ADC_REF_EXTERNAL0"; + zephyr,vref-mv = <8>; + zephyr,acquisition-time = ; + }; + channel@4 { + reg = <4>; + zephyr,gain = "ADC_GAIN_1"; + zephyr,reference = "ADC_REF_EXTERNAL0"; + zephyr,vref-mv = <8>; + zephyr,acquisition-time = ; + }; + channel@5 { + reg = <5>; + zephyr,gain = "ADC_GAIN_1"; + zephyr,reference = "ADC_REF_EXTERNAL0"; + zephyr,vref-mv = <8>; + zephyr,acquisition-time = ; + }; + channel@6 { + reg = <6>; + zephyr,gain = "ADC_GAIN_1"; + zephyr,reference = "ADC_REF_EXTERNAL0"; + zephyr,vref-mv = <8>; + zephyr,acquisition-time = ; + }; + channel@7 { + reg = <7>; + zephyr,gain = "ADC_GAIN_1"; + zephyr,reference = "ADC_REF_EXTERNAL0"; + zephyr,vref-mv = <8>; + zephyr,acquisition-time = ; + }; + channel@8 { + reg = <8>; + zephyr,gain = "ADC_GAIN_1"; + zephyr,reference = "ADC_REF_EXTERNAL0"; + zephyr,vref-mv = <8>; + zephyr,acquisition-time = ; + }; + channel@9 { + reg = <9>; + zephyr,gain = "ADC_GAIN_1"; + zephyr,reference = "ADC_REF_EXTERNAL0"; + zephyr,vref-mv = <8>; + zephyr,acquisition-time = ; + }; + channel@a { + reg = <0xa>; + zephyr,gain = "ADC_GAIN_1"; + zephyr,reference = "ADC_REF_EXTERNAL0"; + zephyr,vref-mv = <8>; + zephyr,acquisition-time = ; + }; + channel@b { + reg = <0xb>; + zephyr,gain = "ADC_GAIN_1"; + zephyr,reference = "ADC_REF_EXTERNAL0"; + zephyr,vref-mv = <8>; + zephyr,acquisition-time = ; + }; + channel@c { + reg = <0xc>; + zephyr,gain = "ADC_GAIN_1"; + zephyr,reference = "ADC_REF_EXTERNAL0"; + zephyr,vref-mv = <8>; + zephyr,acquisition-time = ; + }; + channel@d { + reg = <0xd>; + zephyr,gain = "ADC_GAIN_1"; + zephyr,reference = "ADC_REF_EXTERNAL0"; + zephyr,vref-mv = <8>; + zephyr,acquisition-time = ; + }; + channel@e { + reg = <0xe>; + zephyr,gain = "ADC_GAIN_1"; + zephyr,reference = "ADC_REF_EXTERNAL0"; + zephyr,vref-mv = <8>; + zephyr,acquisition-time = ; + }; + channel@f { + reg = <0xf>; + zephyr,gain = "ADC_GAIN_1"; + zephyr,reference = "ADC_REF_EXTERNAL0"; + zephyr,vref-mv = <8>; + zephyr,acquisition-time = ; + }; + }; +}; diff --git a/samples/drivers/adc/adc_sequence/sample.yaml b/samples/drivers/adc/adc_sequence/sample.yaml index 29bcadf4497..0461205a058 100644 --- a/samples/drivers/adc/adc_sequence/sample.yaml +++ b/samples/drivers/adc/adc_sequence/sample.yaml @@ -13,6 +13,7 @@ tests: - nrf54h20dk/nrf54h20/cpuapp - ucans32k1sic - frdm_mcxc242 + - stm32f3_disco integration_platforms: - nrf52840dk/nrf52840 harness: console diff --git a/samples/drivers/adc/adc_sequence/src/main.c b/samples/drivers/adc/adc_sequence/src/main.c index 60bde60650d..d80a09a601e 100644 --- a/samples/drivers/adc/adc_sequence/src/main.c +++ b/samples/drivers/adc/adc_sequence/src/main.c @@ -30,7 +30,11 @@ int main(void) { int err; uint32_t count = 0; +#ifdef CONFIG_SEQUENCE_32BITS_REGISTERS + uint32_t channel_reading[CONFIG_SEQUENCE_SAMPLES][CHANNEL_COUNT]; +#else uint16_t channel_reading[CONFIG_SEQUENCE_SAMPLES][CHANNEL_COUNT]; +#endif /* Options for the sequence sampling. */ const struct adc_sequence_options options = {