mirror of
https://github.com/jankae/LibreVNA.git
synced 2026-02-04 14:44:25 +01:00
Bugfixes
This commit is contained in:
parent
9b1b5e3b5a
commit
1e64875915
|
|
@ -57,7 +57,7 @@
|
|||
|
||||
<targetPlatform archList="all" binaryParser="org.eclipse.cdt.core.ELF" id="fr.ac6.managedbuild.targetPlatform.gnu.cross.1045292400" isAbstract="false" osList="all" superClass="fr.ac6.managedbuild.targetPlatform.gnu.cross" />
|
||||
|
||||
<builder buildPath="${workspace_loc:/SynthEvalBoard}/Debug" id="fr.ac6.managedbuild.builder.gnu.cross.517885454" keepEnvironmentInBuildfile="false" managedBuildOn="true" name="Gnu Make Builder" superClass="fr.ac6.managedbuild.builder.gnu.cross">
|
||||
<builder arguments="-j9" buildPath="${workspace_loc:/SynthEvalBoard}/Debug" command="make" id="fr.ac6.managedbuild.builder.gnu.cross.517885454" keepEnvironmentInBuildfile="false" managedBuildOn="true" name="Gnu Make Builder" superClass="fr.ac6.managedbuild.builder.gnu.cross">
|
||||
|
||||
<outputEntries>
|
||||
|
||||
|
|
@ -77,6 +77,10 @@
|
|||
|
||||
<listOptionValue builtIn="false" value="../Inc" />
|
||||
|
||||
<listOptionValue builtIn="false" value=""${workspace_loc:/${ProjName}/Middlewares/ST/STM32_USB_Device_Library/Class/CDC/Inc}"" />
|
||||
|
||||
<listOptionValue builtIn="false" value=""${workspace_loc:/${ProjName}/Middlewares/ST/STM32_USB_Device_Library/Core/Inc}"" />
|
||||
|
||||
<listOptionValue builtIn="false" value=""${workspace_loc:/${ProjName}/Application}"" />
|
||||
|
||||
<listOptionValue builtIn="false" value=""${workspace_loc:/${ProjName}/Application/Communication}"" />
|
||||
|
|
@ -399,7 +403,17 @@
|
|||
|
||||
</option>
|
||||
|
||||
<option IS_BUILTIN_EMPTY="false" IS_VALUE_EMPTY="true" id="gnu.cpp.compiler.option.preprocessor.def.symbols.1584902750" name="Defined symbols (-D)" superClass="gnu.cpp.compiler.option.preprocessor.def.symbols" useByScannerDiscovery="false" valueType="definedSymbols"><listOptionValue builtIn="false" value="__weak="__attribute__((weak))"" /><listOptionValue builtIn="false" value="__packed="__attribute__((__packed__))"" /><listOptionValue builtIn="false" value="USE_HAL_DRIVER" /><listOptionValue builtIn="false" value="STM32L443xx" /></option>
|
||||
<option IS_BUILTIN_EMPTY="false" IS_VALUE_EMPTY="false" id="gnu.cpp.compiler.option.preprocessor.def.symbols.1584902750" name="Defined symbols (-D)" superClass="gnu.cpp.compiler.option.preprocessor.def.symbols" useByScannerDiscovery="false" valueType="definedSymbols">
|
||||
|
||||
<listOptionValue builtIn="false" value="__weak="__attribute__((weak))"" />
|
||||
|
||||
<listOptionValue builtIn="false" value="__packed="__attribute__((__packed__))"" />
|
||||
|
||||
<listOptionValue builtIn="false" value="USE_HAL_DRIVER" />
|
||||
|
||||
<listOptionValue builtIn="false" value="STM32L443xx" />
|
||||
|
||||
</option>
|
||||
|
||||
<option id="fr.ac6.managedbuild.gnu.cpp.compiler.option.misc.other.1623023140" name="Other flags" superClass="fr.ac6.managedbuild.gnu.cpp.compiler.option.misc.other" useByScannerDiscovery="false" value="-fmessage-length=0" valueType="string" />
|
||||
|
||||
|
|
|
|||
File diff suppressed because one or more lines are too long
|
|
@ -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;
|
||||
|
||||
|
|
|
|||
|
|
@ -66,6 +66,8 @@ void Error_Handler(void);
|
|||
#define STW_HW_PD_GPIO_Port GPIOB
|
||||
#define STW_PD_RF1_Pin GPIO_PIN_1
|
||||
#define STW_PD_RF1_GPIO_Port GPIOB
|
||||
#define AD9913_MRESET_Pin GPIO_PIN_2
|
||||
#define AD9913_MRESET_GPIO_Port GPIOB
|
||||
#define AD9913_PWR_DWN_Pin GPIO_PIN_10
|
||||
#define AD9913_PWR_DWN_GPIO_Port GPIOB
|
||||
#define AD9913_IO_UPDATE_Pin GPIO_PIN_11
|
||||
|
|
|
|||
|
|
@ -55,7 +55,7 @@ UART_HandleTypeDef huart1;
|
|||
PCD_HandleTypeDef hpcd_USB_FS;
|
||||
|
||||
osThreadId defaultTaskHandle;
|
||||
uint32_t defaultTaskBuffer[ 128 ];
|
||||
uint32_t defaultTaskBuffer[ 4096 ];
|
||||
osStaticThreadDef_t defaultTaskControlBlock;
|
||||
/* USER CODE BEGIN PV */
|
||||
|
||||
|
|
@ -68,8 +68,8 @@ static void MX_I2C1_Init(void);
|
|||
static void MX_SPI1_Init(void);
|
||||
static void MX_SPI2_Init(void);
|
||||
static void MX_USART1_UART_Init(void);
|
||||
static void MX_USB_PCD_Init(void);
|
||||
static void MX_TIM2_Init(void);
|
||||
static void MX_USB_PCD_Init(void);
|
||||
void StartDefaultTask(void const * argument);
|
||||
|
||||
/* USER CODE BEGIN PFP */
|
||||
|
|
@ -114,8 +114,8 @@ int main(void)
|
|||
MX_SPI1_Init();
|
||||
MX_SPI2_Init();
|
||||
MX_USART1_UART_Init();
|
||||
MX_USB_PCD_Init();
|
||||
MX_TIM2_Init();
|
||||
MX_USB_PCD_Init();
|
||||
/* USER CODE BEGIN 2 */
|
||||
|
||||
/* USER CODE END 2 */
|
||||
|
|
@ -138,7 +138,7 @@ int main(void)
|
|||
|
||||
/* Create the thread(s) */
|
||||
/* definition and creation of defaultTask */
|
||||
osThreadStaticDef(defaultTask, StartDefaultTask, osPriorityNormal, 0, 128, defaultTaskBuffer, &defaultTaskControlBlock);
|
||||
osThreadStaticDef(defaultTask, StartDefaultTask, osPriorityNormal, 0, 4096, defaultTaskBuffer, &defaultTaskControlBlock);
|
||||
defaultTaskHandle = osThreadCreate(osThread(defaultTask), NULL);
|
||||
|
||||
/* USER CODE BEGIN RTOS_THREADS */
|
||||
|
|
@ -389,10 +389,6 @@ static void MX_TIM2_Init(void)
|
|||
{
|
||||
Error_Handler();
|
||||
}
|
||||
if (HAL_TIM_OC_Init(&htim2) != HAL_OK)
|
||||
{
|
||||
Error_Handler();
|
||||
}
|
||||
sMasterConfig.MasterOutputTrigger = TIM_TRGO_RESET;
|
||||
sMasterConfig.MasterSlaveMode = TIM_MASTERSLAVEMODE_DISABLE;
|
||||
if (HAL_TIMEx_MasterConfigSynchronization(&htim2, &sMasterConfig) != HAL_OK)
|
||||
|
|
@ -415,8 +411,7 @@ static void MX_TIM2_Init(void)
|
|||
{
|
||||
Error_Handler();
|
||||
}
|
||||
sConfigOC.OCMode = TIM_OCMODE_TIMING;
|
||||
if (HAL_TIM_OC_ConfigChannel(&htim2, &sConfigOC, TIM_CHANNEL_4) != HAL_OK)
|
||||
if (HAL_TIM_PWM_ConfigChannel(&htim2, &sConfigOC, TIM_CHANNEL_4) != HAL_OK)
|
||||
{
|
||||
Error_Handler();
|
||||
}
|
||||
|
|
@ -471,7 +466,8 @@ static void MX_USB_PCD_Init(void)
|
|||
{
|
||||
|
||||
/* USER CODE BEGIN USB_Init 0 */
|
||||
|
||||
/* Enable USB power on Pwrctrl CR2 register. */
|
||||
HAL_PWREx_EnableVddUSB();
|
||||
/* USER CODE END USB_Init 0 */
|
||||
|
||||
/* USER CODE BEGIN USB_Init 1 */
|
||||
|
|
@ -512,8 +508,9 @@ static void MX_GPIO_Init(void)
|
|||
HAL_GPIO_WritePin(GPIOA, STW_LE_Pin|SI5332_IN2_Pin|SI5332_IN1_Pin, GPIO_PIN_RESET);
|
||||
|
||||
/*Configure GPIO pin Output Level */
|
||||
HAL_GPIO_WritePin(GPIOB, STW_HW_PD_Pin|STW_PD_RF1_Pin|AD9913_PWR_DWN_Pin|AD9913_IO_UPDATE_Pin
|
||||
|AD9913_CS_Pin|SI5332_IN3_Pin|SI5332_IN4_Pin|SI5332_IN5_Pin, GPIO_PIN_RESET);
|
||||
HAL_GPIO_WritePin(GPIOB, STW_HW_PD_Pin|STW_PD_RF1_Pin|AD9913_MRESET_Pin|AD9913_PWR_DWN_Pin
|
||||
|AD9913_IO_UPDATE_Pin|AD9913_CS_Pin|SI5332_IN3_Pin|SI5332_IN4_Pin
|
||||
|SI5332_IN5_Pin, GPIO_PIN_RESET);
|
||||
|
||||
/*Configure GPIO pins : STW_LE_Pin SI5332_IN2_Pin SI5332_IN1_Pin */
|
||||
GPIO_InitStruct.Pin = STW_LE_Pin|SI5332_IN2_Pin|SI5332_IN1_Pin;
|
||||
|
|
@ -522,10 +519,12 @@ static void MX_GPIO_Init(void)
|
|||
GPIO_InitStruct.Speed = GPIO_SPEED_FREQ_LOW;
|
||||
HAL_GPIO_Init(GPIOA, &GPIO_InitStruct);
|
||||
|
||||
/*Configure GPIO pins : STW_HW_PD_Pin STW_PD_RF1_Pin AD9913_PWR_DWN_Pin AD9913_IO_UPDATE_Pin
|
||||
AD9913_CS_Pin SI5332_IN3_Pin SI5332_IN4_Pin SI5332_IN5_Pin */
|
||||
GPIO_InitStruct.Pin = STW_HW_PD_Pin|STW_PD_RF1_Pin|AD9913_PWR_DWN_Pin|AD9913_IO_UPDATE_Pin
|
||||
|AD9913_CS_Pin|SI5332_IN3_Pin|SI5332_IN4_Pin|SI5332_IN5_Pin;
|
||||
/*Configure GPIO pins : STW_HW_PD_Pin STW_PD_RF1_Pin AD9913_MRESET_Pin AD9913_PWR_DWN_Pin
|
||||
AD9913_IO_UPDATE_Pin AD9913_CS_Pin SI5332_IN3_Pin SI5332_IN4_Pin
|
||||
SI5332_IN5_Pin */
|
||||
GPIO_InitStruct.Pin = STW_HW_PD_Pin|STW_PD_RF1_Pin|AD9913_MRESET_Pin|AD9913_PWR_DWN_Pin
|
||||
|AD9913_IO_UPDATE_Pin|AD9913_CS_Pin|SI5332_IN3_Pin|SI5332_IN4_Pin
|
||||
|SI5332_IN5_Pin;
|
||||
GPIO_InitStruct.Mode = GPIO_MODE_OUTPUT_PP;
|
||||
GPIO_InitStruct.Pull = GPIO_NOPULL;
|
||||
GPIO_InitStruct.Speed = GPIO_SPEED_FREQ_LOW;
|
||||
|
|
|
|||
|
|
@ -202,7 +202,14 @@ void HAL_SPI_MspInit(SPI_HandleTypeDef* hspi)
|
|||
HAL_GPIO_Init(GPIOB, &GPIO_InitStruct);
|
||||
|
||||
/* USER CODE BEGIN SPI2_MspInit 1 */
|
||||
|
||||
// AD9913 at SPI2 has a three wire interface (MISO and MOSI on same pin).
|
||||
// Needs open-drain pins for those (external pull-up on board)
|
||||
GPIO_InitStruct.Pin = GPIO_PIN_15;
|
||||
GPIO_InitStruct.Mode = GPIO_MODE_AF_OD;
|
||||
GPIO_InitStruct.Pull = GPIO_NOPULL;
|
||||
GPIO_InitStruct.Speed = GPIO_SPEED_FREQ_VERY_HIGH;
|
||||
GPIO_InitStruct.Alternate = GPIO_AF5_SPI2;
|
||||
HAL_GPIO_Init(GPIOB, &GPIO_InitStruct);
|
||||
/* USER CODE END SPI2_MspInit 1 */
|
||||
}
|
||||
|
||||
|
|
|
|||
|
|
@ -2,7 +2,7 @@
|
|||
FREERTOS.FootprintOK=true
|
||||
FREERTOS.IPParameters=Tasks01,MEMORY_ALLOCATION,FootprintOK
|
||||
FREERTOS.MEMORY_ALLOCATION=1
|
||||
FREERTOS.Tasks01=defaultTask,0,128,StartDefaultTask,Default,NULL,Static,defaultTaskBuffer,defaultTaskControlBlock
|
||||
FREERTOS.Tasks01=defaultTask,0,4096,StartDefaultTask,Default,NULL,Static,defaultTaskBuffer,defaultTaskControlBlock
|
||||
File.Version=6
|
||||
KeepUserPlacement=false
|
||||
Mcu.Family=STM32L4
|
||||
|
|
@ -21,37 +21,38 @@ Mcu.Name=STM32L443CCUx
|
|||
Mcu.Package=UFQFPN48
|
||||
Mcu.Pin0=PA0
|
||||
Mcu.Pin1=PA1
|
||||
Mcu.Pin10=PB10
|
||||
Mcu.Pin11=PB11
|
||||
Mcu.Pin12=PB12
|
||||
Mcu.Pin13=PB13
|
||||
Mcu.Pin14=PB14
|
||||
Mcu.Pin15=PB15
|
||||
Mcu.Pin16=PA8
|
||||
Mcu.Pin17=PA9
|
||||
Mcu.Pin18=PA10
|
||||
Mcu.Pin19=PA11
|
||||
Mcu.Pin10=PB2
|
||||
Mcu.Pin11=PB10
|
||||
Mcu.Pin12=PB11
|
||||
Mcu.Pin13=PB12
|
||||
Mcu.Pin14=PB13
|
||||
Mcu.Pin15=PB14
|
||||
Mcu.Pin16=PB15
|
||||
Mcu.Pin17=PA8
|
||||
Mcu.Pin18=PA9
|
||||
Mcu.Pin19=PA10
|
||||
Mcu.Pin2=PA2
|
||||
Mcu.Pin20=PA12
|
||||
Mcu.Pin21=PA13 (JTMS-SWDIO)
|
||||
Mcu.Pin22=PA14 (JTCK-SWCLK)
|
||||
Mcu.Pin23=PA15 (JTDI)
|
||||
Mcu.Pin24=PB3 (JTDO-TRACESWO)
|
||||
Mcu.Pin25=PB4 (NJTRST)
|
||||
Mcu.Pin26=PB5
|
||||
Mcu.Pin27=PB6
|
||||
Mcu.Pin28=PB7
|
||||
Mcu.Pin29=VP_FREERTOS_VS_CMSIS_V1
|
||||
Mcu.Pin20=PA11
|
||||
Mcu.Pin21=PA12
|
||||
Mcu.Pin22=PA13 (JTMS-SWDIO)
|
||||
Mcu.Pin23=PA14 (JTCK-SWCLK)
|
||||
Mcu.Pin24=PA15 (JTDI)
|
||||
Mcu.Pin25=PB3 (JTDO-TRACESWO)
|
||||
Mcu.Pin26=PB4 (NJTRST)
|
||||
Mcu.Pin27=PB5
|
||||
Mcu.Pin28=PB6
|
||||
Mcu.Pin29=PB7
|
||||
Mcu.Pin3=PA3
|
||||
Mcu.Pin30=VP_SYS_VS_tim7
|
||||
Mcu.Pin31=VP_TIM2_VS_ClockSourceINT
|
||||
Mcu.Pin30=VP_FREERTOS_VS_CMSIS_V1
|
||||
Mcu.Pin31=VP_SYS_VS_tim7
|
||||
Mcu.Pin32=VP_TIM2_VS_ClockSourceINT
|
||||
Mcu.Pin4=PA4
|
||||
Mcu.Pin5=PA5
|
||||
Mcu.Pin6=PA6
|
||||
Mcu.Pin7=PA7
|
||||
Mcu.Pin8=PB0
|
||||
Mcu.Pin9=PB1
|
||||
Mcu.PinsNb=32
|
||||
Mcu.PinsNb=33
|
||||
Mcu.ThirdPartyNb=0
|
||||
Mcu.UserConstants=
|
||||
Mcu.UserName=STM32L443CCUx
|
||||
|
|
@ -146,6 +147,10 @@ PB14.Signal=SPI2_MISO
|
|||
PB15.Locked=true
|
||||
PB15.Mode=Full_Duplex_Master
|
||||
PB15.Signal=SPI2_MOSI
|
||||
PB2.GPIOParameters=GPIO_Label
|
||||
PB2.GPIO_Label=AD9913_MRESET
|
||||
PB2.Locked=true
|
||||
PB2.Signal=GPIO_Output
|
||||
PB3\ (JTDO-TRACESWO).GPIOParameters=GPIO_Label
|
||||
PB3\ (JTDO-TRACESWO).GPIO_Label=SI5332_IN3
|
||||
PB3\ (JTDO-TRACESWO).Locked=true
|
||||
|
|
@ -199,7 +204,7 @@ ProjectManager.StackSize=0x400
|
|||
ProjectManager.TargetToolchain=SW4STM32
|
||||
ProjectManager.ToolChainLocation=
|
||||
ProjectManager.UnderRoot=true
|
||||
ProjectManager.functionlistsort=1-MX_GPIO_Init-GPIO-false-HAL-true,2-SystemClock_Config-RCC-false-HAL-false,3-MX_I2C1_Init-I2C1-false-HAL-true,4-MX_SPI1_Init-SPI1-false-HAL-true,5-MX_SPI2_Init-SPI2-false-HAL-true,6-MX_USART1_UART_Init-USART1-false-HAL-true,7-MX_USB_PCD_Init-USB-false-HAL-true
|
||||
ProjectManager.functionlistsort=1-MX_GPIO_Init-GPIO-false-HAL-true,2-SystemClock_Config-RCC-false-HAL-false,3-MX_I2C1_Init-I2C1-false-HAL-true,4-MX_SPI1_Init-SPI1-false-HAL-true,5-MX_SPI2_Init-SPI2-false-HAL-true,6-MX_USART1_UART_Init-USART1-false-HAL-true,7-MX_TIM2_Init-TIM2-false-HAL-true,8-MX_USB_PCD_Init-USB-false-HAL-true
|
||||
RCC.ADCFreq_Value=48000000
|
||||
RCC.AHBFreq_Value=80000000
|
||||
RCC.APB1Freq_Value=80000000
|
||||
|
|
@ -252,7 +257,7 @@ SH.S_TIM2_CH2.0=TIM2_CH2,PWM Generation2 CH2
|
|||
SH.S_TIM2_CH2.ConfNb=1
|
||||
SH.S_TIM2_CH3.0=TIM2_CH3,PWM Generation3 CH3
|
||||
SH.S_TIM2_CH3.ConfNb=1
|
||||
SH.S_TIM2_CH4.0=TIM2_CH4,Output Compare4 CH4
|
||||
SH.S_TIM2_CH4.0=TIM2_CH4,PWM Generation4 CH4
|
||||
SH.S_TIM2_CH4.ConfNb=1
|
||||
SPI1.BaudRatePrescaler=SPI_BAUDRATEPRESCALER_64
|
||||
SPI1.CalculateBaudRate=1.25 MBits/s
|
||||
|
|
@ -268,11 +273,11 @@ SPI2.Direction=SPI_DIRECTION_2LINES
|
|||
SPI2.IPParameters=VirtualType,Mode,Direction,CalculateBaudRate,DataSize,BaudRatePrescaler
|
||||
SPI2.Mode=SPI_MODE_MASTER
|
||||
SPI2.VirtualType=VM_MASTER
|
||||
TIM2.Channel-Output\ Compare4\ CH4=TIM_CHANNEL_4
|
||||
TIM2.Channel-PWM\ Generation1\ CH1=TIM_CHANNEL_1
|
||||
TIM2.Channel-PWM\ Generation2\ CH2=TIM_CHANNEL_2
|
||||
TIM2.Channel-PWM\ Generation3\ CH3=TIM_CHANNEL_3
|
||||
TIM2.IPParameters=Channel-PWM Generation1 CH1,Channel-PWM Generation2 CH2,Channel-PWM Generation3 CH3,Channel-Output Compare4 CH4,Prescaler,Period
|
||||
TIM2.Channel-PWM\ Generation4\ CH4=TIM_CHANNEL_4
|
||||
TIM2.IPParameters=Channel-PWM Generation1 CH1,Channel-PWM Generation2 CH2,Channel-PWM Generation3 CH3,Prescaler,Period,Channel-PWM Generation4 CH4
|
||||
TIM2.Period=99
|
||||
TIM2.Prescaler=79
|
||||
USART1.IPParameters=VirtualMode-Asynchronous
|
||||
|
|
|
|||
|
|
@ -19,6 +19,10 @@ RawRegisterDialog::RawRegisterDialog(Device *dev, QWidget *parent) :
|
|||
{
|
||||
ui->setupUi(this);
|
||||
|
||||
// setWindowFlags(Qt::Window);
|
||||
setWindowState(windowState() & Qt::WindowMaximized);
|
||||
// showFullScreen();
|
||||
|
||||
devices.resize(dev->Info().num_directRegisterDevices);
|
||||
|
||||
connect(dev, &Device::ReceivedDirectRegisterInfo, this, &RawRegisterDialog::receivedDirectRegisterInfo);
|
||||
|
|
|
|||
|
|
@ -13,6 +13,9 @@
|
|||
<property name="windowTitle">
|
||||
<string>Device Registers</string>
|
||||
</property>
|
||||
<property name="modal">
|
||||
<bool>false</bool>
|
||||
</property>
|
||||
<layout class="QVBoxLayout" name="verticalLayout">
|
||||
<item>
|
||||
<widget class="QTabWidget" name="tabs">
|
||||
|
|
|
|||
|
|
@ -16,7 +16,7 @@ Register::Register(QString name, int address, int width)
|
|||
void Register::assignUI(QCheckBox *cb, int bitpos, bool inverted)
|
||||
{
|
||||
connect(this, &Register::valueChanged, [=](unsigned int newval) {
|
||||
bool bit = newval & (1UL << bitpos);
|
||||
bool bit = newval & (1ULL << bitpos);
|
||||
if(inverted) {
|
||||
bit = !bit;
|
||||
}
|
||||
|
|
@ -34,7 +34,7 @@ void Register::assignUI(QComboBox *cb, int pos, int width, int ui_bitoffset)
|
|||
{
|
||||
connect(this, &Register::valueChanged, [=]() {
|
||||
auto value = getValue(pos, width);
|
||||
auto mask = (1UL << width) - 1;
|
||||
auto mask = createMask(width);
|
||||
mask <<= ui_bitoffset;
|
||||
value <<= ui_bitoffset;
|
||||
auto old_gui = cb->currentIndex();
|
||||
|
|
@ -58,7 +58,7 @@ void Register::assignUI(QSpinBox *sb, int pos, int width, int ui_bitoffset)
|
|||
{
|
||||
connect(this, &Register::valueChanged, [=]() {
|
||||
auto value = getValue(pos, width);
|
||||
auto mask = (1UL << width) - 1;
|
||||
auto mask = createMask(width);
|
||||
mask <<= ui_bitoffset;
|
||||
value <<= ui_bitoffset;
|
||||
auto old_gui = sb->value();
|
||||
|
|
@ -117,28 +117,28 @@ bool Register::setFromString(QString s)
|
|||
return okay;
|
||||
}
|
||||
|
||||
unsigned long Register::getValue()
|
||||
unsigned long long Register::getValue()
|
||||
{
|
||||
return value;
|
||||
}
|
||||
|
||||
unsigned long Register::getValue(int pos, int width)
|
||||
unsigned long long Register::getValue(int pos, int width)
|
||||
{
|
||||
unsigned long mask = (1UL << width) - 1;
|
||||
unsigned long mask = createMask(width);
|
||||
mask <<= pos;
|
||||
auto masked = value & mask;
|
||||
masked >>= pos;
|
||||
return masked;
|
||||
}
|
||||
|
||||
void Register::setValue(unsigned long newval)
|
||||
void Register::setValue(unsigned long long newval)
|
||||
{
|
||||
setValue(newval, 0, width);
|
||||
}
|
||||
|
||||
void Register::setValue(unsigned long newval, int pos, int width)
|
||||
void Register::setValue(unsigned long long newval, int pos, int width)
|
||||
{
|
||||
unsigned long mask = (1UL << width) - 1;
|
||||
unsigned long long mask = createMask(width);
|
||||
newval &= mask;
|
||||
newval <<= pos;
|
||||
mask <<= pos;
|
||||
|
|
@ -160,6 +160,13 @@ Register *Register::findByAddress(std::vector<Register *> regs, int address)
|
|||
return nullptr;
|
||||
}
|
||||
|
||||
unsigned long long Register::createMask(int width)
|
||||
{
|
||||
// can't shift by 64 bits at a time (apparantly a limit of the instruction set: https://stackoverflow.com/questions/55376273/weird-result-in-left-shift-1ull-s-1-if-s-64)
|
||||
// Maximum register width is 64 for now, so shift by one less than width and then shift again by one
|
||||
return ((1ULL << (width - 1)) << 1) - 1;
|
||||
}
|
||||
|
||||
int Register::getAddress() const
|
||||
{
|
||||
return address;
|
||||
|
|
|
|||
|
|
@ -28,8 +28,8 @@ public:
|
|||
|
||||
QString hexString();
|
||||
bool setFromString(QString hex);
|
||||
unsigned long getValue();
|
||||
unsigned long getValue(int pos, int width);
|
||||
unsigned long long getValue();
|
||||
unsigned long long getValue(int pos, int width);
|
||||
QString getName() const;
|
||||
|
||||
static void fillTableWidget(QTableWidget *w, std::vector<Register*> regs);
|
||||
|
|
@ -37,16 +37,17 @@ public:
|
|||
int getAddress() const;
|
||||
|
||||
public slots:
|
||||
void setValue(unsigned long newval);
|
||||
void setValue(unsigned long newval, int pos, int width);
|
||||
void setValue(unsigned long long newval);
|
||||
void setValue(unsigned long long newval, int pos, int width);
|
||||
signals:
|
||||
void valueChanged(unsigned long newval);
|
||||
void valueChanged(unsigned long long newval);
|
||||
private:
|
||||
static Register *findByAddress(std::vector<Register*> regs, int address);
|
||||
static unsigned long long createMask(int width);
|
||||
QString name;
|
||||
int address;
|
||||
int width;
|
||||
unsigned long value;
|
||||
unsigned long long value;
|
||||
bool updating; // for preventing endless recursion when updating register/its UI connections
|
||||
};
|
||||
|
||||
|
|
|
|||
|
|
@ -3,6 +3,7 @@
|
|||
#include "max2871.h"
|
||||
#include "stw81200.h"
|
||||
#include "ad9913.h"
|
||||
#include "si5332.h"
|
||||
#include "Device/device.h"
|
||||
|
||||
RegisterDevice *RegisterDevice::create(Device *dev, int number, QString partnumber, QString name)
|
||||
|
|
@ -14,6 +15,8 @@ RegisterDevice *RegisterDevice::create(Device *dev, int number, QString partnumb
|
|||
regdev = new STW81200();
|
||||
} else if(partnumber == "AD9913") {
|
||||
regdev = new AD9913();
|
||||
} else if(partnumber == "Si5332") {
|
||||
regdev = new SI5332();
|
||||
}
|
||||
if(regdev) {
|
||||
regdev->dev = dev;
|
||||
|
|
@ -38,7 +41,7 @@ RegisterDevice::~RegisterDevice()
|
|||
delete widget;
|
||||
}
|
||||
|
||||
void RegisterDevice::setRegister(int address, unsigned long value)
|
||||
void RegisterDevice::setRegister(int address, unsigned long long value)
|
||||
{
|
||||
for(auto reg : regs) {
|
||||
if(reg->getAddress() == address) {
|
||||
|
|
|
|||
|
|
@ -14,7 +14,7 @@ public:
|
|||
static RegisterDevice *create(Device *dev, int number, QString partnumber, QString name);
|
||||
~RegisterDevice();
|
||||
|
||||
void setRegister(int address, unsigned long value);
|
||||
void setRegister(int address, unsigned long long value);
|
||||
|
||||
QWidget *getWidget() const;
|
||||
QString getPartnumber() const;
|
||||
|
|
|
|||
|
|
@ -60,10 +60,16 @@ SI5332::SI5332()
|
|||
Register::assignUI(regs, 0x35, ui->ID0_CFG_SEL, 6, 1);
|
||||
Register::assignUI(regs, 0x35, ui->HSDIV4_DIV_SEL, 4, 1);
|
||||
Register::assignUI(regs, 0x35, ui->ID1_CFG_SEL, 7, 1);
|
||||
Register::assignUI(regs, 0x35, ui->HSDIV2_DIV_SEL, 3, 1);
|
||||
Register::assignUI(regs, 0x35, ui->HSDIV0_DIV_SEL, 2, 1);
|
||||
Register::assignUI(regs, 0x35, ui->HSDIV3_DIV_SEL, 0, 1);
|
||||
Register::assignUI(regs, 0x35, ui->HSDIV0_DIV_SEL, 1, 1);
|
||||
Register::assignUI(regs, 0x35, ui->HSDIV2_DIV_SEL, 2, 1);
|
||||
Register::assignUI(regs, 0x35, ui->HSDIV0_DIV_SEL, 0, 1);
|
||||
Register::assignUI(regs, 0x35, ui->HSDIV1_DIV_SEL, 1, 1);
|
||||
|
||||
Register::assignUI(regs, 0x36, ui->ID0A_INTG, 0, 8);
|
||||
Register::assignUI(regs, 0x37, ui->ID0A_INTG, 0, 8, 8);
|
||||
Register::assignUI(regs, 0x38, ui->ID0A_RES, 0, 8);
|
||||
Register::assignUI(regs, 0x39, ui->ID0A_RES, 0, 8, 8);
|
||||
Register::assignUI(regs, 0x3A, ui->ID0A_DEN, 0, 8);
|
||||
Register::assignUI(regs, 0x3B, ui->ID0A_DEN, 0, 8, 8);
|
||||
|
||||
Register::fillTableWidget(ui->table, regs);
|
||||
|
||||
|
|
|
|||
Loading…
Reference in a new issue