File syn_adc.c¶
File List > drivers > syn_adc.c
Go to the documentation of this file
#if __has_include("syn_config.h")
#include "syn_config.h"
#endif
#if !defined(SYN_USE_ADC) || SYN_USE_ADC
#include "../util/syn_assert.h"
#include "syn_adc.h"
#include <string.h>
SYN_Status syn_adc_init(SYN_ADC *adc, const SYN_ADC_Config *cfg)
{
if (adc == NULL || cfg == NULL) {
return SYN_INVALID_PARAM;
}
memset(adc, 0, sizeof(*adc));
adc->cfg = *cfg;
if (adc->cfg.vref_mv == 0) {
adc->cfg.vref_mv = 3300; /* Default 3.3V reference */
}
SYN_Status status = syn_port_adc_init(cfg->adc_id, cfg->channel_mask);
if (status != SYN_OK) {
return status;
}
adc->initialized = true;
return SYN_OK;
}
SYN_Status syn_adc_deinit(SYN_ADC *adc)
{
if (adc == NULL) {
return SYN_INVALID_PARAM;
}
if (!adc->initialized) {
return SYN_OK;
}
SYN_Status status = syn_port_adc_deinit(adc->cfg.adc_id);
adc->initialized = false;
return status;
}
uint16_t syn_adc_read_raw(SYN_ADC *adc, uint8_t channel)
{
if (adc == NULL || !adc->initialized) {
return 0;
}
return syn_port_adc_read_channel(adc->cfg.adc_id, channel);
}
uint32_t syn_adc_read_mv(SYN_ADC *adc, uint8_t channel)
{
if (adc == NULL) {
return 0;
}
uint16_t raw = syn_adc_read_raw(adc, channel);
return ((uint32_t)raw * adc->cfg.vref_mv) / 4095U;
}
SYN_Status syn_adc_start_dma_scan(SYN_ADC *adc, uint16_t *buf, size_t num_channels)
{
if (adc == NULL || buf == NULL) {
return SYN_INVALID_PARAM;
}
if (!adc->initialized) {
return SYN_INVALID_PARAM;
}
return syn_port_adc_start_dma_scan(adc->cfg.adc_id, buf, num_channels);
}
#endif /* SYN_USE_ADC */