Files
fun_gen_amp_test/app/drivers/ad5303/ad5303.c
2023-09-28 19:48:58 +02:00

82 lines
1.7 KiB
C

#include "ad5303.h"
void ad5303_init(ad5303_handle_t *hdac, SPI_HandleTypeDef *hspi, cs_handle_t *hcs, ad5303_res_t res)
{
hdac->hspi = hspi;
hdac->hcs = hcs;
hdac->res = res;
ad5303_gain(hdac, AD_GAIN_X1);
ad5303_mode(hdac, AD_NORAMAL);
ad5303_set_value(hdac, 0, AD_DAC1);
ad5303_set_value(hdac, 0, AD_DAC2);
}
void ad5303_set_value(ad5303_handle_t *hdac, uint16_t value, ad5303_dac_t dac)
{
uint16_t data;
uint8_t data8;
switch (dac)
{
case AD_DAC1:
hdac->_regCtl &= ~(1 << 15);
break;
case AD_DAC2:
hdac->_regCtl |= (1 << 15);
break;
default:
break;
}
data = hdac->_regCtl | (value << hdac->res);
hdac->hcs->cs_on(hdac->hcs);
data8 = (uint8_t)((data >> 8) & 0x00FF);
HAL_SPI_Transmit(hdac->hspi, &data8, 1, HAL_MAX_DELAY);
data8 = (uint8_t)(data & 0x00FF);
HAL_SPI_Transmit(hdac->hspi, &data8, 1, HAL_MAX_DELAY);
hdac->hcs->cs_off(hdac->hcs);
}
void ad5303_mode(ad5303_handle_t *hdac, ad5303_mode_t mode)
{
switch (mode)
{
case AD_NORAMAL:
hdac->_regCtl &= ~(11 << 12);
break;
case AD_LOWZ:
hdac->_regCtl |= (1 << 12);
hdac->_regCtl &= ~(1 << 13);
break;
case AD_HIGHZ:
hdac->_regCtl &= ~(1 << 12);
hdac->_regCtl |= (1 << 13);
break;
case AD_OFF:
hdac->_regCtl |= (11 << 12);
break;
default:
break;
}
}
void ad5303_gain(ad5303_handle_t *hdac, ad5303_gain_t gain)
{
switch (gain)
{
case AD_GAIN_X1:
hdac->_regCtl &= ~(1 << 14);
break;
case AD_GAIN_X2:
hdac->_regCtl |= (1 << 14);
break;
default:
break;
}
}