Files
si5351_driver/si5351_driver.c
Christian Lind Madsen 1d1a65c475 commit
2024-11-01 16:52:24 +01:00

146 lines
4.0 KiB
C

/*
* si5351_driver.c
*
* Created on: 16. aug. 2024
* Author: Christian L. V. Madsen (OZ1CM)
*/
#include "include/si5351_driver.h"
enum{
SI5351_I2C_GET = 0,
SI5351_I2C_SET = 1,
};
static int readRegister(si5351_driver *inst,uint8_t data_addr, uint8_t *data, uint32_t len){
// Write what kind of addr we would like to read from:
inst->i2c_transfer_evt(inst->i2c_transfer_inst,&data_addr,1, SI5351_I2C_SET);
// Read data:
inst->i2c_transfer_evt(inst->i2c_transfer_inst,data,len, SI5351_I2C_GET);
return 0;
}
static int writeRegister(si5351_driver *inst,uint8_t data_addr, uint8_t *data, uint32_t len){
// Write what kind of addr we would like to read from:
inst->i2c_transfer_evt(inst->i2c_transfer_inst,&data_addr,1, SI5351_I2C_SET);
// Write data:
inst->i2c_transfer_evt(inst->i2c_transfer_inst,data,len, SI5351_I2C_SET);
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;
}
return 0;
}
int cm_setInputSource(si5351_driver *inst, si5351_ClkSource clk_source){
switch(clk_source){
case SI5351_CLK_SOURCE_XTAL:
inst->device_data.pllInputSource.PLLA_SRC = 1;
break;
case SI5351_CLK_SOURCE_CLOCKSOURCE:
inst->device_data.pllInputSource.PLLA_SRC = 0;
break;
default:
break;
}
// Write to register:
writeRegister(inst,SI5351_REG_PLL_INPUT_SOURCE, (uint8_t*) &inst->device_data.pllInputSource, sizeof(si5351_PLLInputSource_t));
return 0;
}
uint8_t cm_si5351_getRevisionNumber(si5351_driver *inst){
// Read Device Status register:
readRegister(inst,0x00, (uint8_t *) &inst->device_data.deviceStatus, sizeof(si5351_deviceStat_t));
return inst->device_data.deviceStatus.REVID;
}
int cm_si5351_init(si5351_driver *inst, void *i2c_transfer_inst, setGet_I2C_Event_fpt i2c_transfer_evt){
if(inst == NULL)return -1;
if(i2c_transfer_inst == NULL)return -1;
if(i2c_transfer_evt == NULL)return -1;
inst->i2c_transfer_inst = i2c_transfer_inst;
inst->i2c_transfer_evt = i2c_transfer_evt;
int ret = 0;
// SW Reset device.
//ret = cm_ltr390_SWreset(inst);
// ret = ltr390_readAllReg(inst);
return ret;
}