From ba98f5b35e40249168a080ee69d14f82a595b48f Mon Sep 17 00:00:00 2001 From: Christian Lind Madsen Date: Sat, 17 Aug 2024 23:25:35 +0200 Subject: [PATCH] commit --- include/si5351_driver.h | 13 ++++++++++ si5351_driver.c | 56 +++++++++++++++++++++++++++++++++++++++++ 2 files changed, 69 insertions(+) diff --git a/include/si5351_driver.h b/include/si5351_driver.h index 33e491a..05f7b53 100644 --- a/include/si5351_driver.h +++ b/include/si5351_driver.h @@ -56,9 +56,20 @@ typedef enum { }si5351_ClkSource; +typedef enum { + + SI5351_PLL_A = 0, + SI5351_PLL_B = 1, + + + +}si5351_PLLs; + typedef enum { SI5351_REG_PLL_INPUT_SOURCE = 0xf0, // Reg 15 + SI5351_REG_MULTISYNTH_NA_0 = 29, + SI5351_REG_MULTISYNTH_NB_0 = 34, @@ -262,6 +273,8 @@ typedef struct{ int cm_si5351_init(si5351_driver *inst, void *i2c_transfer_inst, setGet_I2C_Event_fpt i2c_transfer_evt); uint8_t cm_si5351_getRevisionNumber(si5351_driver *inst); int cm_setInputSource(si5351_driver *inst, si5351_ClkSource clk_source); +int cm_setPLLParameters(si5351_driver *inst,si5351_PLLs sel_pll, uint32_t a, uint32_t b, uint32_t c); + #endif /* SI5351_DRIVER_INCLUDE_SI5351_DRIVER_H_ */ diff --git a/si5351_driver.c b/si5351_driver.c index a18f264..bde4b93 100644 --- a/si5351_driver.c +++ b/si5351_driver.c @@ -34,6 +34,62 @@ static int writeRegister(si5351_driver *inst,uint8_t data_addr, uint8_t *data, u return 0; } +int cm_setPLLParameters(si5351_driver *inst,si5351_PLLs sel_pll, uint32_t a, uint32_t b, uint32_t c){ + + uint32_t temp_val = 0; + + switch(sel_pll){ + + case SI5351_PLL_A: + + temp_val = (float)128 * (float)a + ((float)128 * ((float)b/(float)c)) - (float)512; + + inst->device_data.multiSynthNAParam.MSNx_P1_17_16 = (temp_val >> 15) & 0x2; + inst->device_data.multiSynthNAParam.MSNx_P1_15_8 = (temp_val >> 8) & 0xff; + inst->device_data.multiSynthNAParam.MSNx_P1_7_0 = temp_val & 0xff; + + temp_val = 0; + + temp_val = (float)128 * (float)b - (float)c * (float)128 * ((float)b/(float)c); + + inst->device_data.multiSynthNAParam.MSNx_P2_19_16 = (temp_val >> 15) & 0x4; + inst->device_data.multiSynthNAParam.MSNx_P2_15_8 = (temp_val >> 7) & 0xff; + inst->device_data.multiSynthNAParam.MSNx_P2_7_0 = temp_val & 0xff; + + inst->device_data.multiSynthNAParam.MSNx_P3_19_16 = (c >> 15) & 0x4; + inst->device_data.multiSynthNAParam.MSNx_P3_15_8 = (c >> 7) & 0xff; + inst->device_data.multiSynthNAParam.MSNx_P3_7_0 = c & 0xff; + + writeRegister(inst,SI5351_REG_MULTISYNTH_NA_0, (uint8_t*) &inst->device_data.multiSynthNAParam, sizeof(si5351_multiSynthNxParameters_t)); + break; + + case SI5351_PLL_B: + + temp_val = 128 * a + (128 * (b/c)) - 512; + + inst->device_data.multiSynthNBParam.MSNx_P1_17_16 = (temp_val >> 15) & 0x2; + inst->device_data.multiSynthNBParam.MSNx_P1_15_8 = (temp_val >> 8) & 0xff; + inst->device_data.multiSynthNBParam.MSNx_P1_7_0 = temp_val & 0xff; + + temp_val = 0; + + temp_val = 128 * b - c * (128 * (b/c)); + + inst->device_data.multiSynthNBParam.MSNx_P2_19_16 = (temp_val >> 15) & 0x4; + inst->device_data.multiSynthNBParam.MSNx_P2_15_8 = (temp_val >> 7) & 0xff; + inst->device_data.multiSynthNBParam.MSNx_P2_7_0 = temp_val & 0xff; + + inst->device_data.multiSynthNBParam.MSNx_P3_19_16 = (c >> 15) & 0x4; + inst->device_data.multiSynthNBParam.MSNx_P3_15_8 = (c >> 7) & 0xff; + inst->device_data.multiSynthNBParam.MSNx_P3_7_0 = c & 0xff; + + writeRegister(inst,SI5351_REG_MULTISYNTH_NB_0, (uint8_t*) &inst->device_data.multiSynthNBParam, sizeof(si5351_multiSynthNxParameters_t)); + break; + + } + +} + int cm_setInputSource(si5351_driver *inst, si5351_ClkSource clk_source){ switch(clk_source){