diff --git a/Software/HelperTools/SynthEvalBoard/.cproject b/Software/HelperTools/SynthEvalBoard/.cproject
index 1811cf7..b41619e 100644
--- a/Software/HelperTools/SynthEvalBoard/.cproject
+++ b/Software/HelperTools/SynthEvalBoard/.cproject
@@ -57,7 +57,7 @@
-
+
@@ -77,6 +77,10 @@
+
+
+
+
@@ -399,7 +403,17 @@
-
+
diff --git a/Software/HelperTools/SynthEvalBoard/.mxproject b/Software/HelperTools/SynthEvalBoard/.mxproject
index e9c3922..192e433 100644
--- a/Software/HelperTools/SynthEvalBoard/.mxproject
+++ b/Software/HelperTools/SynthEvalBoard/.mxproject
@@ -1,8 +1,8 @@
[PreviousGenFiles]
HeaderPath=/home/jan/Projekte/VNA2/Software/HelperTools/SynthEvalBoard/Inc
-HeaderFiles=FreeRTOSConfig.h;stm32l4xx_it.h;stm32l4xx_hal_conf.h;main.h;
+HeaderFiles=FreeRTOSConfig.h;stm32l4xx_it.h;stm32l4xx_hal_conf.h;main.h;usb_device.h;usbd_conf.h;usbd_desc.h;usbd_cdc_if.h;
SourcePath=/home/jan/Projekte/VNA2/Software/HelperTools/SynthEvalBoard/Src
-SourceFiles=freertos.c;stm32l4xx_it.c;stm32l4xx_hal_msp.c;stm32l4xx_hal_timebase_tim.c;main.c;
+SourceFiles=freertos.c;stm32l4xx_it.c;stm32l4xx_hal_msp.c;stm32l4xx_hal_timebase_tim.c;main.c;usb_device.c;usbd_conf.c;usbd_desc.c;usbd_cdc_if.c;
[PreviousLibFiles]
LibFiles=Drivers/STM32L4xx_HAL_Driver/Inc/stm32l4xx_hal_i2c.h;Drivers/STM32L4xx_HAL_Driver/Inc/stm32l4xx_hal_i2c_ex.h;Drivers/STM32L4xx_HAL_Driver/Inc/stm32l4xx_hal_spi.h;Drivers/STM32L4xx_HAL_Driver/Inc/stm32l4xx_hal_spi_ex.h;Drivers/STM32L4xx_HAL_Driver/Inc/stm32l4xx_hal_tim.h;Drivers/STM32L4xx_HAL_Driver/Inc/stm32l4xx_hal.h;Drivers/STM32L4xx_HAL_Driver/Inc/stm32l4xx_hal_tim_ex.h;Drivers/STM32L4xx_HAL_Driver/Inc/stm32l4xx_hal_uart.h;Drivers/STM32L4xx_HAL_Driver/Inc/stm32l4xx_hal_uart_ex.h;Drivers/STM32L4xx_HAL_Driver/Inc/stm32l4xx_hal_pcd.h;Drivers/STM32L4xx_HAL_Driver/Inc/stm32l4xx_hal_pcd_ex.h;Drivers/STM32L4xx_HAL_Driver/Inc/stm32l4xx_ll_usb.h;Drivers/STM32L4xx_HAL_Driver/Inc/stm32l4xx_hal_def.h;Drivers/STM32L4xx_HAL_Driver/Inc/Legacy/stm32_hal_legacy.h;Drivers/STM32L4xx_HAL_Driver/Inc/stm32l4xx_hal_rcc.h;Drivers/STM32L4xx_HAL_Driver/Inc/stm32l4xx_hal_rcc_ex.h;Drivers/STM32L4xx_HAL_Driver/Inc/stm32l4xx_hal_flash.h;Drivers/STM32L4xx_HAL_Driver/Inc/stm32l4xx_hal_flash_ex.h;Drivers/STM32L4xx_HAL_Driver/Inc/stm32l4xx_hal_flash_ramfunc.h;Drivers/STM32L4xx_HAL_Driver/Inc/stm32l4xx_hal_gpio.h;Drivers/STM32L4xx_HAL_Driver/Inc/stm32l4xx_hal_gpio_ex.h;Drivers/STM32L4xx_HAL_Driver/Inc/stm32l4xx_hal_dma.h;Drivers/STM32L4xx_HAL_Driver/Inc/stm32l4xx_hal_dma_ex.h;Drivers/STM32L4xx_HAL_Driver/Inc/stm32l4xx_hal_pwr.h;Drivers/STM32L4xx_HAL_Driver/Inc/stm32l4xx_hal_pwr_ex.h;Drivers/STM32L4xx_HAL_Driver/Inc/stm32l4xx_hal_cortex.h;Drivers/STM32L4xx_HAL_Driver/Inc/stm32l4xx_hal_exti.h;Middlewares/Third_Party/FreeRTOS/Source/include/croutine.h;Middlewares/Third_Party/FreeRTOS/Source/include/deprecated_definitions.h;Middlewares/Third_Party/FreeRTOS/Source/include/event_groups.h;Middlewares/Third_Party/FreeRTOS/Source/include/FreeRTOS.h;Middlewares/Third_Party/FreeRTOS/Source/include/list.h;Middlewares/Third_Party/FreeRTOS/Source/include/message_buffer.h;Middlewares/Third_Party/FreeRTOS/Source/include/mpu_prototypes.h;Middlewares/Third_Party/FreeRTOS/Source/include/mpu_wrappers.h;Middlewares/Third_Party/FreeRTOS/Source/include/portable.h;Middlewares/Third_Party/FreeRTOS/Source/include/projdefs.h;Middlewares/Third_Party/FreeRTOS/Source/include/queue.h;Middlewares/Third_Party/FreeRTOS/Source/include/semphr.h;Middlewares/Third_Party/FreeRTOS/Source/include/stack_macros.h;Middlewares/Third_Party/FreeRTOS/Source/include/StackMacros.h;Middlewares/Third_Party/FreeRTOS/Source/include/stream_buffer.h;Middlewares/Third_Party/FreeRTOS/Source/include/task.h;Middlewares/Third_Party/FreeRTOS/Source/include/timers.h;Middlewares/Third_Party/FreeRTOS/Source/CMSIS_RTOS/cmsis_os.h;Middlewares/Third_Party/FreeRTOS/Source/portable/GCC/ARM_CM4F/portmacro.h;Drivers/STM32L4xx_HAL_Driver/Src/stm32l4xx_hal_i2c.c;Drivers/STM32L4xx_HAL_Driver/Src/stm32l4xx_hal_i2c_ex.c;Drivers/STM32L4xx_HAL_Driver/Src/stm32l4xx_hal_spi.c;Drivers/STM32L4xx_HAL_Driver/Src/stm32l4xx_hal_spi_ex.c;Drivers/STM32L4xx_HAL_Driver/Src/stm32l4xx_hal_tim.c;Drivers/STM32L4xx_HAL_Driver/Src/stm32l4xx_hal_tim_ex.c;Drivers/STM32L4xx_HAL_Driver/Src/stm32l4xx_hal_uart.c;Drivers/STM32L4xx_HAL_Driver/Src/stm32l4xx_hal_uart_ex.c;Drivers/STM32L4xx_HAL_Driver/Src/stm32l4xx_hal_pcd.c;Drivers/STM32L4xx_HAL_Driver/Src/stm32l4xx_hal_pcd_ex.c;Drivers/STM32L4xx_HAL_Driver/Src/stm32l4xx_ll_usb.c;Drivers/STM32L4xx_HAL_Driver/Src/stm32l4xx_hal.c;Drivers/STM32L4xx_HAL_Driver/Src/stm32l4xx_hal_rcc.c;Drivers/STM32L4xx_HAL_Driver/Src/stm32l4xx_hal_rcc_ex.c;Drivers/STM32L4xx_HAL_Driver/Src/stm32l4xx_hal_flash.c;Drivers/STM32L4xx_HAL_Driver/Src/stm32l4xx_hal_flash_ex.c;Drivers/STM32L4xx_HAL_Driver/Src/stm32l4xx_hal_flash_ramfunc.c;Drivers/STM32L4xx_HAL_Driver/Src/stm32l4xx_hal_gpio.c;Drivers/STM32L4xx_HAL_Driver/Src/stm32l4xx_hal_dma.c;Drivers/STM32L4xx_HAL_Driver/Src/stm32l4xx_hal_dma_ex.c;Drivers/STM32L4xx_HAL_Driver/Src/stm32l4xx_hal_pwr.c;Drivers/STM32L4xx_HAL_Driver/Src/stm32l4xx_hal_pwr_ex.c;Drivers/STM32L4xx_HAL_Driver/Src/stm32l4xx_hal_cortex.c;Drivers/STM32L4xx_HAL_Driver/Src/stm32l4xx_hal_exti.c;Middlewares/Third_Party/FreeRTOS/Source/croutine.c;Middlewares/Third_Party/FreeRTOS/Source/event_groups.c;Middlewares/Third_Party/FreeRTOS/Source/list.c;Middlewares/Third_Party/FreeRTOS/Source/queue.c;Middlewares/Third_Party/FreeRTOS/Source/stream_buffer.c;Middlewares/Third_Party/FreeRTOS/Source/tasks.c;Middlewares/Third_Party/FreeRTOS/Source/timers.c;Middlewares/Third_Party/FreeRTOS/Source/CMSIS_RTOS/cmsis_os.c;Middlewares/Third_Party/FreeRTOS/Source/portable/GCC/ARM_CM4F/port.c;Drivers/STM32L4xx_HAL_Driver/Inc/stm32l4xx_hal_i2c.h;Drivers/STM32L4xx_HAL_Driver/Inc/stm32l4xx_hal_i2c_ex.h;Drivers/STM32L4xx_HAL_Driver/Inc/stm32l4xx_hal_spi.h;Drivers/STM32L4xx_HAL_Driver/Inc/stm32l4xx_hal_spi_ex.h;Drivers/STM32L4xx_HAL_Driver/Inc/stm32l4xx_hal_tim.h;Drivers/STM32L4xx_HAL_Driver/Inc/stm32l4xx_hal.h;Drivers/STM32L4xx_HAL_Driver/Inc/stm32l4xx_hal_tim_ex.h;Drivers/STM32L4xx_HAL_Driver/Inc/stm32l4xx_hal_uart.h;Drivers/STM32L4xx_HAL_Driver/Inc/stm32l4xx_hal_uart_ex.h;Drivers/STM32L4xx_HAL_Driver/Inc/stm32l4xx_hal_pcd.h;Drivers/STM32L4xx_HAL_Driver/Inc/stm32l4xx_hal_pcd_ex.h;Drivers/STM32L4xx_HAL_Driver/Inc/stm32l4xx_ll_usb.h;Drivers/STM32L4xx_HAL_Driver/Inc/stm32l4xx_hal_def.h;Drivers/STM32L4xx_HAL_Driver/Inc/Legacy/stm32_hal_legacy.h;Drivers/STM32L4xx_HAL_Driver/Inc/stm32l4xx_hal_rcc.h;Drivers/STM32L4xx_HAL_Driver/Inc/stm32l4xx_hal_rcc_ex.h;Drivers/STM32L4xx_HAL_Driver/Inc/stm32l4xx_hal_flash.h;Drivers/STM32L4xx_HAL_Driver/Inc/stm32l4xx_hal_flash_ex.h;Drivers/STM32L4xx_HAL_Driver/Inc/stm32l4xx_hal_flash_ramfunc.h;Drivers/STM32L4xx_HAL_Driver/Inc/stm32l4xx_hal_gpio.h;Drivers/STM32L4xx_HAL_Driver/Inc/stm32l4xx_hal_gpio_ex.h;Drivers/STM32L4xx_HAL_Driver/Inc/stm32l4xx_hal_dma.h;Drivers/STM32L4xx_HAL_Driver/Inc/stm32l4xx_hal_dma_ex.h;Drivers/STM32L4xx_HAL_Driver/Inc/stm32l4xx_hal_pwr.h;Drivers/STM32L4xx_HAL_Driver/Inc/stm32l4xx_hal_pwr_ex.h;Drivers/STM32L4xx_HAL_Driver/Inc/stm32l4xx_hal_cortex.h;Drivers/STM32L4xx_HAL_Driver/Inc/stm32l4xx_hal_exti.h;Middlewares/Third_Party/FreeRTOS/Source/include/croutine.h;Middlewares/Third_Party/FreeRTOS/Source/include/deprecated_definitions.h;Middlewares/Third_Party/FreeRTOS/Source/include/event_groups.h;Middlewares/Third_Party/FreeRTOS/Source/include/FreeRTOS.h;Middlewares/Third_Party/FreeRTOS/Source/include/list.h;Middlewares/Third_Party/FreeRTOS/Source/include/message_buffer.h;Middlewares/Third_Party/FreeRTOS/Source/include/mpu_prototypes.h;Middlewares/Third_Party/FreeRTOS/Source/include/mpu_wrappers.h;Middlewares/Third_Party/FreeRTOS/Source/include/portable.h;Middlewares/Third_Party/FreeRTOS/Source/include/projdefs.h;Middlewares/Third_Party/FreeRTOS/Source/include/queue.h;Middlewares/Third_Party/FreeRTOS/Source/include/semphr.h;Middlewares/Third_Party/FreeRTOS/Source/include/stack_macros.h;Middlewares/Third_Party/FreeRTOS/Source/include/StackMacros.h;Middlewares/Third_Party/FreeRTOS/Source/include/stream_buffer.h;Middlewares/Third_Party/FreeRTOS/Source/include/task.h;Middlewares/Third_Party/FreeRTOS/Source/include/timers.h;Middlewares/Third_Party/FreeRTOS/Source/CMSIS_RTOS/cmsis_os.h;Middlewares/Third_Party/FreeRTOS/Source/portable/GCC/ARM_CM4F/portmacro.h;Drivers/CMSIS/Device/ST/STM32L4xx/Include/stm32l443xx.h;Drivers/CMSIS/Device/ST/STM32L4xx/Include/stm32l4xx.h;Drivers/CMSIS/Device/ST/STM32L4xx/Include/system_stm32l4xx.h;Drivers/CMSIS/Device/ST/STM32L4xx/Source/Templates/system_stm32l4xx.c;Drivers/CMSIS/Include/core_cm4.h;Drivers/CMSIS/Include/core_cm23.h;Drivers/CMSIS/Include/core_cm1.h;Drivers/CMSIS/Include/cmsis_armclang.h;Drivers/CMSIS/Include/core_sc000.h;Drivers/CMSIS/Include/mpu_armv7.h;Drivers/CMSIS/Include/cmsis_gcc.h;Drivers/CMSIS/Include/core_cm3.h;Drivers/CMSIS/Include/mpu_armv8.h;Drivers/CMSIS/Include/core_cm7.h;Drivers/CMSIS/Include/core_armv8mml.h;Drivers/CMSIS/Include/core_cm33.h;Drivers/CMSIS/Include/cmsis_version.h;Drivers/CMSIS/Include/core_cm0plus.h;Drivers/CMSIS/Include/cmsis_compiler.h;Drivers/CMSIS/Include/tz_context.h;Drivers/CMSIS/Include/cmsis_armcc.h;Drivers/CMSIS/Include/core_armv8mbl.h;Drivers/CMSIS/Include/core_cm0.h;Drivers/CMSIS/Include/core_sc300.h;Drivers/CMSIS/Include/cmsis_iccarm.h;
diff --git a/Software/HelperTools/SynthEvalBoard/Application/Drivers/AD9913.cpp b/Software/HelperTools/SynthEvalBoard/Application/Drivers/AD9913.cpp
new file mode 100644
index 0000000..463a620
--- /dev/null
+++ b/Software/HelperTools/SynthEvalBoard/Application/Drivers/AD9913.cpp
@@ -0,0 +1,151 @@
+#include "AD9913.hpp"
+#include "FreeRTOS.h"
+#include "task.h"
+
+#define LOG_LEVEL LOG_LEVEL_DEBUG
+#define LOG_MODULE "AD9913"
+#include "Log.h"
+
+bool AD9913::Init() {
+ setCS(true);
+ setPWR_DWN(false);
+ setIO_UPDATE(false);
+
+ setReset(true);
+ vTaskDelay(1);
+ setReset(false);
+//
+// while(1) {
+// uint64_t dac = readRegister(Reg::LINSWEEPPARAM);
+// LOG_DEBUG("DAC Control register: 0x%08x", dac);
+// vTaskDelay(100);
+// }
+ return true;
+}
+
+void AD9913::writeRegister(uint32_t address, uint64_t data) {
+ writeRegister((Reg) address, data);
+ updateRegisters();
+}
+
+uint64_t AD9913::readRegister(uint32_t address) {
+ return readRegister((Reg) address);
+}
+
+void AD9913::writeRegister(Reg reg, uint64_t data) {
+ uint8_t regsize = getRegisterSize(reg);
+ if(!regsize) {
+ // invalid register
+ return;
+ }
+ uint8_t send[1 + regsize];
+ send[0] = (uint8_t) reg;
+ for(uint8_t i=regsize;i>0;i--) {
+ send[i] = data & 0xFF;
+ data >>= 8;
+ }
+ setCS(false);
+ HAL_SPI_Transmit(spi, send, sizeof(send), 100);
+ setCS(true);
+}
+
+uint64_t AD9913::readRegister(Reg reg) {
+ uint8_t regsize = getRegisterSize(reg);
+ if(!regsize) {
+ // invalid register
+ return 0;
+ }
+ uint8_t send[1 + regsize];
+ uint8_t recv[1 + regsize];
+ send[0] = 0x80 | (uint8_t) reg;
+ for(uint8_t i=regsize;i>0;i--) {
+ send[i] = 0xFF; // use open drain with pull up
+ }
+ setCS(false);
+ HAL_SPI_TransmitReceive(spi, send, recv, sizeof(send), 100);
+ setCS(true);
+ uint64_t ret = 0;
+ for(uint8_t i=1;i<=regsize;i++) {
+ ret <<= 8;
+ ret |= recv[i];
+ }
+ return ret;
+}
+
+void AD9913::setCS(bool p) {
+ if(!CS) {
+ return;
+ }
+ if(p) {
+ CS->BSRR = CSpin;
+ } else {
+ CS->BSRR = CSpin << 16;
+ }
+}
+
+void AD9913::setPWR_DWN(bool p) {
+ if(!PWR_DWN) {
+ return;
+ }
+ if(p) {
+ PWR_DWN->BSRR = PWR_DWNpin;
+ } else {
+ PWR_DWN->BSRR = PWR_DWNpin << 16;
+ }
+}
+
+void AD9913::setIO_UPDATE(bool p) {
+ if(!IO_UPDATE) {
+ return;
+ }
+ if(p) {
+ IO_UPDATE->BSRR = IO_UPDATEpin;
+ } else {
+ IO_UPDATE->BSRR = IO_UPDATEpin << 16;
+ }
+}
+
+void AD9913::setReset(bool p) {
+ if(!MRESET) {
+ return;
+ }
+ if(p) {
+ MRESET->BSRR = MRESETpin;
+ } else {
+ MRESET->BSRR = MRESETpin << 16;
+ }
+}
+
+void AD9913::updateRegisters() {
+ setIO_UPDATE(true);
+ setIO_UPDATE(false);
+}
+
+uint8_t AD9913::getRegisterSize(Reg reg) {
+ switch(reg) {
+ case Reg::CFR2:
+ case Reg::POW:
+ return 2; // 16 bit registers
+ case Reg::CFR1:
+ case Reg::DACControl:
+ case Reg::FTW:
+ case Reg::LINSWEEPRAMP:
+ return 4; // 32 bit registers
+ case Reg::LINSWEEPPARAM:
+ case Reg::LINSWEEPDELTA:
+ return 8; // 64 bit registers
+ case Reg::PROFILE0:
+ case Reg::PROFILE1:
+ case Reg::PROFILE2:
+ case Reg::PROFILE3:
+ case Reg::PROFILE4:
+ case Reg::PROFILE5:
+ case Reg::PROFILE6:
+ case Reg::PROFILE7:
+ return 6; // 48 bit registers
+ default:
+ return 0; // invalid register
+ }
+}
+
+
diff --git a/Software/HelperTools/SynthEvalBoard/Application/Drivers/AD9913.hpp b/Software/HelperTools/SynthEvalBoard/Application/Drivers/AD9913.hpp
new file mode 100644
index 0000000..6a47eed
--- /dev/null
+++ b/Software/HelperTools/SynthEvalBoard/Application/Drivers/AD9913.hpp
@@ -0,0 +1,61 @@
+#pragma once
+
+#include "stm.hpp"
+#include "RegisterDevice.hpp"
+
+class AD9913 : public RegisterDevice {
+ public:
+ constexpr AD9913(const char *name, SPI_HandleTypeDef *spi, GPIO_TypeDef *CS,
+ uint16_t CSpin, GPIO_TypeDef *IO_UPDATE,
+ uint16_t IO_UPDATEpin, GPIO_TypeDef *MRESET,
+ uint16_t MRESETpin, GPIO_TypeDef *PWR_DWN = nullptr,
+ uint16_t PWR_DWNpin = 0):
+ RegisterDevice("AD9913", name),
+ spi(spi),
+ CS(CS),
+ IO_UPDATE(IO_UPDATE),
+ PWR_DWN(PWR_DWN),
+ MRESET(MRESET),
+ CSpin(CSpin),
+ IO_UPDATEpin(IO_UPDATEpin),
+ PWR_DWNpin(PWR_DWNpin),
+ MRESETpin(MRESETpin)
+ {};
+
+ bool Init();
+
+ void writeRegister(uint32_t address, uint64_t data) override;
+ uint64_t readRegister(uint32_t address) override;
+
+ enum class Reg : uint8_t {
+ CFR1 = 0x00,
+ CFR2 = 0x01,
+ DACControl = 0x02,
+ FTW = 0x03,
+ POW = 0x04,
+ LINSWEEPPARAM = 0x06,
+ LINSWEEPDELTA = 0x07,
+ LINSWEEPRAMP = 0x08,
+ PROFILE0 = 0x09,
+ PROFILE1 = 0x0A,
+ PROFILE2 = 0x0B,
+ PROFILE3 = 0x0C,
+ PROFILE4 = 0x0D,
+ PROFILE5 = 0x0E,
+ PROFILE6 = 0x0F,
+ PROFILE7 = 0x10,
+ };
+ private:
+ void setCS(bool p);
+ void setPWR_DWN(bool p);
+ void setIO_UPDATE(bool p);
+ void setReset(bool p);
+ void updateRegisters();
+ void writeRegister(Reg reg, uint64_t data);
+ uint64_t readRegister(Reg reg);
+ static uint8_t getRegisterSize(Reg reg);
+ SPI_HandleTypeDef *spi;
+ GPIO_TypeDef *CS, *IO_UPDATE, *PWR_DWN, *MRESET;
+ uint16_t CSpin, IO_UPDATEpin, PWR_DWNpin, MRESETpin;
+};
+
diff --git a/Software/HelperTools/SynthEvalBoard/Application/Drivers/Log.h b/Software/HelperTools/SynthEvalBoard/Application/Drivers/Log.h
index efbf4e3..31b9def 100644
--- a/Software/HelperTools/SynthEvalBoard/Application/Drivers/Log.h
+++ b/Software/HelperTools/SynthEvalBoard/Application/Drivers/Log.h
@@ -6,7 +6,7 @@ extern "C" {
//#define LOG_BLOCKING
-#define LOG_USART 3
+#define LOG_USART 1
#define LOG_SENDBUF_LENGTH 1024
//#define LOG_USE_MUTEX
diff --git a/Software/HelperTools/SynthEvalBoard/Application/Drivers/Si5332.cpp b/Software/HelperTools/SynthEvalBoard/Application/Drivers/Si5332.cpp
new file mode 100644
index 0000000..2292dde
--- /dev/null
+++ b/Software/HelperTools/SynthEvalBoard/Application/Drivers/Si5332.cpp
@@ -0,0 +1,27 @@
+#include "Si5332.hpp"
+
+#define LOG_LEVEL LOG_LEVEL_INFO
+#define LOG_MODULE "Si5332"
+#include "Log.h"
+
+bool Si5332::Init() {
+ uint8_t dummy;
+ if(HAL_I2C_Mem_Read(i2c, this->address, 0, I2C_MEMADD_SIZE_8BIT, &dummy, 1, 100) != HAL_OK) {
+ LOG_ERR("Failed to initialize");
+ return false;
+ }
+
+ LOG_INFO("Initialized");
+ return true;
+}
+
+void Si5332::writeRegister(uint32_t address, uint64_t data) {
+ uint8_t write = data;
+ HAL_I2C_Mem_Write(i2c, this->address, address, I2C_MEMADD_SIZE_8BIT, &write, 1, 100);
+}
+
+uint64_t Si5332::readRegister(uint32_t address) {
+ uint8_t read;
+ HAL_I2C_Mem_Read(i2c, this->address, address, I2C_MEMADD_SIZE_8BIT, &read, 1, 100);
+ return read;
+}
diff --git a/Software/HelperTools/SynthEvalBoard/Application/Drivers/Si5332.hpp b/Software/HelperTools/SynthEvalBoard/Application/Drivers/Si5332.hpp
new file mode 100644
index 0000000..5b2c753
--- /dev/null
+++ b/Software/HelperTools/SynthEvalBoard/Application/Drivers/Si5332.hpp
@@ -0,0 +1,21 @@
+#pragma once
+
+#include "stm.hpp"
+#include "RegisterDevice.hpp"
+
+class Si5332 : public RegisterDevice {
+ public:
+ constexpr Si5332(const char *name, I2C_HandleTypeDef *i2c, uint8_t address):
+ RegisterDevice("Si5332", name),
+ i2c(i2c),
+ address(address){};
+
+ bool Init();
+
+ void writeRegister(uint32_t address, uint64_t data) override;
+ uint64_t readRegister(uint32_t address) override;
+ private:
+ I2C_HandleTypeDef *i2c;
+ uint8_t address;
+};
+
diff --git a/Software/HelperTools/SynthEvalBoard/Application/Drivers/USB/usb.c b/Software/HelperTools/SynthEvalBoard/Application/Drivers/USB/usb.c
index 56034eb..055531d 100644
--- a/Software/HelperTools/SynthEvalBoard/Application/Drivers/USB/usb.c
+++ b/Software/HelperTools/SynthEvalBoard/Application/Drivers/USB/usb.c
@@ -216,7 +216,7 @@ void usb_init(usbd_recv_callback_t receive_callback) {
USBD_Init(&hUsbDeviceFS, &FS_Desc, 0);
USBD_RegisterClass(&hUsbDeviceFS, &USBD_ClassDriver);
USBD_Start(&hUsbDeviceFS);
- HAL_NVIC_SetPriority(USB_FS_IRQn, 0, 0);
+ HAL_NVIC_SetPriority(USB_FS_IRQn, 5, 0);
HAL_NVIC_EnableIRQ(USB_FS_IRQn);
}
bool usb_transmit(const uint8_t *data, uint16_t length) {
diff --git a/Software/HelperTools/SynthEvalBoard/Application/Hardware.cpp b/Software/HelperTools/SynthEvalBoard/Application/Hardware.cpp
index 22d0e19..d50f015 100644
--- a/Software/HelperTools/SynthEvalBoard/Application/Hardware.cpp
+++ b/Software/HelperTools/SynthEvalBoard/Application/Hardware.cpp
@@ -2,7 +2,27 @@
#include "Protocol.hpp"
+#include "AD9913.hpp"
+#include "Si5332.hpp"
+#include "main.h"
+
+extern I2C_HandleTypeDef hi2c1;
+extern SPI_HandleTypeDef hspi1, hspi2;
+
+static Si5332 si5332 = Si5332("Si5332", &hi2c1, 0xD4);
+
+static AD9913 ad9913 = AD9913("AD9913", &hspi2, AD9913_CS_GPIO_Port,
+ AD9913_CS_Pin, AD9913_IO_UPDATE_GPIO_Port, AD9913_IO_UPDATE_Pin,
+ AD9913_MRESET_GPIO_Port, AD9913_MRESET_Pin, AD9913_PWR_DWN_GPIO_Port,
+ AD9913_PWR_DWN_Pin);
+
bool HW::Init() {
+ if(!ad9913.Init()) {
+ return false;
+ }
+ if(!si5332.Init()) {
+ return false;
+ }
return true;
}
diff --git a/Software/HelperTools/SynthEvalBoard/Application/Led.cpp b/Software/HelperTools/SynthEvalBoard/Application/Led.cpp
index 486d6e4..e122fe1 100644
--- a/Software/HelperTools/SynthEvalBoard/Application/Led.cpp
+++ b/Software/HelperTools/SynthEvalBoard/Application/Led.cpp
@@ -5,7 +5,7 @@
#include "task.h"
-#define LED_TASK_STACK 128
+#define LED_TASK_STACK 4096
extern TIM_HandleTypeDef htim2;
diff --git a/Software/HelperTools/SynthEvalBoard/Inc/main.h b/Software/HelperTools/SynthEvalBoard/Inc/main.h
index 5f3c2a8..b90e928 100644
--- a/Software/HelperTools/SynthEvalBoard/Inc/main.h
+++ b/Software/HelperTools/SynthEvalBoard/Inc/main.h
@@ -66,6 +66,8 @@ void Error_Handler(void);
#define STW_HW_PD_GPIO_Port GPIOB
#define STW_PD_RF1_Pin GPIO_PIN_1
#define STW_PD_RF1_GPIO_Port GPIOB
+#define AD9913_MRESET_Pin GPIO_PIN_2
+#define AD9913_MRESET_GPIO_Port GPIOB
#define AD9913_PWR_DWN_Pin GPIO_PIN_10
#define AD9913_PWR_DWN_GPIO_Port GPIOB
#define AD9913_IO_UPDATE_Pin GPIO_PIN_11
diff --git a/Software/HelperTools/SynthEvalBoard/Src/main.c b/Software/HelperTools/SynthEvalBoard/Src/main.c
index 31a76be..c381384 100644
--- a/Software/HelperTools/SynthEvalBoard/Src/main.c
+++ b/Software/HelperTools/SynthEvalBoard/Src/main.c
@@ -55,7 +55,7 @@ UART_HandleTypeDef huart1;
PCD_HandleTypeDef hpcd_USB_FS;
osThreadId defaultTaskHandle;
-uint32_t defaultTaskBuffer[ 128 ];
+uint32_t defaultTaskBuffer[ 4096 ];
osStaticThreadDef_t defaultTaskControlBlock;
/* USER CODE BEGIN PV */
@@ -68,8 +68,8 @@ static void MX_I2C1_Init(void);
static void MX_SPI1_Init(void);
static void MX_SPI2_Init(void);
static void MX_USART1_UART_Init(void);
-static void MX_USB_PCD_Init(void);
static void MX_TIM2_Init(void);
+static void MX_USB_PCD_Init(void);
void StartDefaultTask(void const * argument);
/* USER CODE BEGIN PFP */
@@ -114,8 +114,8 @@ int main(void)
MX_SPI1_Init();
MX_SPI2_Init();
MX_USART1_UART_Init();
- MX_USB_PCD_Init();
MX_TIM2_Init();
+ MX_USB_PCD_Init();
/* USER CODE BEGIN 2 */
/* USER CODE END 2 */
@@ -138,7 +138,7 @@ int main(void)
/* Create the thread(s) */
/* definition and creation of defaultTask */
- osThreadStaticDef(defaultTask, StartDefaultTask, osPriorityNormal, 0, 128, defaultTaskBuffer, &defaultTaskControlBlock);
+ osThreadStaticDef(defaultTask, StartDefaultTask, osPriorityNormal, 0, 4096, defaultTaskBuffer, &defaultTaskControlBlock);
defaultTaskHandle = osThreadCreate(osThread(defaultTask), NULL);
/* USER CODE BEGIN RTOS_THREADS */
@@ -389,10 +389,6 @@ static void MX_TIM2_Init(void)
{
Error_Handler();
}
- if (HAL_TIM_OC_Init(&htim2) != HAL_OK)
- {
- Error_Handler();
- }
sMasterConfig.MasterOutputTrigger = TIM_TRGO_RESET;
sMasterConfig.MasterSlaveMode = TIM_MASTERSLAVEMODE_DISABLE;
if (HAL_TIMEx_MasterConfigSynchronization(&htim2, &sMasterConfig) != HAL_OK)
@@ -415,8 +411,7 @@ static void MX_TIM2_Init(void)
{
Error_Handler();
}
- sConfigOC.OCMode = TIM_OCMODE_TIMING;
- if (HAL_TIM_OC_ConfigChannel(&htim2, &sConfigOC, TIM_CHANNEL_4) != HAL_OK)
+ if (HAL_TIM_PWM_ConfigChannel(&htim2, &sConfigOC, TIM_CHANNEL_4) != HAL_OK)
{
Error_Handler();
}
@@ -471,7 +466,8 @@ static void MX_USB_PCD_Init(void)
{
/* USER CODE BEGIN USB_Init 0 */
-
+ /* Enable USB power on Pwrctrl CR2 register. */
+ HAL_PWREx_EnableVddUSB();
/* USER CODE END USB_Init 0 */
/* USER CODE BEGIN USB_Init 1 */
@@ -512,8 +508,9 @@ static void MX_GPIO_Init(void)
HAL_GPIO_WritePin(GPIOA, STW_LE_Pin|SI5332_IN2_Pin|SI5332_IN1_Pin, GPIO_PIN_RESET);
/*Configure GPIO pin Output Level */
- HAL_GPIO_WritePin(GPIOB, STW_HW_PD_Pin|STW_PD_RF1_Pin|AD9913_PWR_DWN_Pin|AD9913_IO_UPDATE_Pin
- |AD9913_CS_Pin|SI5332_IN3_Pin|SI5332_IN4_Pin|SI5332_IN5_Pin, GPIO_PIN_RESET);
+ HAL_GPIO_WritePin(GPIOB, STW_HW_PD_Pin|STW_PD_RF1_Pin|AD9913_MRESET_Pin|AD9913_PWR_DWN_Pin
+ |AD9913_IO_UPDATE_Pin|AD9913_CS_Pin|SI5332_IN3_Pin|SI5332_IN4_Pin
+ |SI5332_IN5_Pin, GPIO_PIN_RESET);
/*Configure GPIO pins : STW_LE_Pin SI5332_IN2_Pin SI5332_IN1_Pin */
GPIO_InitStruct.Pin = STW_LE_Pin|SI5332_IN2_Pin|SI5332_IN1_Pin;
@@ -522,10 +519,12 @@ static void MX_GPIO_Init(void)
GPIO_InitStruct.Speed = GPIO_SPEED_FREQ_LOW;
HAL_GPIO_Init(GPIOA, &GPIO_InitStruct);
- /*Configure GPIO pins : STW_HW_PD_Pin STW_PD_RF1_Pin AD9913_PWR_DWN_Pin AD9913_IO_UPDATE_Pin
- AD9913_CS_Pin SI5332_IN3_Pin SI5332_IN4_Pin SI5332_IN5_Pin */
- GPIO_InitStruct.Pin = STW_HW_PD_Pin|STW_PD_RF1_Pin|AD9913_PWR_DWN_Pin|AD9913_IO_UPDATE_Pin
- |AD9913_CS_Pin|SI5332_IN3_Pin|SI5332_IN4_Pin|SI5332_IN5_Pin;
+ /*Configure GPIO pins : STW_HW_PD_Pin STW_PD_RF1_Pin AD9913_MRESET_Pin AD9913_PWR_DWN_Pin
+ AD9913_IO_UPDATE_Pin AD9913_CS_Pin SI5332_IN3_Pin SI5332_IN4_Pin
+ SI5332_IN5_Pin */
+ GPIO_InitStruct.Pin = STW_HW_PD_Pin|STW_PD_RF1_Pin|AD9913_MRESET_Pin|AD9913_PWR_DWN_Pin
+ |AD9913_IO_UPDATE_Pin|AD9913_CS_Pin|SI5332_IN3_Pin|SI5332_IN4_Pin
+ |SI5332_IN5_Pin;
GPIO_InitStruct.Mode = GPIO_MODE_OUTPUT_PP;
GPIO_InitStruct.Pull = GPIO_NOPULL;
GPIO_InitStruct.Speed = GPIO_SPEED_FREQ_LOW;
diff --git a/Software/HelperTools/SynthEvalBoard/Src/stm32l4xx_hal_msp.c b/Software/HelperTools/SynthEvalBoard/Src/stm32l4xx_hal_msp.c
index d4a1834..02ca760 100644
--- a/Software/HelperTools/SynthEvalBoard/Src/stm32l4xx_hal_msp.c
+++ b/Software/HelperTools/SynthEvalBoard/Src/stm32l4xx_hal_msp.c
@@ -202,7 +202,14 @@ void HAL_SPI_MspInit(SPI_HandleTypeDef* hspi)
HAL_GPIO_Init(GPIOB, &GPIO_InitStruct);
/* USER CODE BEGIN SPI2_MspInit 1 */
-
+ // AD9913 at SPI2 has a three wire interface (MISO and MOSI on same pin).
+ // Needs open-drain pins for those (external pull-up on board)
+ GPIO_InitStruct.Pin = GPIO_PIN_15;
+ GPIO_InitStruct.Mode = GPIO_MODE_AF_OD;
+ GPIO_InitStruct.Pull = GPIO_NOPULL;
+ GPIO_InitStruct.Speed = GPIO_SPEED_FREQ_VERY_HIGH;
+ GPIO_InitStruct.Alternate = GPIO_AF5_SPI2;
+ HAL_GPIO_Init(GPIOB, &GPIO_InitStruct);
/* USER CODE END SPI2_MspInit 1 */
}
diff --git a/Software/HelperTools/SynthEvalBoard/SynthEvalBoard.ioc b/Software/HelperTools/SynthEvalBoard/SynthEvalBoard.ioc
index 17275ec..f675077 100644
--- a/Software/HelperTools/SynthEvalBoard/SynthEvalBoard.ioc
+++ b/Software/HelperTools/SynthEvalBoard/SynthEvalBoard.ioc
@@ -2,7 +2,7 @@
FREERTOS.FootprintOK=true
FREERTOS.IPParameters=Tasks01,MEMORY_ALLOCATION,FootprintOK
FREERTOS.MEMORY_ALLOCATION=1
-FREERTOS.Tasks01=defaultTask,0,128,StartDefaultTask,Default,NULL,Static,defaultTaskBuffer,defaultTaskControlBlock
+FREERTOS.Tasks01=defaultTask,0,4096,StartDefaultTask,Default,NULL,Static,defaultTaskBuffer,defaultTaskControlBlock
File.Version=6
KeepUserPlacement=false
Mcu.Family=STM32L4
@@ -21,37 +21,38 @@ Mcu.Name=STM32L443CCUx
Mcu.Package=UFQFPN48
Mcu.Pin0=PA0
Mcu.Pin1=PA1
-Mcu.Pin10=PB10
-Mcu.Pin11=PB11
-Mcu.Pin12=PB12
-Mcu.Pin13=PB13
-Mcu.Pin14=PB14
-Mcu.Pin15=PB15
-Mcu.Pin16=PA8
-Mcu.Pin17=PA9
-Mcu.Pin18=PA10
-Mcu.Pin19=PA11
+Mcu.Pin10=PB2
+Mcu.Pin11=PB10
+Mcu.Pin12=PB11
+Mcu.Pin13=PB12
+Mcu.Pin14=PB13
+Mcu.Pin15=PB14
+Mcu.Pin16=PB15
+Mcu.Pin17=PA8
+Mcu.Pin18=PA9
+Mcu.Pin19=PA10
Mcu.Pin2=PA2
-Mcu.Pin20=PA12
-Mcu.Pin21=PA13 (JTMS-SWDIO)
-Mcu.Pin22=PA14 (JTCK-SWCLK)
-Mcu.Pin23=PA15 (JTDI)
-Mcu.Pin24=PB3 (JTDO-TRACESWO)
-Mcu.Pin25=PB4 (NJTRST)
-Mcu.Pin26=PB5
-Mcu.Pin27=PB6
-Mcu.Pin28=PB7
-Mcu.Pin29=VP_FREERTOS_VS_CMSIS_V1
+Mcu.Pin20=PA11
+Mcu.Pin21=PA12
+Mcu.Pin22=PA13 (JTMS-SWDIO)
+Mcu.Pin23=PA14 (JTCK-SWCLK)
+Mcu.Pin24=PA15 (JTDI)
+Mcu.Pin25=PB3 (JTDO-TRACESWO)
+Mcu.Pin26=PB4 (NJTRST)
+Mcu.Pin27=PB5
+Mcu.Pin28=PB6
+Mcu.Pin29=PB7
Mcu.Pin3=PA3
-Mcu.Pin30=VP_SYS_VS_tim7
-Mcu.Pin31=VP_TIM2_VS_ClockSourceINT
+Mcu.Pin30=VP_FREERTOS_VS_CMSIS_V1
+Mcu.Pin31=VP_SYS_VS_tim7
+Mcu.Pin32=VP_TIM2_VS_ClockSourceINT
Mcu.Pin4=PA4
Mcu.Pin5=PA5
Mcu.Pin6=PA6
Mcu.Pin7=PA7
Mcu.Pin8=PB0
Mcu.Pin9=PB1
-Mcu.PinsNb=32
+Mcu.PinsNb=33
Mcu.ThirdPartyNb=0
Mcu.UserConstants=
Mcu.UserName=STM32L443CCUx
@@ -146,6 +147,10 @@ PB14.Signal=SPI2_MISO
PB15.Locked=true
PB15.Mode=Full_Duplex_Master
PB15.Signal=SPI2_MOSI
+PB2.GPIOParameters=GPIO_Label
+PB2.GPIO_Label=AD9913_MRESET
+PB2.Locked=true
+PB2.Signal=GPIO_Output
PB3\ (JTDO-TRACESWO).GPIOParameters=GPIO_Label
PB3\ (JTDO-TRACESWO).GPIO_Label=SI5332_IN3
PB3\ (JTDO-TRACESWO).Locked=true
@@ -199,7 +204,7 @@ ProjectManager.StackSize=0x400
ProjectManager.TargetToolchain=SW4STM32
ProjectManager.ToolChainLocation=
ProjectManager.UnderRoot=true
-ProjectManager.functionlistsort=1-MX_GPIO_Init-GPIO-false-HAL-true,2-SystemClock_Config-RCC-false-HAL-false,3-MX_I2C1_Init-I2C1-false-HAL-true,4-MX_SPI1_Init-SPI1-false-HAL-true,5-MX_SPI2_Init-SPI2-false-HAL-true,6-MX_USART1_UART_Init-USART1-false-HAL-true,7-MX_USB_PCD_Init-USB-false-HAL-true
+ProjectManager.functionlistsort=1-MX_GPIO_Init-GPIO-false-HAL-true,2-SystemClock_Config-RCC-false-HAL-false,3-MX_I2C1_Init-I2C1-false-HAL-true,4-MX_SPI1_Init-SPI1-false-HAL-true,5-MX_SPI2_Init-SPI2-false-HAL-true,6-MX_USART1_UART_Init-USART1-false-HAL-true,7-MX_TIM2_Init-TIM2-false-HAL-true,8-MX_USB_PCD_Init-USB-false-HAL-true
RCC.ADCFreq_Value=48000000
RCC.AHBFreq_Value=80000000
RCC.APB1Freq_Value=80000000
@@ -252,7 +257,7 @@ SH.S_TIM2_CH2.0=TIM2_CH2,PWM Generation2 CH2
SH.S_TIM2_CH2.ConfNb=1
SH.S_TIM2_CH3.0=TIM2_CH3,PWM Generation3 CH3
SH.S_TIM2_CH3.ConfNb=1
-SH.S_TIM2_CH4.0=TIM2_CH4,Output Compare4 CH4
+SH.S_TIM2_CH4.0=TIM2_CH4,PWM Generation4 CH4
SH.S_TIM2_CH4.ConfNb=1
SPI1.BaudRatePrescaler=SPI_BAUDRATEPRESCALER_64
SPI1.CalculateBaudRate=1.25 MBits/s
@@ -268,11 +273,11 @@ SPI2.Direction=SPI_DIRECTION_2LINES
SPI2.IPParameters=VirtualType,Mode,Direction,CalculateBaudRate,DataSize,BaudRatePrescaler
SPI2.Mode=SPI_MODE_MASTER
SPI2.VirtualType=VM_MASTER
-TIM2.Channel-Output\ Compare4\ CH4=TIM_CHANNEL_4
TIM2.Channel-PWM\ Generation1\ CH1=TIM_CHANNEL_1
TIM2.Channel-PWM\ Generation2\ CH2=TIM_CHANNEL_2
TIM2.Channel-PWM\ Generation3\ CH3=TIM_CHANNEL_3
-TIM2.IPParameters=Channel-PWM Generation1 CH1,Channel-PWM Generation2 CH2,Channel-PWM Generation3 CH3,Channel-Output Compare4 CH4,Prescaler,Period
+TIM2.Channel-PWM\ Generation4\ CH4=TIM_CHANNEL_4
+TIM2.IPParameters=Channel-PWM Generation1 CH1,Channel-PWM Generation2 CH2,Channel-PWM Generation3 CH3,Prescaler,Period,Channel-PWM Generation4 CH4
TIM2.Period=99
TIM2.Prescaler=79
USART1.IPParameters=VirtualMode-Asynchronous
diff --git a/Software/PC_Application/Device/RegisterAccess/rawregisterdialog.cpp b/Software/PC_Application/Device/RegisterAccess/rawregisterdialog.cpp
index ddb50fa..b6e4e6b 100644
--- a/Software/PC_Application/Device/RegisterAccess/rawregisterdialog.cpp
+++ b/Software/PC_Application/Device/RegisterAccess/rawregisterdialog.cpp
@@ -19,6 +19,10 @@ RawRegisterDialog::RawRegisterDialog(Device *dev, QWidget *parent) :
{
ui->setupUi(this);
+// setWindowFlags(Qt::Window);
+ setWindowState(windowState() & Qt::WindowMaximized);
+// showFullScreen();
+
devices.resize(dev->Info().num_directRegisterDevices);
connect(dev, &Device::ReceivedDirectRegisterInfo, this, &RawRegisterDialog::receivedDirectRegisterInfo);
diff --git a/Software/PC_Application/Device/RegisterAccess/rawregisterdialog.ui b/Software/PC_Application/Device/RegisterAccess/rawregisterdialog.ui
index 0e5cd43..dd3b25e 100644
--- a/Software/PC_Application/Device/RegisterAccess/rawregisterdialog.ui
+++ b/Software/PC_Application/Device/RegisterAccess/rawregisterdialog.ui
@@ -13,6 +13,9 @@
Device Registers
+
+ false
+
-
diff --git a/Software/PC_Application/Device/RegisterAccess/register.cpp b/Software/PC_Application/Device/RegisterAccess/register.cpp
index c62b8f4..e3a9350 100644
--- a/Software/PC_Application/Device/RegisterAccess/register.cpp
+++ b/Software/PC_Application/Device/RegisterAccess/register.cpp
@@ -16,7 +16,7 @@ Register::Register(QString name, int address, int width)
void Register::assignUI(QCheckBox *cb, int bitpos, bool inverted)
{
connect(this, &Register::valueChanged, [=](unsigned int newval) {
- bool bit = newval & (1UL << bitpos);
+ bool bit = newval & (1ULL << bitpos);
if(inverted) {
bit = !bit;
}
@@ -34,7 +34,7 @@ void Register::assignUI(QComboBox *cb, int pos, int width, int ui_bitoffset)
{
connect(this, &Register::valueChanged, [=]() {
auto value = getValue(pos, width);
- auto mask = (1UL << width) - 1;
+ auto mask = createMask(width);
mask <<= ui_bitoffset;
value <<= ui_bitoffset;
auto old_gui = cb->currentIndex();
@@ -58,7 +58,7 @@ void Register::assignUI(QSpinBox *sb, int pos, int width, int ui_bitoffset)
{
connect(this, &Register::valueChanged, [=]() {
auto value = getValue(pos, width);
- auto mask = (1UL << width) - 1;
+ auto mask = createMask(width);
mask <<= ui_bitoffset;
value <<= ui_bitoffset;
auto old_gui = sb->value();
@@ -117,28 +117,28 @@ bool Register::setFromString(QString s)
return okay;
}
-unsigned long Register::getValue()
+unsigned long long Register::getValue()
{
return value;
}
-unsigned long Register::getValue(int pos, int width)
+unsigned long long Register::getValue(int pos, int width)
{
- unsigned long mask = (1UL << width) - 1;
+ unsigned long mask = createMask(width);
mask <<= pos;
auto masked = value & mask;
masked >>= pos;
return masked;
}
-void Register::setValue(unsigned long newval)
+void Register::setValue(unsigned long long newval)
{
setValue(newval, 0, width);
}
-void Register::setValue(unsigned long newval, int pos, int width)
+void Register::setValue(unsigned long long newval, int pos, int width)
{
- unsigned long mask = (1UL << width) - 1;
+ unsigned long long mask = createMask(width);
newval &= mask;
newval <<= pos;
mask <<= pos;
@@ -160,6 +160,13 @@ Register *Register::findByAddress(std::vector regs, int address)
return nullptr;
}
+unsigned long long Register::createMask(int width)
+{
+ // can't shift by 64 bits at a time (apparantly a limit of the instruction set: https://stackoverflow.com/questions/55376273/weird-result-in-left-shift-1ull-s-1-if-s-64)
+ // Maximum register width is 64 for now, so shift by one less than width and then shift again by one
+ return ((1ULL << (width - 1)) << 1) - 1;
+}
+
int Register::getAddress() const
{
return address;
diff --git a/Software/PC_Application/Device/RegisterAccess/register.h b/Software/PC_Application/Device/RegisterAccess/register.h
index c731fe1..9ed2bd5 100644
--- a/Software/PC_Application/Device/RegisterAccess/register.h
+++ b/Software/PC_Application/Device/RegisterAccess/register.h
@@ -28,8 +28,8 @@ public:
QString hexString();
bool setFromString(QString hex);
- unsigned long getValue();
- unsigned long getValue(int pos, int width);
+ unsigned long long getValue();
+ unsigned long long getValue(int pos, int width);
QString getName() const;
static void fillTableWidget(QTableWidget *w, std::vector regs);
@@ -37,16 +37,17 @@ public:
int getAddress() const;
public slots:
- void setValue(unsigned long newval);
- void setValue(unsigned long newval, int pos, int width);
+ void setValue(unsigned long long newval);
+ void setValue(unsigned long long newval, int pos, int width);
signals:
- void valueChanged(unsigned long newval);
+ void valueChanged(unsigned long long newval);
private:
static Register *findByAddress(std::vector regs, int address);
+ static unsigned long long createMask(int width);
QString name;
int address;
int width;
- unsigned long value;
+ unsigned long long value;
bool updating; // for preventing endless recursion when updating register/its UI connections
};
diff --git a/Software/PC_Application/Device/RegisterAccess/registerdevice.cpp b/Software/PC_Application/Device/RegisterAccess/registerdevice.cpp
index 37c0c3a..99a6178 100644
--- a/Software/PC_Application/Device/RegisterAccess/registerdevice.cpp
+++ b/Software/PC_Application/Device/RegisterAccess/registerdevice.cpp
@@ -3,6 +3,7 @@
#include "max2871.h"
#include "stw81200.h"
#include "ad9913.h"
+#include "si5332.h"
#include "Device/device.h"
RegisterDevice *RegisterDevice::create(Device *dev, int number, QString partnumber, QString name)
@@ -14,6 +15,8 @@ RegisterDevice *RegisterDevice::create(Device *dev, int number, QString partnumb
regdev = new STW81200();
} else if(partnumber == "AD9913") {
regdev = new AD9913();
+ } else if(partnumber == "Si5332") {
+ regdev = new SI5332();
}
if(regdev) {
regdev->dev = dev;
@@ -38,7 +41,7 @@ RegisterDevice::~RegisterDevice()
delete widget;
}
-void RegisterDevice::setRegister(int address, unsigned long value)
+void RegisterDevice::setRegister(int address, unsigned long long value)
{
for(auto reg : regs) {
if(reg->getAddress() == address) {
diff --git a/Software/PC_Application/Device/RegisterAccess/registerdevice.h b/Software/PC_Application/Device/RegisterAccess/registerdevice.h
index db409a6..3053638 100644
--- a/Software/PC_Application/Device/RegisterAccess/registerdevice.h
+++ b/Software/PC_Application/Device/RegisterAccess/registerdevice.h
@@ -14,7 +14,7 @@ public:
static RegisterDevice *create(Device *dev, int number, QString partnumber, QString name);
~RegisterDevice();
- void setRegister(int address, unsigned long value);
+ void setRegister(int address, unsigned long long value);
QWidget *getWidget() const;
QString getPartnumber() const;
diff --git a/Software/PC_Application/Device/RegisterAccess/si5332.cpp b/Software/PC_Application/Device/RegisterAccess/si5332.cpp
index e44f140..1bc1ea1 100644
--- a/Software/PC_Application/Device/RegisterAccess/si5332.cpp
+++ b/Software/PC_Application/Device/RegisterAccess/si5332.cpp
@@ -60,10 +60,16 @@ SI5332::SI5332()
Register::assignUI(regs, 0x35, ui->ID0_CFG_SEL, 6, 1);
Register::assignUI(regs, 0x35, ui->HSDIV4_DIV_SEL, 4, 1);
Register::assignUI(regs, 0x35, ui->ID1_CFG_SEL, 7, 1);
- Register::assignUI(regs, 0x35, ui->HSDIV2_DIV_SEL, 3, 1);
- Register::assignUI(regs, 0x35, ui->HSDIV0_DIV_SEL, 2, 1);
- Register::assignUI(regs, 0x35, ui->HSDIV3_DIV_SEL, 0, 1);
- Register::assignUI(regs, 0x35, ui->HSDIV0_DIV_SEL, 1, 1);
+ Register::assignUI(regs, 0x35, ui->HSDIV2_DIV_SEL, 2, 1);
+ Register::assignUI(regs, 0x35, ui->HSDIV0_DIV_SEL, 0, 1);
+ Register::assignUI(regs, 0x35, ui->HSDIV1_DIV_SEL, 1, 1);
+
+ Register::assignUI(regs, 0x36, ui->ID0A_INTG, 0, 8);
+ Register::assignUI(regs, 0x37, ui->ID0A_INTG, 0, 8, 8);
+ Register::assignUI(regs, 0x38, ui->ID0A_RES, 0, 8);
+ Register::assignUI(regs, 0x39, ui->ID0A_RES, 0, 8, 8);
+ Register::assignUI(regs, 0x3A, ui->ID0A_DEN, 0, 8);
+ Register::assignUI(regs, 0x3B, ui->ID0A_DEN, 0, 8, 8);
Register::fillTableWidget(ui->table, regs);