LibreVNA/Software/VNA_embedded/Application/Drivers/max2871.hpp
2020-09-17 15:51:20 +02:00

85 lines
2.0 KiB
C++

#pragma once
#include "stm.hpp"
class MAX2871 {
public:
constexpr MAX2871(SPI_HandleTypeDef *hspi, GPIO_TypeDef *LE = nullptr,
uint16_t LEpin = 0, GPIO_TypeDef *RF_EN = nullptr,
uint16_t RF_ENpin = 0, GPIO_TypeDef *LD = nullptr, uint16_t LDpin = 0,
GPIO_TypeDef *CE = nullptr, uint16_t CEpin = 0,
GPIO_TypeDef *MUX = nullptr, uint16_t MUXpin = 0) :
regs(), f_PFD(0),
hspi(hspi),
CE(CE), CEpin(CEpin),
LE(LE), LEpin(LEpin),
MUX(MUX), MUXpin(MUXpin),
RF_EN(RF_EN), RF_ENpin(RF_ENpin),
LD(LD), LDpin(LDpin),
outputFrequency(0),
VCOmax(),
gotVCOMap(false)
{};
bool Init();
bool Init(uint32_t f_ref, bool doubler, uint16_t r, bool div2);
bool SetReference(uint32_t f_ref, bool doubler, uint16_t r, bool div2);
void ChipEnable(bool on);
void RFEnable(bool on);
bool Locked();
enum class Power : uint8_t {
n4dbm = 0x00,
n1dbm = 0x01,
p2dbm = 0x02,
p5dbm = 0x03,
};
void SetPowerOutA(Power p, bool enabled = true);
void SetPowerOutB(Power p, bool enabled = true);
enum class Mode : uint8_t {
LowNoise = 0x00,
LowSpur1 = 0x02,
LowSpur2 = 0x03,
};
void SetMode(Mode m);
enum class CPMode : uint8_t {
Disabled = 0x00,
CP10 = 0x01,
CP20 = 0x02,
CP30 = 0x03,
};
void SetCPMode(CPMode m);
void SetCPCurrent(uint8_t mA);
bool SetFrequency(uint64_t f);
void Update();
void UpdateFrequency();
bool BuildVCOMap();
uint8_t GetTemp();
uint32_t* GetRegisters() {
return regs;
}
uint64_t GetActualFrequency() {
return outputFrequency;
}
private:
static constexpr uint64_t MaxFreq = 6100000000; // 6GHz according to datasheet, but slight overclocking is possible
uint32_t Read();
void Write(uint8_t reg, uint32_t val);
uint32_t regs[6];
uint32_t f_PFD;
SPI_HandleTypeDef *hspi;
GPIO_TypeDef *CE;
uint16_t CEpin;
GPIO_TypeDef *LE;
uint16_t LEpin;
GPIO_TypeDef *MUX;
uint16_t MUXpin;
GPIO_TypeDef *RF_EN;
uint16_t RF_ENpin;
GPIO_TypeDef *LD;
uint16_t LDpin;
uint64_t outputFrequency;
uint16_t VCOmax[64];
bool gotVCOMap;
};