diff --git a/include/si5351_driver.h b/include/si5351_driver.h index 6424e05..76c9882 100644 --- a/include/si5351_driver.h +++ b/include/si5351_driver.h @@ -335,6 +335,7 @@ 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); int cm_setOutputMultiSynth(si5351_driver *inst,si5351_Outputs clk_output, uint32_t d, uint32_t e, uint32_t f); +int cm_setOutputMultiSynthRaw(si5351_driver *inst,si5351_Outputs clk_output, uint32_t MSx_P1, uint32_t MSx_P2, uint32_t MSx_P3); int cm_setOutputEnable(si5351_driver *inst,si5351_Outputs clk_output, si5351_Outputs_state outputState); int cm_setCLKControl(si5351_driver *inst, si5351_Outputs clk_output, si5351_CLK_PDN clk_pdn); int cm_resetPLLs(si5351_driver *inst, uint8_t reset_PLLA, uint8_t reset_PLLB); diff --git a/si5351_driver.c b/si5351_driver.c index 73b31b0..213866d 100644 --- a/si5351_driver.c +++ b/si5351_driver.c @@ -108,6 +108,53 @@ int cm_setPllParamRaw(si5351_driver *inst, si5351_PLLs sel_pll, uint32_t MSNx_P1 return 0; } +int cm_setOutputMultiSynthRaw(si5351_driver *inst,si5351_Outputs clk_output, uint32_t MSx_P1, uint32_t MSx_P2, uint32_t MSx_P3){ + + switch(clk_output){ + + case SI5351_OUTPUT_0: + inst->device_data.multiSynth0Param.MSx_P1_17_16 = (MSx_P1 >> 16) & 0x3; // last division.. + inst->device_data.multiSynth0Param.MSx_P1_15_8 = (MSx_P1 >> 8) & 0xff; + inst->device_data.multiSynth0Param.MSx_P1_7_0 = MSx_P1 & 0xff; + + inst->device_data.multiSynth0Param.MSx_P2_19_16 = (MSx_P2 >> 16) & 0x3; + inst->device_data.multiSynth0Param.MSx_P2_15_8 = (MSx_P2 >> 8) & 0xff; + inst->device_data.multiSynth0Param.MSx_P2_7_0 = MSx_P2 & 0xff; + + inst->device_data.multiSynth0Param.MSx_P3_19_16 = (MSx_P3 >> 12) & 0x3; + inst->device_data.multiSynth0Param.MSx_P3_15_8 = (MSx_P3 >> 8) & 0xff; + inst->device_data.multiSynth0Param.MSx_P3_7_0 = MSx_P3 & 0xff; + + writeRegister(inst,SI5351_REG_MULTISYNTH_OUT_0, (uint8_t*) &inst->device_data.multiSynth0Param, sizeof(si5351_multiSynthxParameters_t)); + + break; + + case SI5351_OUTPUT_1: + inst->device_data.multiSynth1Param.MSx_P1_17_16 = (MSx_P1 >> 16) & 0x3; // last division.. + inst->device_data.multiSynth1Param.MSx_P1_15_8 = (MSx_P1 >> 8) & 0xff; + inst->device_data.multiSynth1Param.MSx_P1_7_0 = MSx_P1 & 0xff; + + inst->device_data.multiSynth1Param.MSx_P2_19_16 = (MSx_P2 >> 16) & 0x3; + inst->device_data.multiSynth1Param.MSx_P2_15_8 = (MSx_P2 >> 8) & 0xff; + inst->device_data.multiSynth1Param.MSx_P2_7_0 = MSx_P2 & 0xff; + + inst->device_data.multiSynth1Param.MSx_P3_19_16 = (MSx_P3 >> 12) & 0x3; + inst->device_data.multiSynth1Param.MSx_P3_15_8 = (MSx_P3 >> 8) & 0xff; + inst->device_data.multiSynth1Param.MSx_P3_7_0 = MSx_P3 & 0xff; + + writeRegister(inst,SI5351_REG_MULTISYNTH_OUT_1, (uint8_t*) &inst->device_data.multiSynth1Param, sizeof(si5351_multiSynthxParameters_t)); + break; + + default: + break; + + + } + + 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;