From 58d42e51082386d208ddfae60cd192699d170109 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Jan=20K=C3=A4berich?= Date: Fri, 28 May 2021 22:52:28 +0200 Subject: [PATCH] input/output connections, STW81200 support --- .../Device/RegisterAccess/max2871.cpp | 41 +- .../Device/RegisterAccess/max2871.h | 3 + .../RegisterAccess/rawregisterdialog.cpp | 11 + .../Device/RegisterAccess/registerdevice.cpp | 10 + .../Device/RegisterAccess/registerdevice.h | 5 + .../Device/RegisterAccess/stw81200.cpp | 256 +++ .../Device/RegisterAccess/stw81200.h | 27 + .../Device/RegisterAccess/stw81200widget.ui | 1854 +++++++++++++++++ Software/PC_Application/LibreVNA-GUI.pro | 4 + 9 files changed, 2208 insertions(+), 3 deletions(-) create mode 100644 Software/PC_Application/Device/RegisterAccess/stw81200.cpp create mode 100644 Software/PC_Application/Device/RegisterAccess/stw81200.h create mode 100644 Software/PC_Application/Device/RegisterAccess/stw81200widget.ui diff --git a/Software/PC_Application/Device/RegisterAccess/max2871.cpp b/Software/PC_Application/Device/RegisterAccess/max2871.cpp index e021adf..66b7df8 100644 --- a/Software/PC_Application/Device/RegisterAccess/max2871.cpp +++ b/Software/PC_Application/Device/RegisterAccess/max2871.cpp @@ -4,6 +4,8 @@ MAX2871::MAX2871() { + currentInput = nullptr; + addRegister(new Register("Register 0", 0, 32)); addRegister(new Register("Register 1", 1, 32)); addRegister(new Register("Register 2", 2, 32)); @@ -84,10 +86,31 @@ MAX2871::MAX2871() ui->freqOutB->setPrefixes(" kMG"); ui->freqOutB->setUnit("Hz"); + QObject::connect(ui->cbRef, &QComboBox::currentTextChanged, [=](QString input){ + SIUnitEdit *newInput = nullptr; + if(possibleInputs.count(input)) { + newInput = possibleInputs[input]; + } + if(currentInput) { + QObject::disconnect(currentInput, &SIUnitEdit::valueChanged, ui->freqRef, &SIUnitEdit::setValue); + ui->ref->setEnabled(true); + } else { + QObject::disconnect(ui->ref, &SIUnitEdit::valueChanged, ui->freqRef, &SIUnitEdit::setValue); + } + if(newInput) { + QObject::connect(newInput, &SIUnitEdit::valueChanged, ui->freqRef, &SIUnitEdit::setValue); + ui->ref->setEnabled(false); + ui->freqRef->setValue(newInput->value()); + } else { + QObject::connect(ui->ref, &SIUnitEdit::valueChanged, ui->freqRef, &SIUnitEdit::setValue); + ui->freqRef->setValue(ui->ref->value()); + } + currentInput = newInput; + }); + // user friendly frequency calculation connections - QObject::connect(ui->ref, &SIUnitEdit::valueChanged, ui->freqRef, &SIUnitEdit::setValue); auto updatePFD = [=]() { - auto pfd = ui->ref->value(); + auto pfd = ui->freqRef->value(); if(ui->DBR->isChecked()) { pfd *= 2; } @@ -102,7 +125,7 @@ MAX2871::MAX2871() palette.setColor(QPalette::Base,valid ? Qt::white : Qt::red); ui->freqPFD->setPalette(palette); }; - QObject::connect(ui->ref, &SIUnitEdit::valueChanged, updatePFD); + QObject::connect(ui->freqRef, &SIUnitEdit::valueChanged, updatePFD); QObject::connect(ui->INT, &QCheckBox::toggled, updatePFD); QObject::connect(ui->DBR, &QCheckBox::toggled, updatePFD); QObject::connect(ui->RDIV2, &QCheckBox::toggled, updatePFD); @@ -152,6 +175,9 @@ MAX2871::MAX2871() QObject::connect(ui->DIVA, qOverload(&QComboBox::currentIndexChanged), updateOutB); QObject::connect(ui->BDIV, qOverload(&QComboBox::currentIndexChanged), updateOutB); + outputs["OutA"] = ui->freqOutA; + outputs["OutB"] = ui->freqOutB; + ui->ref->setValue(100000000); } @@ -180,3 +206,12 @@ nlohmann::json MAX2871::toJSON() return j; } +void MAX2871::addPossibleInputs(RegisterDevice *inputDevice) +{ + RegisterDevice::addPossibleInputs(inputDevice); + ui->cbRef->clear(); + ui->cbRef->addItem("Manual"); + for(auto i : possibleInputs) { + ui->cbRef->addItem(i.first); + } +} diff --git a/Software/PC_Application/Device/RegisterAccess/max2871.h b/Software/PC_Application/Device/RegisterAccess/max2871.h index 09aa2f2..03dd3bd 100644 --- a/Software/PC_Application/Device/RegisterAccess/max2871.h +++ b/Software/PC_Application/Device/RegisterAccess/max2871.h @@ -3,6 +3,7 @@ #include "registerdevice.h" #include +#include "CustomWidgets/siunitedit.h" namespace Ui { class MAX2871Widget; @@ -17,7 +18,9 @@ public: void fromJSON(nlohmann::json j) override; nlohmann::json toJSON() override; + void addPossibleInputs(RegisterDevice *inputDevice) override; private: + SIUnitEdit *currentInput; Ui::MAX2871Widget *ui; }; diff --git a/Software/PC_Application/Device/RegisterAccess/rawregisterdialog.cpp b/Software/PC_Application/Device/RegisterAccess/rawregisterdialog.cpp index 982e06b..ddb50fa 100644 --- a/Software/PC_Application/Device/RegisterAccess/rawregisterdialog.cpp +++ b/Software/PC_Application/Device/RegisterAccess/rawregisterdialog.cpp @@ -100,6 +100,17 @@ void RawRegisterDialog::receivedDirectRegisterInfo(Protocol::DirectRegisterInfo } devices[info.num] = regdev; ui->tabs->addTab(regdev->getWidget(), QString(info.type)+": "+QString(info.name)); + + if(info.num == devices.size() - 1) { + // this was the last device, make outputs available as inputs for other devices + for(auto outer : devices) { + for(auto inner : devices) { + if(inner != outer) { + inner->addPossibleInputs(outer); + } + } + } + } } void RawRegisterDialog::receivedDirectRegister(Protocol::DirectRegisterWrite reg) diff --git a/Software/PC_Application/Device/RegisterAccess/registerdevice.cpp b/Software/PC_Application/Device/RegisterAccess/registerdevice.cpp index d8740f9..0a7b8a2 100644 --- a/Software/PC_Application/Device/RegisterAccess/registerdevice.cpp +++ b/Software/PC_Application/Device/RegisterAccess/registerdevice.cpp @@ -1,6 +1,7 @@ #include "registerdevice.h" #include "max2871.h" +#include "stw81200.h" #include "Device/device.h" RegisterDevice *RegisterDevice::create(Device *dev, int number, QString partnumber, QString name) @@ -8,6 +9,8 @@ RegisterDevice *RegisterDevice::create(Device *dev, int number, QString partnumb RegisterDevice *regdev = nullptr; if(partnumber == "MAX2871") { regdev = new MAX2871(); + } else if(partnumber == "STW81200") { + regdev = new STW81200(); } if(regdev) { regdev->dev = dev; @@ -51,6 +54,13 @@ QString RegisterDevice::getName() const return name; } +void RegisterDevice::addPossibleInputs(RegisterDevice *inputDevice) +{ + for(auto o : inputDevice->outputs) { + possibleInputs[inputDevice->name+":"+o.first] = o.second; + } +} + QString RegisterDevice::getPartnumber() const { return partnumber; diff --git a/Software/PC_Application/Device/RegisterAccess/registerdevice.h b/Software/PC_Application/Device/RegisterAccess/registerdevice.h index a38e706..db409a6 100644 --- a/Software/PC_Application/Device/RegisterAccess/registerdevice.h +++ b/Software/PC_Application/Device/RegisterAccess/registerdevice.h @@ -6,6 +6,7 @@ #include "register.h" #include "savable.h" #include "Device/device.h" +#include "CustomWidgets/siunitedit.h" class RegisterDevice : public Savable { @@ -19,6 +20,8 @@ public: QString getPartnumber() const; QString getName() const; + virtual void addPossibleInputs(RegisterDevice *inputDevice); + protected: void addRegister(Register *reg); @@ -33,6 +36,8 @@ protected: QString name; std::vector regs; QWidget *widget; + std::map outputs; + std::map possibleInputs; }; #endif // REGISTERDEVICE_H diff --git a/Software/PC_Application/Device/RegisterAccess/stw81200.cpp b/Software/PC_Application/Device/RegisterAccess/stw81200.cpp new file mode 100644 index 0000000..2d74a25 --- /dev/null +++ b/Software/PC_Application/Device/RegisterAccess/stw81200.cpp @@ -0,0 +1,256 @@ +#include "stw81200.h" +#include "ui_stw81200widget.h" +#include "register.h" + +STW81200::STW81200() +{ + currentInput = nullptr; + + addRegister(new Register("ST0", 0, 26)); + addRegister(new Register("ST0", 1, 26)); + addRegister(new Register("ST2", 2, 26)); + addRegister(new Register("ST3", 3, 26)); + addRegister(new Register("ST4", 4, 26)); + addRegister(new Register("ST5", 5, 26)); + addRegister(new Register("ST6", 6, 26)); + addRegister(new Register("ST7", 7, 26)); + addRegister(new Register("ST8", 8, 26)); + addRegister(new Register("ST9", 9, 26)); + addRegister(new Register("ST10", 10, 26)); + + ui = new Ui::STW81200Widget; + ui->setupUi(widget); + + regs[0]->assignUI(ui->CP_SEL, 21, 5); + regs[0]->assignUI(ui->PFD_SEL, 19, 2); + regs[0]->assignUI(ui->N, 0, 17); + + regs[1]->assignUI(ui->DBR_ST1, 26); + regs[1]->assignUI(ui->RF1_OUT_PD, 24, true); + regs[1]->assignUI(ui->RF1_DIV_SEL, 21, 3); + regs[1]->assignUI(ui->frac, 0, 21); + + regs[2]->assignUI(ui->DBR_ST2, 26); + regs[2]->assignUI(ui->RF2_OUT_PD, 24, true); + regs[2]->assignUI(ui->RF2_DIV_SEL, 21, 3); + regs[2]->assignUI(ui->MOD, 0, 21); + + regs[3]->assignUI(ui->DBR_ST3, 26); + regs[3]->assignUI(ui->PD, 25); + regs[3]->assignUI(ui->CP_LEAK_X2, 24); + regs[3]->assignUI(ui->CP_LEAK, 19, 5); + regs[3]->assignUI(ui->CP_LEAK_DIR, 18, 1); + regs[3]->assignUI(ui->DNSPLIT_EN, 17); + 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); + regs[4]->assignUI(ui->EXT_VCO_EN, 19); + regs[4]->assignUI(ui->VCO_AMP, 15, 4); + regs[4]->assignUI(ui->PLL_MUX_DIV, 14, 1); + regs[4]->assignUI(ui->CP_SUPPLY_MODE, 12, 2); + regs[4]->assignUI(ui->KVCO_COMP_DIS, 11); + regs[4]->assignUI(ui->PFD_POL, 10, 1); + regs[4]->assignUI(ui->REF_BUFF_MODE, 8, 2); + regs[4]->assignUI(ui->MUTE_LOCK_EN, 7); + regs[4]->assignUI(ui->LD_ACTIVELOW, 6, 1); + regs[4]->assignUI(ui->LD_PREC, 3, 3); + regs[4]->assignUI(ui->LD_COUNT, 0, 3); + + regs[5]->assignUI(ui->VCO_BUFF_LP, 12); + regs[5]->assignUI(ui->VCO_MUX_LP, 11); + regs[5]->assignUI(ui->RF_DIV2_LP, 10); + regs[5]->assignUI(ui->RF_DIV4_LP, 9); + regs[5]->assignUI(ui->RF_DIV8_LP, 8); + regs[5]->assignUI(ui->RF_DIV16_LP, 7); + regs[5]->assignUI(ui->RF_DIV32_LP, 6); + regs[5]->assignUI(ui->RF_DIV64_LP, 5); + regs[5]->assignUI(ui->RF_DIV_MUXOUT_LP, 4); + regs[5]->assignUI(ui->PLL_MUX_LP, 2); + regs[5]->assignUI(ui->REF_BUFF_LP, 0); + + regs[6]->assignUI(ui->DITHERING, 26); + regs[6]->assignUI(ui->DSM_ORDER, 22, 2); + regs[6]->assignUI(ui->MAN_CALB_EN, 20); + regs[6]->assignUI(ui->VCO_SEL, 18, 2); + regs[6]->assignUI(ui->VCO_WORD, 13, 5); + regs[6]->assignUI(ui->CAL_TEMP_COMP, 12); + regs[6]->assignUI(ui->PRCHG_DEL, 10, 2); + regs[6]->assignUI(ui->CAL_ACC_EN, 9); + regs[6]->assignUI(ui->CAL_DIV, 0, 9); + + regs[7]->assignUI(ui->LD_SDO_tristate, 25); + regs[7]->assignUI(ui->LD_SDO_MODE, 24, 1); + regs[7]->assignUI(ui->SPI_DATA_OUT_DISABLE, 23); + 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->FSTLCK_CNT, 0, 13); + + regs[8]->assignUI(ui->PD_RF2_DISABLE, 26); + regs[8]->assignUI(ui->REG_DIG_PD, 18); + regs[8]->assignUI(ui->REG_DIG_VOUT, 16, 2); + regs[8]->assignUI(ui->REG_REF_PD, 14); + regs[8]->assignUI(ui->REG_REF_VOUT, 12, 2); + regs[8]->assignUI(ui->REG_RF_PD, 10); + regs[8]->assignUI(ui->REG_RF_VOUT, 8, 2); + 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[10]->assignUI(ui->REG_DIG_STARTUP, 17); + regs[10]->assignUI(ui->REG_REF_STARTUP, 16); + regs[10]->assignUI(ui->REG_RF_STARTUP, 15); + regs[10]->assignUI(ui->REG_VCO_STARTUP, 14); + regs[10]->assignUI(ui->REG_VCO_4V5_STARTUP, 13); + regs[10]->assignUI(ui->REG_DIG_OCP, 12); + regs[10]->assignUI(ui->REG_REF_OCP, 11); + regs[10]->assignUI(ui->REG_RF_OCP, 10); + regs[10]->assignUI(ui->REG_VCO_OCP, 9); + regs[10]->assignUI(ui->REG_VCO_4V5_OCP, 8); + regs[10]->assignUI(ui->LOCK_DET, 7); + regs[10]->assignUI(ui->VCO_SEL_ST10, 5, 2); + regs[10]->assignUI(ui->WORD, 0, 5); + + + Register::fillTableWidget(ui->table, regs); + + ui->ref->setPrefixes(" kMG"); + ui->ref->setUnit("Hz"); + ui->freqRef->setPrefixes(" kMG"); + ui->freqRef->setUnit("Hz"); + ui->freqPFD->setPrefixes(" kMG"); + ui->freqPFD->setUnit("Hz"); + ui->freqVCO->setPrefixes(" kMG"); + ui->freqVCO->setUnit("Hz"); + ui->freqOutA->setPrefixes(" kMG"); + ui->freqOutA->setUnit("Hz"); + ui->freqOutB->setPrefixes(" kMG"); + ui->freqOutB->setUnit("Hz"); + + QObject::connect(ui->cbRef, &QComboBox::currentTextChanged, [=](QString input){ + SIUnitEdit *newInput = nullptr; + if(possibleInputs.count(input)) { + newInput = possibleInputs[input]; + } + if(currentInput) { + QObject::disconnect(currentInput, &SIUnitEdit::valueChanged, ui->freqRef, &SIUnitEdit::setValue); + ui->ref->setEnabled(true); + } else { + QObject::disconnect(ui->ref, &SIUnitEdit::valueChanged, ui->freqRef, &SIUnitEdit::setValue); + } + if(newInput) { + QObject::connect(newInput, &SIUnitEdit::valueChanged, ui->freqRef, &SIUnitEdit::setValue); + ui->ref->setEnabled(false); + ui->freqRef->setValue(newInput->value()); + } else { + QObject::connect(ui->ref, &SIUnitEdit::valueChanged, ui->freqRef, &SIUnitEdit::setValue); + ui->freqRef->setValue(ui->ref->value()); + } + currentInput = newInput; + }); + + // user friendly frequency calculation connections + auto updatePFD = [=]() { + auto pfd = ui->freqRef->value(); + switch(ui->REF_PATH_SEL->currentIndex()) { + case 0: break; + case 1: pfd *= 2; break; + case 2: pfd /= 2; break; + case 3: pfd /= 4; break; + } + pfd /= ui->R->value(); + ui->freqPFD->setValue(pfd); + bool valid = pfd <= 100000000; + // check value and set background + QPalette palette; + palette.setColor(QPalette::Base,valid ? Qt::white : Qt::red); + ui->freqPFD->setPalette(palette); + }; + QObject::connect(ui->freqRef, &SIUnitEdit::valueChanged, updatePFD); + QObject::connect(ui->REF_PATH_SEL, qOverload(&QComboBox::currentIndexChanged), updatePFD); + QObject::connect(ui->R, qOverload(&QSpinBox::valueChanged), updatePFD); + auto updateVCO = [=]() { + auto pfd = ui->freqPFD->value(); + auto vco = pfd * ui->N->value(); + vco += pfd * (double) ui->frac->value() / ui->MOD->value(); + ui->freqVCO->setValue(vco); + bool valid = vco >= 3000000000 && vco <= 6000000000; + // check value and set background + QPalette palette; + palette.setColor(QPalette::Base,valid ? Qt::white : Qt::red); + ui->freqVCO->setPalette(palette); + }; + QObject::connect(ui->freqPFD, &SIUnitEdit::valueChanged, updateVCO); + QObject::connect(ui->N, qOverload(&QSpinBox::valueChanged), updateVCO); + QObject::connect(ui->frac, qOverload(&QSpinBox::valueChanged), updateVCO); + QObject::connect(ui->MOD, qOverload(&QSpinBox::valueChanged), updateVCO); + auto updateOutA = [=]() { + auto out_a = ui->freqVCO->value() / (1 << ui->RF1_DIV_SEL->currentIndex()); + ui->freqOutA->setValue(out_a); + }; + QObject::connect(ui->freqVCO, &SIUnitEdit::valueChanged, updateOutA); + QObject::connect(ui->RF1_DIV_SEL, qOverload(&QComboBox::currentIndexChanged), updateOutA); + auto updateOutB = [=]() { + auto out_b = ui->freqVCO->value(); + int div = 0; + if(ui->RF2_DIV_SEL->currentIndex() == 7) { + // use divider from Out 1 + div = 1 << ui->RF1_DIV_SEL->currentIndex(); + } else { + div = 1 << ui->RF2_DIV_SEL->currentIndex(); + } + out_b /= div; + ui->freqOutB->setValue(out_b); + }; + QObject::connect(ui->freqVCO, &SIUnitEdit::valueChanged, updateOutB); + QObject::connect(ui->RF1_DIV_SEL, qOverload(&QComboBox::currentIndexChanged), updateOutB); + QObject::connect(ui->RF2_DIV_SEL, qOverload(&QComboBox::currentIndexChanged), updateOutB); + + outputs["OutA"] = ui->freqOutA; + outputs["OutB"] = ui->freqOutB; + + ui->ref->setValue(100000000); +} + +STW81200::~STW81200() +{ + delete ui; +} + +void STW81200::fromJSON(nlohmann::json j) +{ + registersFromJSON(j["registers"]); + ui->cbRef->setCurrentText(QString::fromStdString(j["reference"])); + if(ui->cbRef->currentText() == "Manual") { + ui->ref->setValue(j["reference_frequency"]); + } +} + +nlohmann::json STW81200::toJSON() +{ + nlohmann::json j; + j["registers"] = registersToJSON(); + j["reference"] = ui->cbRef->currentText().toStdString(); + if(ui->cbRef->currentText() == "Manual") { + j["reference_frequency"] = ui->ref->value(); + } + return j; +} + +void STW81200::addPossibleInputs(RegisterDevice *inputDevice) +{ + RegisterDevice::addPossibleInputs(inputDevice); + ui->cbRef->clear(); + ui->cbRef->addItem("Manual"); + for(auto i : possibleInputs) { + ui->cbRef->addItem(i.first); + } +} diff --git a/Software/PC_Application/Device/RegisterAccess/stw81200.h b/Software/PC_Application/Device/RegisterAccess/stw81200.h new file mode 100644 index 0000000..f2d51d1 --- /dev/null +++ b/Software/PC_Application/Device/RegisterAccess/stw81200.h @@ -0,0 +1,27 @@ +#ifndef STW81200_H +#define STW81200_H + +#include "registerdevice.h" +#include +#include "CustomWidgets/siunitedit.h" + +namespace Ui { +class STW81200Widget; +} + +class STW81200 : public RegisterDevice +{ +public: + STW81200(); + ~STW81200(); + + void fromJSON(nlohmann::json j) override; + nlohmann::json toJSON() override; + + void addPossibleInputs(RegisterDevice *inputDevice) override; +private: + SIUnitEdit *currentInput; + Ui::STW81200Widget *ui; +}; + +#endif // MAX2871_H diff --git a/Software/PC_Application/Device/RegisterAccess/stw81200widget.ui b/Software/PC_Application/Device/RegisterAccess/stw81200widget.ui new file mode 100644 index 0000000..50c2be6 --- /dev/null +++ b/Software/PC_Application/Device/RegisterAccess/stw81200widget.ui @@ -0,0 +1,1854 @@ + + + STW81200Widget + + + + 0 + 0 + 1400 + 847 + + + + Form + + + + + + + + Registers + + + + + + + + + + + + Reference Input + + + + + + + Manual + + + + + + + + + + + + + + Calculated Frequencies + + + + + + Ref In: + + + + + + + true + + + true + + + + + + + PFD: + + + + + + + true + + + true + + + + + + + VCO: + + + + + + + true + + + true + + + + + + + Out 1: + + + + + + + true + + + true + + + + + + + Out 2: + + + + + + + true + + + true + + + + + + + + + + + + + + + + Reference + + + + + + Ref Path: + + + + + + + + Direct + + + + + Double (single only) + + + + + Divided by 2 + + + + + Divided by 4 + + + + + + + + Mode: + + + + + + + + Reserved + + + + + Differential + + + + + XTAL + + + + + Single ended + + + + + + + + R-divider: + + + + + + + 8191 + + + + + + + + + + Low power modes + + + + + + + + + + Power down + + + + + + + VCO_BUFF + + + + + + + VCO_MUX + + + + + + + RF_DIV2 + + + + + + + RF_DIV4 + + + + + + + RF_DIV8 + + + + + + + + + + + RF_DIV16 + + + + + + + RF_DIV32 + + + + + + + RF_DIV64 + + + + + + + PLL_MUX + + + + + + + RF_DIV_MUXOUT + + + + + + + REF_BUFF + + + + + + + + + + + + + + Lock Detect + + + + + + Tri-state + + + + + + + + + Counter: + + + + + + + + 4 + + + + + 8 + + + + + 16 + + + + + 64 + + + + + 256 + + + + + 1024 + + + + + 2048 + + + + + 4096 + + + + + + + + Precision: + + + + + + + + 2ns + + + + + 4ns + + + + + 6ns + + + + + 8ns + + + + + 10ns + + + + + 12ns + + + + + 14ns + + + + + 16ns + + + + + + + + LD Pin: + + + + + + + + Active high + + + + + Active low + + + + + + + + Mode: + + + + + + + + Open Drain + + + + + 2.5V CMOS + + + + + + + + + + + + + + + Qt::Vertical + + + + 20 + 40 + + + + + + + + + + + + + + Divider Settings + + + + + + N: + + + + + + + 16 + + + 131072 + + + + + + + FRAC: + + + + + + + 2097151 + + + + + + + MOD: + + + + + + + 2097151 + + + + + + + Modulator: + + + + + + + + 3rd order + + + + + 2nd order + + + + + 1st order + + + + + 4th order + + + + + + + + + + + Output + + + + + + Enable Out 1 + + + + + + + + + Divider Out 1: + + + + + + + + 1 + + + + + 2 + + + + + 4 + + + + + 8 + + + + + 16 + + + + + 32 + + + + + 64 + + + + + Reserved + + + + + + + + + + Enable Out 2 + + + + + + + + + Divider Out 2: + + + + + + + + 1 + + + + + 2 + + + + + 4 + + + + + 8 + + + + + 16 + + + + + 32 + + + + + 64 + + + + + Same as output 1 + + + + + + + + Out Power: + + + + + + + + -1.0 dBm + + + + + +1.0 dBm + + + + + +2.5 dBm + + + + + +3.5 dBm + + + + + +4.5 dBm + + + + + +5.5 dBm + + + + + +6.5 dBm + + + + + +7.0 dBm + + + + + + + + + + + + + + + + + + + LDO configuration + + + + + + Power down DIG + + + + + + + + + Voltage DIG: + + + + + + + + 2.6V + + + + + 2.3V + + + + + 2.4V + + + + + 2.5V + + + + + + + + + + Power down REF + + + + + + + + + Voltage REF: + + + + + + + + 2.6V + + + + + 2.5V + + + + + 2.7V + + + + + 2.8V + + + + + + + + + + Power down RF + + + + + + + + + Voltage RF: + + + + + + + + 2.6V + + + + + 2.5V + + + + + 2.7V + + + + + 2.8V + + + + + + + + + + Power down VCO + + + + + + + + + Voltage REF: + + + + + + + + 2.6V + + + + + 2.5V + + + + + 2.7V + + + + + 2.8V + + + + + + + + + + Power down 4V5 + + + + + + + + + Voltage REF: + + + + + + + + 5.0V + + + + + 2.6V + + + + + 3.3V + + + + + 4.5V + + + + + + + + + + + + + Qt::Vertical + + + + 20 + 40 + + + + + + + + + + + + Status + + + + + + + + false + + + LDO DIG + + + true + + + false + + + false + + + + + + + false + + + LDO DIG overcurrent + + + true + + + false + + + false + + + + + + + false + + + LDO REF + + + true + + + false + + + false + + + + + + + false + + + LDO REF overcurrent + + + true + + + false + + + false + + + + + + + false + + + LDO RF + + + true + + + false + + + false + + + + + + + false + + + LDO RF overcurrent + + + true + + + false + + + false + + + + + + + false + + + LDO VCO + + + true + + + false + + + false + + + + + + + false + + + LDO VCO overcurrent + + + true + + + false + + + false + + + + + + + false + + + LDO VCO 4V5 + + + true + + + false + + + false + + + + + + + false + + + LDO VCO 4V5 overcurrent + + + true + + + false + + + false + + + + + + + + + false + + + Locked + + + + + + + + + VCO SEL: + + + + + + + false + + + + VCO high + + + + + VCO low + + + + + VCO mid + + + + + VCO low + + + + + + + + VCO Word: + + + + + + + false + + + 31 + + + + + + + + + + + + Mixed + + + + + + Mute until lock + + + + + + + disable KVCO compensation + + + + + + + ST1 double buffered + + + + + + + ST2 double buffered + + + + + + + ST3 double buffered + + + + + + + Dithering + + + + + + + disable SDO during SPI mode + + + + + + + + + LD/SDO pin: + + + + + + + + Lock Detector + + + + + VCO Divider + + + + + Calibrator VC divider + + + + + Fast Lock clock + + + + + + + + + + Disable HW power down + + + + + + + + + + + + + + + + + + Charge Pump + + + + + + + + Leak direction: + + + + + + + + down (sink) + + + + + up (source) + + + + + + + + Leakage current: + + + + + + + 31 + + + + + + + + + double leakage + + + + + + + Enable down-split + + + + + + + + + PFD_DEL: + + + + + + + + 1.2ns/0A + + + + + 1.9ns/0.25*Icp + + + + + 2.5ns/0.5*Icp + + + + + 3.0ns/0.75*Icp + + + + + + + + Current: + + + + + + + 31 + + + + + + + Polarity: + + + + + + + + Standard + + + + + Inverted + + + + + + + + PFD_DEL_MODE: + + + + + + + + no delay + + + + + VCO_DIV delayed + + + + + REF_DIV delayed + + + + + Reserved + + + + + + + + Supply mode: + + + + + + + + 4.5 to 5V + + + + + 3.3V + + + + + 2.6V + + + + + Reserved + + + + + + + + + + Cycle slip + + + + + + + Fast lock + + + + + + + + + Fast lock current: + + + + + + + 31 + + + + + + + Fast lock counter: + + + + + + + 2 + + + 8191 + + + + + + + + + + + + VCO + + + + + + External VCO + + + + + + + + + VCO amplitude: + + + + + + + 15 + + + + + + + PLL MUX: + + + + + + + + VCO direct + + + + + VCO divided + + + + + + + + + + Manual calibration + + + + + + + 2V5 VCO mode + + + + + + + + + Selection: + + + + + + + + VCO high + + + + + VCO low + + + + + VCO mid + + + + + VCO low + + + + + + + + Word: + + + + + + + 31 + + + + + + + PRCHG_DEL: + + + + + + + + 1 slot + + + + + 2 slots + + + + + 3 slots + + + + + 4 slots + + + + + + + + + + Temperature calibration + + + + + + + Increase calibration accuracy + + + + + + + + + CAL_DIV: + + + + + + + 1 + + + 511 + + + + + + + + + + + + + + + SIUnitEdit + QLineEdit +
CustomWidgets/siunitedit.h
+
+
+ + +
diff --git a/Software/PC_Application/LibreVNA-GUI.pro b/Software/PC_Application/LibreVNA-GUI.pro index b8d0c77..6c9f337 100644 --- a/Software/PC_Application/LibreVNA-GUI.pro +++ b/Software/PC_Application/LibreVNA-GUI.pro @@ -21,6 +21,8 @@ HEADERS += \ Device/RegisterAccess/rawregisterdialog.h \ Device/RegisterAccess/register.h \ Device/RegisterAccess/registerdevice.h \ + Device/RegisterAccess/stw81200 \ + Device/RegisterAccess/stw81200.h \ Device/device.h \ Device/devicelog.h \ Device/firmwareupdatedialog.h \ @@ -149,6 +151,7 @@ SOURCES += \ Device/RegisterAccess/rawregisterdialog.cpp \ Device/RegisterAccess/register.cpp \ Device/RegisterAccess/registerdevice.cpp \ + Device/RegisterAccess/stw81200.cpp \ Device/device.cpp \ Device/devicelog.cpp \ Device/firmwareupdatedialog.cpp \ @@ -261,6 +264,7 @@ FORMS += \ CustomWidgets/touchstoneimport.ui \ Device/RegisterAccess/max2871widget.ui \ Device/RegisterAccess/rawregisterdialog.ui \ + Device/RegisterAccess/stw81200widget.ui \ Device/devicelog.ui \ Device/firmwareupdatedialog.ui \ Device/manualcontroldialog.ui \