From 7a9d4ddf7cb0eaee02e1b8f7e3bdc6528e3c5306 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Jan=20K=C3=A4berich?= Date: Tue, 8 Jun 2021 20:02:38 +0200 Subject: [PATCH] bugfixes STW81200 --- .../Application/Drivers/STW81200.cpp | 94 +++++++++++++++++++ .../Application/Drivers/STW81200.hpp | 53 +++++++++++ .../SynthEvalBoard/Application/Hardware.cpp | 9 ++ .../SynthEvalBoard/Application/Hardware.hpp | 2 +- .../SynthEvalBoard/Src/stm32l4xx_hal_msp.c | 9 +- .../SynthEvalBoard/SynthEvalBoard.ioc | 2 + .../RegisterAccess/rawregisterdialog.cpp | 4 + .../RegisterAccess/rawregisterdialog.ui | 33 +++++-- .../Device/RegisterAccess/registerdevice.cpp | 19 ++-- .../Device/RegisterAccess/registerdevice.h | 1 + .../Device/RegisterAccess/si5332.cpp | 2 +- .../Device/RegisterAccess/stw81200.cpp | 8 +- .../Device/RegisterAccess/stw81200widget.ui | 2 +- 13 files changed, 214 insertions(+), 24 deletions(-) create mode 100644 Software/HelperTools/SynthEvalBoard/Application/Drivers/STW81200.cpp create mode 100644 Software/HelperTools/SynthEvalBoard/Application/Drivers/STW81200.hpp 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