65 lines
1.5 KiB
C
65 lines
1.5 KiB
C
/**
|
|
* @file ad9833_device.c
|
|
* @brief AD9833 waveform-generator control helpers.
|
|
*/
|
|
|
|
#include "ad9833_device.h"
|
|
|
|
#include "board_io.h"
|
|
#include "main.h"
|
|
|
|
static void ad9833_write_word(uint16_t word)
|
|
{
|
|
uint32_t timeout = 0u;
|
|
|
|
board_io_configure_spi2_mode(LL_SPI_POLARITY_HIGH, LL_SPI_PHASE_1EDGE);
|
|
|
|
HAL_GPIO_WritePin(AD9102_CS_GPIO_Port, AD9102_CS_Pin, GPIO_PIN_SET);
|
|
HAL_GPIO_WritePin(DAC_LD1_CS_GPIO_Port, DAC_LD1_CS_Pin, GPIO_PIN_SET);
|
|
HAL_GPIO_WritePin(DAC_TEC1_CS_GPIO_Port, DAC_TEC1_CS_Pin, GPIO_PIN_SET);
|
|
HAL_GPIO_WritePin(AD9833_CS_GPIO_Port, AD9833_CS_Pin, GPIO_PIN_RESET);
|
|
|
|
while ((!LL_SPI_IsActiveFlag_TXE(SPI2)) && (timeout++ < 1000u))
|
|
{
|
|
}
|
|
LL_SPI_TransmitData16(SPI2, word);
|
|
|
|
timeout = 0u;
|
|
while ((!LL_SPI_IsActiveFlag_RXNE(SPI2)) && (timeout++ < 1000u))
|
|
{
|
|
}
|
|
(void)SPI2->DR;
|
|
|
|
HAL_GPIO_WritePin(AD9833_CS_GPIO_Port, AD9833_CS_Pin, GPIO_PIN_SET);
|
|
}
|
|
|
|
void ad9833_apply(uint8_t enabled, uint8_t triangle_mode, uint32_t frequency_word)
|
|
{
|
|
uint16_t control = 0x2000u;
|
|
uint16_t lsw;
|
|
uint16_t msw;
|
|
|
|
if (triangle_mode != 0u)
|
|
{
|
|
control |= 0x0002u;
|
|
}
|
|
|
|
control |= 0x0100u;
|
|
|
|
frequency_word &= 0x0FFFFFFFu;
|
|
lsw = (uint16_t)(0x4000u | (frequency_word & 0x3FFFu));
|
|
msw = (uint16_t)(0x4000u | ((frequency_word >> 14) & 0x3FFFu));
|
|
|
|
ad9833_write_word(control);
|
|
ad9833_write_word(lsw);
|
|
ad9833_write_word(msw);
|
|
ad9833_write_word(0xC000u);
|
|
|
|
if (enabled != 0u)
|
|
{
|
|
control &= (uint16_t)(~0x0100u);
|
|
}
|
|
|
|
ad9833_write_word(control);
|
|
}
|