mirror of
https://github.com/jankae/LibreVNA.git
synced 2026-04-08 16:03:43 +00:00
Bugfixes
This commit is contained in:
parent
9b1b5e3b5a
commit
1e64875915
21 changed files with 405 additions and 74 deletions
|
|
@ -0,0 +1,151 @@
|
|||
#include "AD9913.hpp"
|
||||
#include "FreeRTOS.h"
|
||||
#include "task.h"
|
||||
|
||||
#define LOG_LEVEL LOG_LEVEL_DEBUG
|
||||
#define LOG_MODULE "AD9913"
|
||||
#include "Log.h"
|
||||
|
||||
bool AD9913::Init() {
|
||||
setCS(true);
|
||||
setPWR_DWN(false);
|
||||
setIO_UPDATE(false);
|
||||
|
||||
setReset(true);
|
||||
vTaskDelay(1);
|
||||
setReset(false);
|
||||
//
|
||||
// while(1) {
|
||||
// uint64_t dac = readRegister(Reg::LINSWEEPPARAM);
|
||||
// LOG_DEBUG("DAC Control register: 0x%08x", dac);
|
||||
// vTaskDelay(100);
|
||||
// }
|
||||
return true;
|
||||
}
|
||||
|
||||
void AD9913::writeRegister(uint32_t address, uint64_t data) {
|
||||
writeRegister((Reg) address, data);
|
||||
updateRegisters();
|
||||
}
|
||||
|
||||
uint64_t AD9913::readRegister(uint32_t address) {
|
||||
return readRegister((Reg) address);
|
||||
}
|
||||
|
||||
void AD9913::writeRegister(Reg reg, uint64_t data) {
|
||||
uint8_t regsize = getRegisterSize(reg);
|
||||
if(!regsize) {
|
||||
// invalid register
|
||||
return;
|
||||
}
|
||||
uint8_t send[1 + regsize];
|
||||
send[0] = (uint8_t) reg;
|
||||
for(uint8_t i=regsize;i>0;i--) {
|
||||
send[i] = data & 0xFF;
|
||||
data >>= 8;
|
||||
}
|
||||
setCS(false);
|
||||
HAL_SPI_Transmit(spi, send, sizeof(send), 100);
|
||||
setCS(true);
|
||||
}
|
||||
|
||||
uint64_t AD9913::readRegister(Reg reg) {
|
||||
uint8_t regsize = getRegisterSize(reg);
|
||||
if(!regsize) {
|
||||
// invalid register
|
||||
return 0;
|
||||
}
|
||||
uint8_t send[1 + regsize];
|
||||
uint8_t recv[1 + regsize];
|
||||
send[0] = 0x80 | (uint8_t) reg;
|
||||
for(uint8_t i=regsize;i>0;i--) {
|
||||
send[i] = 0xFF; // use open drain with pull up
|
||||
}
|
||||
setCS(false);
|
||||
HAL_SPI_TransmitReceive(spi, send, recv, sizeof(send), 100);
|
||||
setCS(true);
|
||||
uint64_t ret = 0;
|
||||
for(uint8_t i=1;i<=regsize;i++) {
|
||||
ret <<= 8;
|
||||
ret |= recv[i];
|
||||
}
|
||||
return ret;
|
||||
}
|
||||
|
||||
void AD9913::setCS(bool p) {
|
||||
if(!CS) {
|
||||
return;
|
||||
}
|
||||
if(p) {
|
||||
CS->BSRR = CSpin;
|
||||
} else {
|
||||
CS->BSRR = CSpin << 16;
|
||||
}
|
||||
}
|
||||
|
||||
void AD9913::setPWR_DWN(bool p) {
|
||||
if(!PWR_DWN) {
|
||||
return;
|
||||
}
|
||||
if(p) {
|
||||
PWR_DWN->BSRR = PWR_DWNpin;
|
||||
} else {
|
||||
PWR_DWN->BSRR = PWR_DWNpin << 16;
|
||||
}
|
||||
}
|
||||
|
||||
void AD9913::setIO_UPDATE(bool p) {
|
||||
if(!IO_UPDATE) {
|
||||
return;
|
||||
}
|
||||
if(p) {
|
||||
IO_UPDATE->BSRR = IO_UPDATEpin;
|
||||
} else {
|
||||
IO_UPDATE->BSRR = IO_UPDATEpin << 16;
|
||||
}
|
||||
}
|
||||
|
||||
void AD9913::setReset(bool p) {
|
||||
if(!MRESET) {
|
||||
return;
|
||||
}
|
||||
if(p) {
|
||||
MRESET->BSRR = MRESETpin;
|
||||
} else {
|
||||
MRESET->BSRR = MRESETpin << 16;
|
||||
}
|
||||
}
|
||||
|
||||
void AD9913::updateRegisters() {
|
||||
setIO_UPDATE(true);
|
||||
setIO_UPDATE(false);
|
||||
}
|
||||
|
||||
uint8_t AD9913::getRegisterSize(Reg reg) {
|
||||
switch(reg) {
|
||||
case Reg::CFR2:
|
||||
case Reg::POW:
|
||||
return 2; // 16 bit registers
|
||||
case Reg::CFR1:
|
||||
case Reg::DACControl:
|
||||
case Reg::FTW:
|
||||
case Reg::LINSWEEPRAMP:
|
||||
return 4; // 32 bit registers
|
||||
case Reg::LINSWEEPPARAM:
|
||||
case Reg::LINSWEEPDELTA:
|
||||
return 8; // 64 bit registers
|
||||
case Reg::PROFILE0:
|
||||
case Reg::PROFILE1:
|
||||
case Reg::PROFILE2:
|
||||
case Reg::PROFILE3:
|
||||
case Reg::PROFILE4:
|
||||
case Reg::PROFILE5:
|
||||
case Reg::PROFILE6:
|
||||
case Reg::PROFILE7:
|
||||
return 6; // 48 bit registers
|
||||
default:
|
||||
return 0; // invalid register
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
|
|
@ -0,0 +1,61 @@
|
|||
#pragma once
|
||||
|
||||
#include "stm.hpp"
|
||||
#include "RegisterDevice.hpp"
|
||||
|
||||
class AD9913 : public RegisterDevice {
|
||||
public:
|
||||
constexpr AD9913(const char *name, SPI_HandleTypeDef *spi, GPIO_TypeDef *CS,
|
||||
uint16_t CSpin, GPIO_TypeDef *IO_UPDATE,
|
||||
uint16_t IO_UPDATEpin, GPIO_TypeDef *MRESET,
|
||||
uint16_t MRESETpin, GPIO_TypeDef *PWR_DWN = nullptr,
|
||||
uint16_t PWR_DWNpin = 0):
|
||||
RegisterDevice("AD9913", name),
|
||||
spi(spi),
|
||||
CS(CS),
|
||||
IO_UPDATE(IO_UPDATE),
|
||||
PWR_DWN(PWR_DWN),
|
||||
MRESET(MRESET),
|
||||
CSpin(CSpin),
|
||||
IO_UPDATEpin(IO_UPDATEpin),
|
||||
PWR_DWNpin(PWR_DWNpin),
|
||||
MRESETpin(MRESETpin)
|
||||
{};
|
||||
|
||||
bool Init();
|
||||
|
||||
void writeRegister(uint32_t address, uint64_t data) override;
|
||||
uint64_t readRegister(uint32_t address) override;
|
||||
|
||||
enum class Reg : uint8_t {
|
||||
CFR1 = 0x00,
|
||||
CFR2 = 0x01,
|
||||
DACControl = 0x02,
|
||||
FTW = 0x03,
|
||||
POW = 0x04,
|
||||
LINSWEEPPARAM = 0x06,
|
||||
LINSWEEPDELTA = 0x07,
|
||||
LINSWEEPRAMP = 0x08,
|
||||
PROFILE0 = 0x09,
|
||||
PROFILE1 = 0x0A,
|
||||
PROFILE2 = 0x0B,
|
||||
PROFILE3 = 0x0C,
|
||||
PROFILE4 = 0x0D,
|
||||
PROFILE5 = 0x0E,
|
||||
PROFILE6 = 0x0F,
|
||||
PROFILE7 = 0x10,
|
||||
};
|
||||
private:
|
||||
void setCS(bool p);
|
||||
void setPWR_DWN(bool p);
|
||||
void setIO_UPDATE(bool p);
|
||||
void setReset(bool p);
|
||||
void updateRegisters();
|
||||
void writeRegister(Reg reg, uint64_t data);
|
||||
uint64_t readRegister(Reg reg);
|
||||
static uint8_t getRegisterSize(Reg reg);
|
||||
SPI_HandleTypeDef *spi;
|
||||
GPIO_TypeDef *CS, *IO_UPDATE, *PWR_DWN, *MRESET;
|
||||
uint16_t CSpin, IO_UPDATEpin, PWR_DWNpin, MRESETpin;
|
||||
};
|
||||
|
||||
|
|
@ -6,7 +6,7 @@ extern "C" {
|
|||
|
||||
//#define LOG_BLOCKING
|
||||
|
||||
#define LOG_USART 3
|
||||
#define LOG_USART 1
|
||||
#define LOG_SENDBUF_LENGTH 1024
|
||||
//#define LOG_USE_MUTEX
|
||||
|
||||
|
|
|
|||
|
|
@ -0,0 +1,27 @@
|
|||
#include "Si5332.hpp"
|
||||
|
||||
#define LOG_LEVEL LOG_LEVEL_INFO
|
||||
#define LOG_MODULE "Si5332"
|
||||
#include "Log.h"
|
||||
|
||||
bool Si5332::Init() {
|
||||
uint8_t dummy;
|
||||
if(HAL_I2C_Mem_Read(i2c, this->address, 0, I2C_MEMADD_SIZE_8BIT, &dummy, 1, 100) != HAL_OK) {
|
||||
LOG_ERR("Failed to initialize");
|
||||
return false;
|
||||
}
|
||||
|
||||
LOG_INFO("Initialized");
|
||||
return true;
|
||||
}
|
||||
|
||||
void Si5332::writeRegister(uint32_t address, uint64_t data) {
|
||||
uint8_t write = data;
|
||||
HAL_I2C_Mem_Write(i2c, this->address, address, I2C_MEMADD_SIZE_8BIT, &write, 1, 100);
|
||||
}
|
||||
|
||||
uint64_t Si5332::readRegister(uint32_t address) {
|
||||
uint8_t read;
|
||||
HAL_I2C_Mem_Read(i2c, this->address, address, I2C_MEMADD_SIZE_8BIT, &read, 1, 100);
|
||||
return read;
|
||||
}
|
||||
|
|
@ -0,0 +1,21 @@
|
|||
#pragma once
|
||||
|
||||
#include "stm.hpp"
|
||||
#include "RegisterDevice.hpp"
|
||||
|
||||
class Si5332 : public RegisterDevice {
|
||||
public:
|
||||
constexpr Si5332(const char *name, I2C_HandleTypeDef *i2c, uint8_t address):
|
||||
RegisterDevice("Si5332", name),
|
||||
i2c(i2c),
|
||||
address(address){};
|
||||
|
||||
bool Init();
|
||||
|
||||
void writeRegister(uint32_t address, uint64_t data) override;
|
||||
uint64_t readRegister(uint32_t address) override;
|
||||
private:
|
||||
I2C_HandleTypeDef *i2c;
|
||||
uint8_t address;
|
||||
};
|
||||
|
||||
|
|
@ -216,7 +216,7 @@ void usb_init(usbd_recv_callback_t receive_callback) {
|
|||
USBD_Init(&hUsbDeviceFS, &FS_Desc, 0);
|
||||
USBD_RegisterClass(&hUsbDeviceFS, &USBD_ClassDriver);
|
||||
USBD_Start(&hUsbDeviceFS);
|
||||
HAL_NVIC_SetPriority(USB_FS_IRQn, 0, 0);
|
||||
HAL_NVIC_SetPriority(USB_FS_IRQn, 5, 0);
|
||||
HAL_NVIC_EnableIRQ(USB_FS_IRQn);
|
||||
}
|
||||
bool usb_transmit(const uint8_t *data, uint16_t length) {
|
||||
|
|
|
|||
|
|
@ -2,7 +2,27 @@
|
|||
|
||||
#include "Protocol.hpp"
|
||||
|
||||
#include "AD9913.hpp"
|
||||
#include "Si5332.hpp"
|
||||
#include "main.h"
|
||||
|
||||
extern I2C_HandleTypeDef hi2c1;
|
||||
extern SPI_HandleTypeDef hspi1, hspi2;
|
||||
|
||||
static Si5332 si5332 = Si5332("Si5332", &hi2c1, 0xD4);
|
||||
|
||||
static AD9913 ad9913 = AD9913("AD9913", &hspi2, AD9913_CS_GPIO_Port,
|
||||
AD9913_CS_Pin, AD9913_IO_UPDATE_GPIO_Port, AD9913_IO_UPDATE_Pin,
|
||||
AD9913_MRESET_GPIO_Port, AD9913_MRESET_Pin, AD9913_PWR_DWN_GPIO_Port,
|
||||
AD9913_PWR_DWN_Pin);
|
||||
|
||||
bool HW::Init() {
|
||||
if(!ad9913.Init()) {
|
||||
return false;
|
||||
}
|
||||
if(!si5332.Init()) {
|
||||
return false;
|
||||
}
|
||||
return true;
|
||||
}
|
||||
|
||||
|
|
|
|||
|
|
@ -5,7 +5,7 @@
|
|||
#include "task.h"
|
||||
|
||||
|
||||
#define LED_TASK_STACK 128
|
||||
#define LED_TASK_STACK 4096
|
||||
|
||||
extern TIM_HandleTypeDef htim2;
|
||||
|
||||
|
|
|
|||
Loading…
Add table
Add a link
Reference in a new issue