diff --git a/Software/HelperTools/SynthEvalBoard/Application/Drivers/STW81200.cpp b/Software/HelperTools/SynthEvalBoard/Application/Drivers/STW81200.cpp
new file mode 100644
index 0000000..c014458
--- /dev/null
+++ b/Software/HelperTools/SynthEvalBoard/Application/Drivers/STW81200.cpp
@@ -0,0 +1,94 @@
+#include "STW81200.hpp"
+#include "FreeRTOS.h"
+#include "task.h"
+
+#define LOG_LEVEL LOG_LEVEL_DEBUG
+#define LOG_MODULE "STW81200"
+#include "Log.h"
+
+bool STW81200::Init() {
+ setLE(false);
+ setHW_PD(false);
+ setPD_RF1(false);
+
+ writeRegister(Reg::ST9, 0x00);
+
+ return true;
+}
+
+void STW81200::writeRegister(uint32_t address, uint64_t data) {
+ writeRegister((Reg) address, data);
+}
+
+uint64_t STW81200::readRegister(uint32_t address) {
+ return readRegister((Reg) address);
+}
+
+void STW81200::writeRegister(Reg reg, uint64_t data) {
+ uint8_t send[4];
+ data &= 0x07FFFFFF;
+ send[0] = (int) reg << 3;
+ send[0] |= data >> 24;
+ send[1] = (data >> 16) & 0xFF;
+ send[2] = (data >> 8) & 0xFF;
+ send[3] = (data >> 0) & 0xFF;
+ HAL_SPI_Transmit(spi, send, sizeof(send), 100);
+ setLE(true);
+ setLE(false);
+}
+
+uint64_t STW81200::readRegister(Reg reg) {
+ uint8_t send[4];
+ uint8_t recv[4];
+ send[0] = 0x80 | (int) reg << 3;
+ send[1] = 0x00;
+ send[2] = 0x00;
+ send[3] = 0x00;
+ HAL_SPI_TransmitReceive(spi, send, recv, sizeof(send), 100);
+ setLE(true);
+ setLE(false);
+ uint64_t data = recv[0] & 0x07;
+ data <<= 8;
+ data |= recv[1];
+ data <<= 8;
+ data |= recv[2];
+ data <<= 8;
+ data |= recv[3];
+ return data;
+}
+
+void STW81200::setLE(bool p) {
+ if(!LE) {
+ return;
+ }
+ if(p) {
+ LE->BSRR = LEpin;
+ } else {
+ LE->BSRR = LEpin << 16;
+ }
+}
+
+void STW81200::setHW_PD(bool p) {
+ if(!HW_PD) {
+ return;
+ }
+ if(p) {
+ HW_PD->BSRR = HW_PDpin;
+ } else {
+ HW_PD->BSRR = HW_PDpin << 16;
+ }
+}
+
+void STW81200::setPD_RF1(bool p) {
+ if(!PD_RF1) {
+ return;
+ }
+ if(p) {
+ PD_RF1->BSRR = PD_RF1pin;
+ } else {
+ PD_RF1->BSRR = PD_RF1pin << 16;
+ }
+}
+
+
+
diff --git a/Software/HelperTools/SynthEvalBoard/Application/Drivers/STW81200.hpp b/Software/HelperTools/SynthEvalBoard/Application/Drivers/STW81200.hpp
new file mode 100644
index 0000000..01e81d5
--- /dev/null
+++ b/Software/HelperTools/SynthEvalBoard/Application/Drivers/STW81200.hpp
@@ -0,0 +1,53 @@
+#pragma once
+
+#include "stm.hpp"
+#include "RegisterDevice.hpp"
+
+class STW81200 : public RegisterDevice {
+ public:
+ constexpr STW81200(const char *name, SPI_HandleTypeDef *spi, GPIO_TypeDef *LE,
+ uint16_t LEpin, GPIO_TypeDef *HW_PD = nullptr,
+ uint16_t HW_PDpin = 0, GPIO_TypeDef *PD_RF1 = nullptr,
+ uint16_t PD_RF1pin = 0):
+ RegisterDevice("STW81200", name),
+ spi(spi),
+ LE(LE),
+ HW_PD(HW_PD),
+ PD_RF1(PD_RF1),
+ LEpin(LEpin),
+ HW_PDpin(HW_PDpin),
+ PD_RF1pin(PD_RF1pin)
+ {};
+
+ bool Init();
+
+ void writeRegister(uint32_t address, uint64_t data) override;
+ uint64_t readRegister(uint32_t address) override;
+
+ enum class Reg : uint8_t {
+ ST0 = 0x00,
+ ST1 = 0x01,
+ ST2 = 0x02,
+ ST3 = 0x03,
+ ST4 = 0x04,
+ ST5 = 0x05,
+ ST6 = 0x06,
+ ST7 = 0x07,
+ ST8 = 0x08,
+ ST9 = 0x09,
+ ST10 = 0x0A,
+ ST11 = 0x0B,
+ };
+ private:
+ void setLE(bool p);
+ void setHW_PD(bool p);
+ void setPD_RF1(bool p);
+ void setReset(bool p);
+ void updateRegisters();
+ void writeRegister(Reg reg, uint64_t data);
+ uint64_t readRegister(Reg reg);
+ SPI_HandleTypeDef *spi;
+ GPIO_TypeDef *LE, *HW_PD, *PD_RF1;
+ uint16_t LEpin, HW_PDpin, PD_RF1pin;
+};
+
diff --git a/Software/HelperTools/SynthEvalBoard/Application/Hardware.cpp b/Software/HelperTools/SynthEvalBoard/Application/Hardware.cpp
index d50f015..6a0b056 100644
--- a/Software/HelperTools/SynthEvalBoard/Application/Hardware.cpp
+++ b/Software/HelperTools/SynthEvalBoard/Application/Hardware.cpp
@@ -4,6 +4,7 @@
#include "AD9913.hpp"
#include "Si5332.hpp"
+#include "STW81200.hpp"
#include "main.h"
extern I2C_HandleTypeDef hi2c1;
@@ -16,6 +17,11 @@ static AD9913 ad9913 = AD9913("AD9913", &hspi2, AD9913_CS_GPIO_Port,
AD9913_MRESET_GPIO_Port, AD9913_MRESET_Pin, AD9913_PWR_DWN_GPIO_Port,
AD9913_PWR_DWN_Pin);
+
+static STW81200 stw81200 = STW81200("STW81200", &hspi1, STW_LE_GPIO_Port,
+ STW_LE_Pin, STW_HW_PD_GPIO_Port, STW_HW_PD_Pin, STW_PD_RF1_GPIO_Port,
+ STW_PD_RF1_Pin);
+
bool HW::Init() {
if(!ad9913.Init()) {
return false;
@@ -23,6 +29,9 @@ bool HW::Init() {
if(!si5332.Init()) {
return false;
}
+ if(!stw81200.Init()) {
+ return false;
+ }
return true;
}
diff --git a/Software/HelperTools/SynthEvalBoard/Application/Hardware.hpp b/Software/HelperTools/SynthEvalBoard/Application/Hardware.hpp
index 96014f5..6cc1310 100644
--- a/Software/HelperTools/SynthEvalBoard/Application/Hardware.hpp
+++ b/Software/HelperTools/SynthEvalBoard/Application/Hardware.hpp
@@ -4,7 +4,7 @@
namespace HW {
-static constexpr uint8_t registerDevices = 2;
+static constexpr uint8_t registerDevices = 3;
static constexpr Protocol::DeviceInfo Info = {
.ProtocolVersion = Protocol::Version,
diff --git a/Software/HelperTools/SynthEvalBoard/Src/stm32l4xx_hal_msp.c b/Software/HelperTools/SynthEvalBoard/Src/stm32l4xx_hal_msp.c
index 02ca760..4583d22 100644
--- a/Software/HelperTools/SynthEvalBoard/Src/stm32l4xx_hal_msp.c
+++ b/Software/HelperTools/SynthEvalBoard/Src/stm32l4xx_hal_msp.c
@@ -169,13 +169,20 @@ void HAL_SPI_MspInit(SPI_HandleTypeDef* hspi)
PA6 ------> SPI1_MISO
PA7 ------> SPI1_MOSI
*/
- GPIO_InitStruct.Pin = GPIO_PIN_5|GPIO_PIN_6|GPIO_PIN_7;
+ GPIO_InitStruct.Pin = GPIO_PIN_5|GPIO_PIN_7;
GPIO_InitStruct.Mode = GPIO_MODE_AF_PP;
GPIO_InitStruct.Pull = GPIO_NOPULL;
GPIO_InitStruct.Speed = GPIO_SPEED_FREQ_VERY_HIGH;
GPIO_InitStruct.Alternate = GPIO_AF5_SPI1;
HAL_GPIO_Init(GPIOA, &GPIO_InitStruct);
+ GPIO_InitStruct.Pin = GPIO_PIN_6;
+ GPIO_InitStruct.Mode = GPIO_MODE_AF_PP;
+ GPIO_InitStruct.Pull = GPIO_PULLUP;
+ GPIO_InitStruct.Speed = GPIO_SPEED_FREQ_VERY_HIGH;
+ GPIO_InitStruct.Alternate = GPIO_AF5_SPI1;
+ HAL_GPIO_Init(GPIOA, &GPIO_InitStruct);
+
/* USER CODE BEGIN SPI1_MspInit 1 */
/* USER CODE END SPI1_MspInit 1 */
diff --git a/Software/HelperTools/SynthEvalBoard/SynthEvalBoard.ioc b/Software/HelperTools/SynthEvalBoard/SynthEvalBoard.ioc
index f675077..279482f 100644
--- a/Software/HelperTools/SynthEvalBoard/SynthEvalBoard.ioc
+++ b/Software/HelperTools/SynthEvalBoard/SynthEvalBoard.ioc
@@ -105,6 +105,8 @@ PA4.Signal=GPIO_Output
PA5.Locked=true
PA5.Mode=Full_Duplex_Master
PA5.Signal=SPI1_SCK
+PA6.GPIOParameters=GPIO_PuPd
+PA6.GPIO_PuPd=GPIO_PULLUP
PA6.Locked=true
PA6.Mode=Full_Duplex_Master
PA6.Signal=SPI1_MISO
diff --git a/Software/PC_Application/Device/RegisterAccess/rawregisterdialog.cpp b/Software/PC_Application/Device/RegisterAccess/rawregisterdialog.cpp
index b6e4e6b..4e6b28b 100644
--- a/Software/PC_Application/Device/RegisterAccess/rawregisterdialog.cpp
+++ b/Software/PC_Application/Device/RegisterAccess/rawregisterdialog.cpp
@@ -31,6 +31,10 @@ RawRegisterDialog::RawRegisterDialog(Device *dev, QWidget *parent) :
// trigger extraction of device information, this will trigger the receivedDirectRegisterInfo slot which will further populate the dialog
dev->SendCommandWithoutPayload(Protocol::PacketType::RequestDirectRegisterInfo);
+ connect(ui->reload, &QPushButton::clicked, [=](){
+ devices[ui->tabs->currentIndex()]->reloadRegisters();
+ });
+
connect(ui->buttonBox->button(QDialogButtonBox::Save), &QPushButton::clicked, [=](){
auto filename = QFileDialog::getSaveFileName(this, "Save register settigns", "", "Raw register file (*.regs)", nullptr, QFileDialog::DontUseNativeDialog);
if(filename.length() > 0) {
diff --git a/Software/PC_Application/Device/RegisterAccess/rawregisterdialog.ui b/Software/PC_Application/Device/RegisterAccess/rawregisterdialog.ui
index dd3b25e..4bb0689 100644
--- a/Software/PC_Application/Device/RegisterAccess/rawregisterdialog.ui
+++ b/Software/PC_Application/Device/RegisterAccess/rawregisterdialog.ui
@@ -25,14 +25,31 @@
-
-
-
- Qt::Horizontal
-
-
- QDialogButtonBox::Open|QDialogButtonBox::Save
-
-
+
+
-
+
+
+ Reload Registers
+
+
+
+
+
+
+ -
+
+
+ Qt::Horizontal
+
+
+ QDialogButtonBox::Open|QDialogButtonBox::Save
+
+
+ false
+
+
+
+
diff --git a/Software/PC_Application/Device/RegisterAccess/registerdevice.cpp b/Software/PC_Application/Device/RegisterAccess/registerdevice.cpp
index 1da7dac..e82e820 100644
--- a/Software/PC_Application/Device/RegisterAccess/registerdevice.cpp
+++ b/Software/PC_Application/Device/RegisterAccess/registerdevice.cpp
@@ -25,13 +25,7 @@ RegisterDevice *RegisterDevice::create(Device *dev, int number, QString partnumb
regdev->name = name;
// read initial register content
- Protocol::PacketInfo p;
- p.type = Protocol::PacketType::DirectRegisterRead;
- p.directRegRead.device = number;
- for(unsigned int i=0;iregs.size();i++) {
- p.directRegRead.address = regdev->regs[i]->getAddress();
- dev->SendPacket(p);
- }
+ regdev->reloadRegisters();
}
return regdev;
}
@@ -60,6 +54,17 @@ QString RegisterDevice::getName() const
return name;
}
+void RegisterDevice::reloadRegisters()
+{
+ Protocol::PacketInfo p;
+ p.type = Protocol::PacketType::DirectRegisterRead;
+ p.directRegRead.device = number;
+ for(unsigned int i=0;igetAddress();
+ dev->SendPacket(p);
+ }
+}
+
void RegisterDevice::addPossibleInputs(RegisterDevice *inputDevice)
{
for(auto o : inputDevice->outputs) {
diff --git a/Software/PC_Application/Device/RegisterAccess/registerdevice.h b/Software/PC_Application/Device/RegisterAccess/registerdevice.h
index 3053638..0401415 100644
--- a/Software/PC_Application/Device/RegisterAccess/registerdevice.h
+++ b/Software/PC_Application/Device/RegisterAccess/registerdevice.h
@@ -19,6 +19,7 @@ public:
QWidget *getWidget() const;
QString getPartnumber() const;
QString getName() const;
+ void reloadRegisters();
virtual void addPossibleInputs(RegisterDevice *inputDevice);
diff --git a/Software/PC_Application/Device/RegisterAccess/si5332.cpp b/Software/PC_Application/Device/RegisterAccess/si5332.cpp
index d4f5ee9..374c22f 100644
--- a/Software/PC_Application/Device/RegisterAccess/si5332.cpp
+++ b/Software/PC_Application/Device/RegisterAccess/si5332.cpp
@@ -446,7 +446,7 @@ SI5332::SI5332()
switch(sel0->currentIndex()) {
case 0: group = ui->freqPLLref->value(); break;
case 1: group = ui->freqPLLref->value() / ui->PDIV_DIV->value(); break;
- case 2: group = ui->ref->value();
+ case 2: group = ui->ref->value(); break;
case 3: group = 0; // CLKIN_3, not available at this part
}
break;
diff --git a/Software/PC_Application/Device/RegisterAccess/stw81200.cpp b/Software/PC_Application/Device/RegisterAccess/stw81200.cpp
index 2d74a25..fa878b1 100644
--- a/Software/PC_Application/Device/RegisterAccess/stw81200.cpp
+++ b/Software/PC_Application/Device/RegisterAccess/stw81200.cpp
@@ -17,6 +17,7 @@ STW81200::STW81200()
addRegister(new Register("ST8", 8, 26));
addRegister(new Register("ST9", 9, 26));
addRegister(new Register("ST10", 10, 26));
+ addRegister(new Register("ST11", 11, 26));
ui = new Ui::STW81200Widget;
ui->setupUi(widget);
@@ -44,9 +45,6 @@ STW81200::STW81200()
regs[3]->assignUI(ui->PFD_DEL_MODE, 15, 2);
regs[3]->assignUI(ui->REF_PATH_SEL, 13, 2);
regs[3]->assignUI(ui->R, 0, 12);
- regs[3]->assignUI(ui->RF1_OUT_PD, 24, true);
- regs[3]->assignUI(ui->RF1_DIV_SEL, 21, 3);
- regs[3]->assignUI(ui->frac, 0, 21);
regs[4]->assignUI(ui->RF_OUT_PWR, 23, 2);
regs[4]->assignUI(ui->VCO_2V5_MODE, 22);
@@ -90,7 +88,7 @@ STW81200::STW81200()
regs[7]->assignUI(ui->LD_SDO_SEL, 21, 2);
regs[7]->assignUI(ui->CYCLE_SLIP_EN, 19);
regs[7]->assignUI(ui->FSTLCK_EN, 18);
- regs[7]->assignUI(ui->CP_SEL, 13, 5);
+ regs[7]->assignUI(ui->CP_SEL_FL, 13, 5);
regs[7]->assignUI(ui->FSTLCK_CNT, 0, 13);
regs[8]->assignUI(ui->PD_RF2_DISABLE, 26);
@@ -103,7 +101,7 @@ STW81200::STW81200()
regs[8]->assignUI(ui->REG_VCO_PD, 6);
regs[8]->assignUI(ui->REG_VCO_VOUT, 4, 2);
regs[8]->assignUI(ui->REG_VCO_4V5_PD, 2);
- regs[8]->assignUI(ui->REG_VCO_4V5_OCP, 0, 2);
+ regs[8]->assignUI(ui->REG_VCO_4V5_VOUT, 0, 2);
regs[10]->assignUI(ui->REG_DIG_STARTUP, 17);
regs[10]->assignUI(ui->REG_REF_STARTUP, 16);
diff --git a/Software/PC_Application/Device/RegisterAccess/stw81200widget.ui b/Software/PC_Application/Device/RegisterAccess/stw81200widget.ui
index 50c2be6..8be21eb 100644
--- a/Software/PC_Application/Device/RegisterAccess/stw81200widget.ui
+++ b/Software/PC_Application/Device/RegisterAccess/stw81200widget.ui
@@ -990,7 +990,7 @@
-
-
+
-
5.0V