bugfixes STW81200

This commit is contained in:
Jan Käberich 2021-06-08 20:02:38 +02:00
parent 9dfafe6042
commit 7a9d4ddf7c
13 changed files with 214 additions and 24 deletions

View file

@ -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;
}
}

View file

@ -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;
};

View file

@ -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;
}

View file

@ -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,

View file

@ -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 */

View file

@ -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

View file

@ -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) {

View file

@ -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>

View file

@ -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) {

View file

@ -19,6 +19,7 @@ public:
QWidget *getWidget() const;
QString getPartnumber() const;
QString getName() const;
void reloadRegisters();
virtual void addPossibleInputs(RegisterDevice *inputDevice);

View file

@ -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;

View file

@ -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);

View file

@ -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>