mirror of
https://github.com/jankae/LibreVNA.git
synced 2026-01-18 14:43:09 +01:00
bugfixes STW81200
This commit is contained in:
parent
9dfafe6042
commit
7a9d4ddf7c
|
|
@ -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;
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
|
||||
|
|
@ -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;
|
||||
};
|
||||
|
||||
|
|
@ -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;
|
||||
}
|
||||
|
||||
|
|
|
|||
|
|
@ -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,
|
||||
|
|
|
|||
|
|
@ -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 */
|
||||
|
|
|
|||
|
|
@ -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
|
||||
|
|
|
|||
|
|
@ -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) {
|
||||
|
|
|
|||
|
|
@ -25,14 +25,31 @@
|
|||
</widget>
|
||||
</item>
|
||||
<item>
|
||||
<widget class="QDialogButtonBox" name="buttonBox">
|
||||
<property name="orientation">
|
||||
<enum>Qt::Horizontal</enum>
|
||||
</property>
|
||||
<property name="standardButtons">
|
||||
<set>QDialogButtonBox::Open|QDialogButtonBox::Save</set>
|
||||
</property>
|
||||
</widget>
|
||||
<layout class="QHBoxLayout" name="horizontalLayout">
|
||||
<item>
|
||||
<widget class="QPushButton" name="reload">
|
||||
<property name="text">
|
||||
<string>Reload Registers</string>
|
||||
</property>
|
||||
<property name="icon">
|
||||
<iconset theme="view-refresh"/>
|
||||
</property>
|
||||
</widget>
|
||||
</item>
|
||||
<item>
|
||||
<widget class="QDialogButtonBox" name="buttonBox">
|
||||
<property name="orientation">
|
||||
<enum>Qt::Horizontal</enum>
|
||||
</property>
|
||||
<property name="standardButtons">
|
||||
<set>QDialogButtonBox::Open|QDialogButtonBox::Save</set>
|
||||
</property>
|
||||
<property name="centerButtons">
|
||||
<bool>false</bool>
|
||||
</property>
|
||||
</widget>
|
||||
</item>
|
||||
</layout>
|
||||
</item>
|
||||
</layout>
|
||||
</widget>
|
||||
|
|
|
|||
|
|
@ -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;i<regdev->regs.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;i<regs.size();i++) {
|
||||
p.directRegRead.address = regs[i]->getAddress();
|
||||
dev->SendPacket(p);
|
||||
}
|
||||
}
|
||||
|
||||
void RegisterDevice::addPossibleInputs(RegisterDevice *inputDevice)
|
||||
{
|
||||
for(auto o : inputDevice->outputs) {
|
||||
|
|
|
|||
|
|
@ -19,6 +19,7 @@ public:
|
|||
QWidget *getWidget() const;
|
||||
QString getPartnumber() const;
|
||||
QString getName() const;
|
||||
void reloadRegisters();
|
||||
|
||||
virtual void addPossibleInputs(RegisterDevice *inputDevice);
|
||||
|
||||
|
|
|
|||
|
|
@ -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;
|
||||
|
|
|
|||
|
|
@ -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);
|
||||
|
|
|
|||
|
|
@ -990,7 +990,7 @@
|
|||
</widget>
|
||||
</item>
|
||||
<item>
|
||||
<widget class="QComboBox" name="REG_VC_4V5_VOUT">
|
||||
<widget class="QComboBox" name="REG_VCO_4V5_VOUT">
|
||||
<item>
|
||||
<property name="text">
|
||||
<string>5.0V</string>
|
||||
|
|
|
|||
Loading…
Reference in a new issue