Bonjour,
j’essaie de faire fonctionner l’ADC1 channel 3, qui est cablé à l’entrée A0 du shield Arduino via le module Zest_Adapter_Shield. J’ai utilisé le code fourni zephyr/samples/drivers/adc/adc_dt/ que j’ai adapté pour qu’il colle à la carte zest_core_stm32l4a6rg.dts.
Le code compile correctement, mais j’ai une erreur “Could not setup channel #3 (-134)” soulevée par l’appel de la fonction adc_channel_setup_dt().
J’ai bien regardé la doc du stm32l4a6rg et comment le device est déclaré dans le dt de la carte, mais je n’arrive pas à trouver pourquoi l’erreur -134.
Auriez-vous une idée ?
Olivier.
#include <zephyr/kernel.h>
#include <zephyr/device.h>
#include <zephyr/devicetree.h>
#include <zephyr/drivers/adc.h>
#include <zephyr/sys/printk.h>
// On récupère le DEVICE global de l'ADC1
#if !DT_NODE_EXISTS(DT_NODELABEL(adc1))
#error "Node adc1 not found in devicetree"
#endif
#define ADC_NODE DT_NODELABEL(adc1)
/*
* Configuration manuelle de la structure.
*/
static const struct adc_dt_spec adc_channel = {
.dev = DEVICE_DT_GET(ADC_NODE),
.channel_id = 3, /* Canal 3 (zest_Adapter_Shield Arduino A0) */
.resolution = 12,
.oversampling = 0,
.channel_cfg = {
.channel_id = 3,
.gain = ADC_GAIN_1,
.reference = ADC_REF_INTERNAL,
.acquisition_time = ADC_ACQ_TIME_DEFAULT,
.differential = 0,
},
};
int main(void)
{
int err;
uint32_t count = 0;
uint16_t buf;
struct adc_sequence sequence = {
.buffer = &buf,
.buffer_size = sizeof(buf),
};
/* Vérifie si le device ADC est prêt */
if (!adc_is_ready_dt(&adc_channel)) {
printk("ADC controller device %s not ready\n", adc_channel.dev->name);
return 0;
}
/*
* Setup du canal :
* Va maintenant lire .channel_cfg correctement rempli ci-dessus.
*/
err = adc_channel_setup_dt(&adc_channel);
if (err < 0) {
printk("Could not setup channel (%d)\n", err);
return 0;
}
printk("ADC lecture sur %s (canal %d)\n", adc_channel.dev->name, adc_channel.channel_id);
while (1) {
/* Initialise la séquence avec les paramètres (résolution...) */
err = adc_sequence_init_dt(&adc_channel, &sequence);
if (err < 0) {
printk("Could not initalize sequence (%d)\n", err);
continue;
}
/* Lecture */
err = adc_read(adc_channel.dev, &sequence);
if (err < 0) {
printk("Could not read (%d)\n", err);
continue;
}
/* Conversion en millivolts */
int32_t val_mv = buf;
err = adc_raw_to_millivolts_dt(&adc_channel, &val_mv);
if (err < 0) {
printk("Buffer conversion failed (%d)\n", err);
} else {
printk("- %u: ADC raw=%d, voltage=%d mV\n", count++, buf, val_mv);
}
k_sleep(K_MSEC(1000));
}
return 0;
}
