85 lines
2.0 KiB
C++
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;
|
|
};
|