IIC驱动部分请自己编写;该驱动程序是验证通过的。

#include "si5351a_cfg.h"//===变量定义
SI5351A_HandlerType         g_SI5351ADevice0={0};
pSI5351A_HandlerType        pSI5351ADevice0=&g_SI5351ADevice0;///
//函     数:
//功     能:参数初始化
//输入参数:
//输出参数:
//说     明:
//
void SI5351A_I2C_ParamsInit(SI5351A_HandlerType* SI5351Ax)
{//---初始化参数memset(SI5351Ax->msgClockCTRL,0x4F, SI5351A_CLKOUT_CHANNEL_SIZE);//---配置参数SI5351Ax->msgIsResetPll=0;
}///
//函     数:
//功     能:
//输入参数:
//输出参数:
//说     明:
//
UINT8_T SI5351A_I2C_Device0_Init(SI5351A_HandlerType* SI5351Ax)
{SI5351Ax->msgI2C.msgI2Cx = NULL;SI5351Ax->msgI2C.msgSCL.msgGPIOPort = GPIOB;SI5351Ax->msgI2C.msgSCL.msgGPIOBit = LL_GPIO_PIN_8;SI5351Ax->msgI2C.msgSDA.msgGPIOPort = GPIOB;SI5351Ax->msgI2C.msgSDA.msgGPIOBit = LL_GPIO_PIN_9;SI5351Ax->msgI2C.msgModelIsHW = 0;SI5351Ax->msgI2C.msgPluseWidth = 1;SI5351Ax->msgI2C.msgFuncDelayus = NULL;SI5351Ax->msgI2C.msgAddr = SI5351A_WADDR;SI5351Ax->msgI2C.msgClockSpeed = 0;return OK_0;
}///
//函     数:
//功     能:
//输入参数:
//输出参数:
//说     明:
//
UINT8_T SI5351A_I2C_Device1_Init(SI5351A_HandlerType* SI5351Ax)
{return OK_0;
}///
//函     数:
//功     能:
//输入参数:
//输出参数:
//说     明:
//
UINT8_T SI5351A_I2C_Device2_Init(SI5351A_HandlerType* SI5351Ax)
{return OK_0;
}///
//函     数:
//功     能: 写单独模式
//输入参数:
//输出参数:
//说     明: 软件模拟I2C传输命令
//
UINT8_T SI5351A_SWI2C_WriteSingle(SI5351A_HandlerType* SI5351Ax, UINT8_T addr, UINT8_T val)
{UINT8_T _return = OK_0;//---启动并发送写操作_return = I2CTask_MSW_START(&(SI5351Ax->msgI2C), 1);if (_return != OK_0){//---启动写数据失败_return = ERROR_2;goto GoToExit;}//---发送寄存器地址I2CTask_MSW_SendByte(&(SI5351Ax->msgI2C), addr);//---读取ACK_return = I2CTask_MSW_ReadACK(&(SI5351Ax->msgI2C));//---判断应答if (_return){_return = ERROR_3;goto GoToExit;}//---发送寄存器数据I2CTask_MSW_SendByte(&(SI5351Ax->msgI2C), val);//---读取ACK_return = I2CTask_MSW_ReadACK(&(SI5351Ax->msgI2C));//---判断应答if (_return){_return = ERROR_3 + 1;goto GoToExit;}
GoToExit://---发送停止信号I2CTask_MSW_STOP(&(SI5351Ax->msgI2C));return _return;
}///
//函     数:
//功     能:
//输入参数:
//输出参数:
//说     明: 硬件I2C传输命令
//
UINT8_T SI5351A_HWI2C_WriteSingle(SI5351A_HandlerType* SI5351Ax, UINT8_T addr, UINT8_T val)
{return ERROR_1;
}///
//函     数:
//功     能:
//输入参数:
//输出参数:
//说     明: I2C传输命令
//
UINT8_T SI5351A_I2C_WriteSingle(SI5351A_HandlerType* SI5351Ax, UINT8_T addr, UINT8_T val)
{if (SI5351Ax->msgI2C.msgModelIsHW == 0){//---软件模拟I2Creturn SI5351A_SWI2C_WriteSingle(SI5351Ax, addr, val);}else{//---硬件I2Creturn SI5351A_HWI2C_WriteSingle(SI5351Ax, addr, val);}
}///
//函     数:
//功     能: 读单独模式
//输入参数:
//输出参数:
//说     明: 软件模拟I2C传输命令
//
UINT8_T SI5351A_SWI2C_ReadSingle(SI5351A_HandlerType* SI5351Ax, UINT8_T addr, UINT8_T* pVal)
{UINT8_T _return = OK_0;//---启动写数据_return = I2CTask_MSW_START(&(SI5351Ax->msgI2C), 1);if (_return != OK_0){//---启动写数据失败_return = ERROR_2;goto GoToExit;}//---发送寄存器地址I2CTask_MSW_SendByte(&(SI5351Ax->msgI2C), addr);//---读取ACK_return = I2CTask_MSW_ReadACK(&(SI5351Ax->msgI2C));if (_return != OK_0){//---发送数据失败_return = ERROR_3;goto GoToExit;}//---发送停止信号I2CTask_MSW_STOP(&(SI5351Ax->msgI2C));//---启动读取数据_return = I2CTask_MSW_START(&(SI5351Ax->msgI2C), 0);if (_return != OK_0){//---启动读数据失败_return = ERROR_4;goto GoToExit;}//---读取数据_return = I2CTask_MSW_ReadByte(&(SI5351Ax->msgI2C));//---发送应答信号I2CTask_MSW_SendACK(&(SI5351Ax->msgI2C), 1);if (pVal!=NULL){*pVal=_return;}_return = OK_0;//---退出入口函数
GoToExit://---发送停止信号I2CTask_MSW_STOP(&(SI5351Ax->msgI2C));return _return;
}///
//函     数:
//功     能:
//输入参数:
//输出参数:
//说     明:
//
UINT8_T SI5351A_HWI2C_ReadSingle(SI5351A_HandlerType* SI5351Ax, UINT8_T addr, UINT8_T* pVal)
{return ERROR_1;
}///
//函     数:
//功     能:
//输入参数:
//输出参数:
//说     明: I2C传输命令
//
UINT8_T SI5351A_I2C_ReadSingle(SI5351A_HandlerType* SI5351Ax, UINT8_T addr, UINT8_T* pVal)
{if (SI5351Ax->msgI2C.msgModelIsHW == 0){//---软件模拟I2Creturn SI5351A_SWI2C_ReadSingle(SI5351Ax, addr, pVal);}else{//---硬件I2Creturn SI5351A_HWI2C_ReadSingle(SI5351Ax, addr, pVal);}
}///
//函     数:
//功     能: 写Bulk模式
//输入参数:
//输出参数:
//说     明: 软件模拟I2C传输命令
//
UINT8_T SI5351A_SWI2C_WriteBulk(SI5351A_HandlerType* SI5351Ax, UINT8_T addr, UINT8_T* pVal, UINT8_T length)
{UINT8_T _return = OK_0;UINT8_T i = 0;//---启动并发送写操作_return = I2CTask_MSW_START(&(SI5351Ax->msgI2C), 1);if (_return != OK_0){//---启动写数据失败_return = ERROR_2;goto GoToExit;}//---发送地址I2CTask_MSW_SendByte(&(SI5351Ax->msgI2C), addr);//---读取ACK_return = I2CTask_MSW_ReadACK(&(SI5351Ax->msgI2C));//---判断应答if (_return){_return = ERROR_3;goto GoToExit;}//---发送数据for (i = 0; i < length; i++){//---发送数据I2CTask_MSW_SendByte(&(SI5351Ax->msgI2C), pVal[i]);//---读取ACK_return = I2CTask_MSW_ReadACK(&(SI5351Ax->msgI2C));//---判断应答if (_return){_return = ERROR_4 + i;goto GoToExit;}}//---退出入口函数
GoToExit://---发送停止信号I2CTask_MSW_STOP(&(SI5351Ax->msgI2C));return _return;
}///
//函     数:
//功     能:
//输入参数:
//输出参数:
//说     明:
//
UINT8_T SI5351A_HWI2C_WriteBulk(SI5351A_HandlerType* SI5351Ax, UINT8_T addr, UINT8_T* pVal, UINT8_T length)
{return ERROR_1;
}///
//函     数:
//功     能:
//输入参数:
//输出参数:
//说     明:
//
UINT8_T SI5351A_I2C_WriteBulk(SI5351A_HandlerType* SI5351Ax, UINT8_T addr, UINT8_T* pVal, UINT8_T length)
{if (SI5351Ax->msgI2C.msgModelIsHW == 0){//---软件模拟I2Creturn SI5351A_SWI2C_WriteBulk(SI5351Ax, addr, pVal, length);}else{//---硬件I2Creturn SI5351A_HWI2C_WriteBulk(SI5351Ax, addr, pVal,length);}
}///
//函     数:
//功     能: 读Bulk模式
//输入参数:
//输出参数:
//说     明: 软件模拟I2C传输命令
//
UINT8_T SI5351A_SWI2C_ReadBulk(SI5351A_HandlerType* SI5351Ax, UINT8_T addr, UINT8_T* pVal, UINT8_T length)
{UINT8_T _return = OK_0;UINT16_T i = 0;//---启动写数据_return = I2CTask_MSW_START(&(SI5351Ax->msgI2C), 1);if (_return != OK_0){//---启动写数据失败_return = ERROR_2;goto GoToExit;}//---发送寄存器地址I2CTask_MSW_SendByte(&(SI5351Ax->msgI2C), addr);//---读取ACK_return = I2CTask_MSW_ReadACK(&(SI5351Ax->msgI2C));if (_return != OK_0){//---发送数据失败_return = ERROR_3;goto GoToExit;}//---发送停止信号I2CTask_MSW_STOP(&(SI5351Ax->msgI2C));//---启动读取数据_return = I2CTask_MSW_START(&(SI5351Ax->msgI2C), 0);if (_return != OK_0){//---启动读数据失败_return = ERROR_4;goto GoToExit;}for (i = 0; i < length; i++){//---读取数据pVal[i] = I2CTask_MSW_ReadByte(&(SI5351Ax->msgI2C));if (i == (length - 1)){_return = 1;}//---发送应答信号I2CTask_MSW_SendACK(&(SI5351Ax->msgI2C), _return);}_return = OK_0;//---退出入口函数
GoToExit://---发送停止信号I2CTask_MSW_STOP(&(SI5351Ax->msgI2C));return _return;
}///
//函     数:
//功     能:
//输入参数:
//输出参数:
//说     明:
//
UINT8_T SI5351A_HWI2C_ReadBulk(SI5351A_HandlerType* SI5351Ax, UINT8_T addr, UINT8_T* pVal, UINT8_T length)
{return ERROR_1;
}///
//函     数:
//功     能:
//输入参数:
//输出参数:
//说     明:
//
UINT8_T SI5351A_I2C_ReadBulk(SI5351A_HandlerType* SI5351Ax, UINT8_T addr, UINT8_T* pVal, UINT8_T length)
{if (SI5351Ax->msgI2C.msgModelIsHW == 0){//---软件模拟I2Creturn SI5351A_SWI2C_ReadBulk(SI5351Ax, addr, pVal, length);}else{//---硬件I2Creturn SI5351A_HWI2C_ReadBulk(SI5351Ax, addr, pVal, length);}
}///
//fVCO is the PLL output, and must be between 600..900MHz,
//fVCO = fXTAL * (a + (b / c))
//fXTAL = the crystal input frequency
//a = an integer between 15 and 90
//b = the fractional numerator(0..1, 048, 575)
//c = the fractional denominator(1..1, 048, 575)
//////
//函     数:
//功     能:设置pll时钟
//输入参数:
//输出参数:
//说     明:
//
UINT8_T SI5351A_I2C_ConfigMSNBReg(SI5351A_HandlerType* SI5351Ax, UINT8_T regMSNAddr, UINT32_T a, UINT32_T b, UINT32_T c)
{UINT32_T p1 = 0;UINT32_T p2 = 0;UINT32_T p3 = 0;if (b == 0){p1 = (UINT32_T)(128 * a - 512);p2 = 0;p3 = c;}else{p1 = (UINT32_T)(128 * ((float)b / (float)c));p2 = (UINT32_T)(128 * b - c * p1);p1 = (UINT32_T)(128 * a + p1 - 512);p3 = c;}UINT8_T params[10];UINT8_T i = 0;UINT8_T temp;// Registers 26-27 for PLLAtemp = ((p3 >> 8) & 0xFF);params[i++] = temp;temp = (UINT8_T)(p3 & 0xFF);params[i++] = temp;// Register 28 for PLLAtemp = (UINT8_T)((p1 >> 16) & 0x03);params[i++] = temp;// Registers 29-30 for PLLAtemp = (UINT8_T)((p1 >> 8) & 0xFF);params[i++] = temp;temp = (UINT8_T)(p1 & 0xFF);params[i++] = temp;// Register 31 for PLLAtemp = (UINT8_T)((p3 >> 12) & 0xF0);temp += (UINT8_T)((p2 >> 16) & 0x0F);params[i++] = temp;// Registers 32-33 for PLLAtemp = (UINT8_T)((p2 >> 8) & 0xFF);params[i++] = temp;temp = (UINT8_T)(p2 & 0xFF);params[i++] = temp;//---写入命令return SI5351A_I2C_WriteBulk(SI5351Ax, regMSNAddr, params, i);
}//
//fOUT = fVCO / MSx
//a + b / c
//a = The integer value, which must be 4, 6 or 8 in integer mode(MSx_INT = 1)
//or 8..900 in fractional mode(MSx_INT = 0).
//b = The fractional numerator(0..1, 048, 575)
//c = The fractional denominator(1..1, 048, 575)
/////
//函     数:
//功     能:
//输入参数:
//输出参数:
//说     明:
//
UINT8_T SI5351A_I2C_ConfigMSREG(SI5351A_HandlerType* SI5351Ax, UINT8_T regMSAddr, UINT32_T pllDIV, UINT32_T clkoutDIV)
{UINT32_T p1 = 0;UINT32_T p2 = 0;UINT32_T p3 = 0;//---a=pllDIV//---b=0//---c=1p1 = (UINT32_T)(128 * pllDIV - 512);p2 = 0;p3 = 1;UINT8_T params[10];UINT8_T i = 0;UINT8_T temp;// Registers 42-43 for CLK0temp = (UINT8_T)((p3 >> 8) & 0xFF);params[i++] = temp;temp = (UINT8_T)(p3 & 0xFF);params[i++] = temp;// Register 44 for CLK0temp = ((UINT8_T)((p1 >> 16) & 0x03) | clkoutDIV);params[i++] = temp;// Registers 45-46 for CLK0temp = (UINT8_T)((p1 >> 8) & 0xFF);params[i++] = temp;temp = (UINT8_T)(p1 & 0xFF);params[i++] = temp;// Register 47 for CLK0temp = ((UINT8_T)((p3 >> 12) & 0xF0)) | ((UINT8_T)((p2 >> 16) & 0x0F));params[i++] = temp;// Registers 48-49 for CLK0temp = (UINT8_T)((p2 >> 8) & 0xFF);params[i++] = temp;temp = (UINT8_T)(p2 & 0xFF);params[i++] = temp;//---写入命令return SI5351A_I2C_WriteBulk(SI5351Ax, regMSAddr, params, i);
}///
//函     数:
//功     能:计算配置参数
//输入参数:
//输出参数:
//说     明:
//
UINT8_T SI5351A_CalcConfig(SI5351A_HandlerType* SI5351Ax, UINT8_T clkChannel, UINT64_T freq)
{UINT64_T pllFreq;UINT8_T  clkoutDIV = 0;UINT32_T a = 0;UINT32_T b = 0;UINT32_T c = 0;UINT32_T pllDIV = 0;//---输出时钟---8 KHzif (freq < 8000ULL){clkoutDIV = SI5351A_CLKOUT_DIV_128;freq <<= 7;}//---输出时钟---8-16 KHzelse if ((freq >= 8000ULL) && (freq < 16000ULL)){clkoutDIV = SI5351A_CLKOUT_DIV_64;freq <<= 6;}//---输出时钟---16-32 KHzelse if ((freq >= 16000ULL) && (freq < 32000ULL)){clkoutDIV = SI5351A_CLKOUT_DIV_32;freq <<= 5;}//---输出时钟---32-64 KHzelse if ((freq >= 32000ULL) && (freq < 64000ULL)){clkoutDIV = SI5351A_CLKOUT_DIV_16;freq <<= 4;}//---输出时钟---64-128 KHzelse if ((freq >= 64000ULL) && (freq < 128000ULL)){clkoutDIV = SI5351A_CLKOUT_DIV_8;freq <<= 3;}//---输出时钟---128-256 KHzelse if ((freq >= 128000ULL) && (freq < 256000ULL)){clkoutDIV = SI5351A_CLKOUT_DIV_4;freq <<= 2;}//---输出时钟---256-512 KHzelse if ((freq >= 256000ULL) && (freq < 512000ULL)){clkoutDIV = SI5351A_CLKOUT_DIV_2;freq <<= 1;}else{clkoutDIV = SI5351A_CLKOUT_DIV_1;}//---校验输出频率下限if (freq < SI5351A_CLKOUT_MIN_HZ){freq = SI5351A_CLKOUT_MIN_HZ;}//---校验输出频率上限if (freq > SI5351A_CLKOUT_MAX_HZ){freq = SI5351A_CLKOUT_MAX_HZ;}//---锁相环频率:900 mhz,计算锁相环的分频数Fvco;pllDIV = (UINT32_T)(900000000 / freq);//---校验界限if (pllDIV > SI5351A_MS_A_MAX){pllDIV = SI5351A_MS_A_MAX;}if (pllDIV < SI5351A_MS_A_MIN){pllDIV = SI5351A_MS_A_MIN;}//---保证分频数偶数if ((pllDIV & 0x01) != 0){pllDIV--;}//---重新计算PLL的频率pllFreq = pllDIV * freq;a = (UINT32_T)(pllFreq / SI5351A_CLK_HZ);b = (UINT32_T)(((pllFreq % SI5351A_CLK_HZ) * 1048575) / SI5351A_CLK_HZ);c = 1048575;//---校验界限if (b > SI5351A_PLL_B_MAX){b -= 1048575;a++;}//---校验界限if (a > SI5351A_PLL_A_MAX){a = SI5351A_PLL_A_MAX;}if (a < SI5351A_PLL_A_MIN){a = SI5351A_PLL_A_MIN;}clkChannel=(clkChannel > (SI5351A_CLKOUT_CHANNEL_SIZE - 1)) ? (SI5351A_CLKOUT_CHANNEL_SIZE - 1) : clkChannel;//---配置PLLASI5351A_I2C_ConfigMSNBReg(SI5351Ax, SI5351A_REG_MSNA_ADDR, a, b, c);//---配置MS,通道0的输出值clkoutDIV=SI5351A_I2C_ConfigMSREG(SI5351Ax, SI5351A_REG_MS0_ADDR + clkChannel * 18, pllDIV, clkoutDIV);//---校验是否复位PLLif (SI5351Ax->msgIsResetPll!=0){//---复位PLLclkoutDIV= SI5351A_I2C_WriteSingle(SI5351Ax, SI5351A_REG_PLL_RST_ADDR, SI5351A_PLL_RST_A);}//---使能通道CLK0输出// SI5351A_I2C_WriteSingle(SI5351Ax, SI5351A_REG_CLK0_ADDR + clkChannel, SI5351Ax->msgClockCTRL[clkChannel]);return clkoutDIV;
}///
//函     数:
//功     能:
//输入参数:
//输出参数:
//说     明:
//
UINT8_T SI5351A_I2C_Init(SI5351A_HandlerType* SI5351Ax, void(*pFuncDelayus)(UINT32_T delay), UINT8_T isHWI2C)
{UINT8_T _return = OK_0;//---参数初始化SI5351A_I2C_ParamsInit(SI5351Ax);//---选择设备参数if ((SI5351Ax != NULL) && (SI5351Ax == SI5351A_TASK_ONE)){SI5351A_I2C_Device0_Init(SI5351Ax);}else if ((SI5351Ax != NULL) && (SI5351Ax == SI5351A_TASK_TWO)){SI5351A_I2C_Device1_Init(SI5351Ax);}else if ((SI5351Ax != NULL) && (SI5351Ax == SI5351A_TASK_THREE)){SI5351A_I2C_Device2_Init(SI5351Ax);}else{return ERROR_1;}//---判断是硬件I2C还是软件I2Cif (isHWI2C){//_return= I2CTask_MHW_Init(&(WM8510x->msgI2C), pFuncDelay);SI5351Ax->msgI2C.msgModelIsHW = 1;}else{_return = I2CTask_MSW_Init(&(SI5351Ax->msgI2C), pFuncDelayus);SI5351Ax->msgI2C.msgModelIsHW = 0;}_return = SI5351A_I2C_START(SI5351Ax);return _return;
}///
//函     数:
//功     能:
//输入参数:
//输出参数:
//说     明:
//
UINT8_T SI5351A_I2C_DeInit(SI5351A_HandlerType* SI5351Ax)
{//---注销I2C设备if (SI5351Ax->msgI2C.msgModelIsHW == 1){return ERROR_1;}else{return I2CTask_MSW_DeInit(&(SI5351Ax->msgI2C));}
}///
//函     数:
//功     能:
//输入参数:
//输出参数:
//说     明:
//
UINT8_T SI5351A_I2C_START(SI5351A_HandlerType* SI5351Ax)
{//---读取ID信息UINT8_T _return = SI5351A_ReadID(SI5351Ax);if (_return==OK_0){UINT8_T temp[8]={0x80,0x80,0x80,0x00,0x00,0x00,0x00,0x00};//---复位PLLSI5351A_I2C_WriteSingle(SI5351Ax, SI5351A_REG_PLL_RST_ADDR, SI5351A_PLL_RST_B | SI5351A_PLL_RST_A);//---各通道进入PWR模式SI5351A_I2C_WriteBulk(SI5351Ax, SI5351A_REG_CLK0_ADDR,temp,3);//---设置驱动能力SI5351A_SetClockChannelIDRV(SI5351Ax,0, SI5351A_CLK_IDRV_2mA);//---变量归零处理memset(temp, 0x00, 8);SI5351A_I2C_WriteBulk(SI5351Ax, SI5351A_REG_SSC_EN_ADDR,temp,8);SI5351A_I2C_WriteBulk(SI5351Ax, 157, temp, 8);//---配置寄存器SI5351A_I2C_WriteSingle(SI5351Ax, SI5351A_REG_FANOUT_ENABLE_ADDR, 0xC0);}return _return;
}///
//函     数:
//功     能:复位PLL
//输入参数:
//输出参数:
//说     明:
//
UINT8_T SI5351A_PLLRST(SI5351A_HandlerType* SI5351Ax, UINT8_T pllIndex)
{if (pllIndex == SI5351A_PLL_RST_B){return SI5351A_I2C_WriteSingle(SI5351Ax, SI5351A_REG_PLL_RST_ADDR, SI5351A_PLL_RST_B);}else{return SI5351A_I2C_WriteSingle(SI5351Ax, SI5351A_REG_PLL_RST_ADDR, SI5351A_PLL_RST_A);}
}///
//函     数:
//功     能:读取ID信息,使用时钟内部负载电容的配置作为ID表示,默认上电之后有个初值0B11XXXXXX
//输入参数:
//输出参数:
//说     明:
//
UINT8_T SI5351A_ReadID(SI5351A_HandlerType* SI5351Ax)
{UINT8_T temp=0;UINT8_T  _return= SI5351A_I2C_ReadSingle(SI5351Ax, SI5351A_REG_CRYSTAL_LOAD_ADDR, &temp);if (_return==OK_0){temp>>=6;if ((temp&0x03)==0x03){_return=OK_0;}else{_return=ERROR_2;}}return _return;
}///
//函     数:
//功     能:
//输入参数:
//输出参数:
//说     明:
//
UINT8_T SI5351A_SetFreqHz(SI5351A_HandlerType* SI5351Ax,UINT8_T clkChannel, UINT64_T freq)
{return SI5351A_CalcConfig(SI5351Ax, clkChannel,freq);
}///
//函     数:
//功     能:
//输入参数:
//输出参数:
//说     明:
//
UINT8_T SI5351A_SetFreqKHz(SI5351A_HandlerType* SI5351Ax, UINT8_T clkChannel, float freqKHz)
{UINT64_T freq= freqKHz*1000;return SI5351A_CalcConfig(SI5351Ax, clkChannel, freq);
}///
//函     数:
//功     能:
//输入参数:
//输出参数:
//说     明:
//
UINT8_T SI5351A_SetFreqMHz(SI5351A_HandlerType* SI5351Ax, UINT8_T clkChannel, float freqMHz)
{UINT64_T freq = freqMHz * 1000000;return SI5351A_CalcConfig(SI5351Ax, clkChannel, freq);
}///
//函     数:
//功     能:设置时钟输出通道的驱动能力
//输入参数:
//输出参数:
//说     明:
//
UINT8_T SI5351A_SetClockChannelIDRV(SI5351A_HandlerType* SI5351Ax, UINT8_T clkChannel, UINT8_T idrv)
{clkChannel=((clkChannel>(SI5351A_CLKOUT_CHANNEL_SIZE-1))?(SI5351A_CLKOUT_CHANNEL_SIZE-1):clkChannel);SI5351Ax->msgClockCTRL[clkChannel]&=0xFC;SI5351Ax->msgClockCTRL[clkChannel]|=idrv;return SI5351A_I2C_WriteSingle(SI5351Ax, SI5351A_REG_CLK0_ADDR+clkChannel, SI5351Ax->msgClockCTRL[clkChannel]);
}#ifndef SI5351A_CFG_H_
#define SI5351A_CFG_H_
//
#ifdef __cplusplus
extern "C" {
#endif////===包含的头文件#include"complier_lib.h"#include "i2c_task.h"////===输入时钟频率#define SI5351A_CLK_HZ                           25000000ULL     //===锁相环的最大或者最小时钟#define SI5351A_PLL_MAX_HZ                      900000000ULL#define SI5351A_PLL_MIN_HZ                      600000000ULL//===输出的最大频率#define SI5351A_CLKOUT_MAX_HZ                    150000000ULL#define SI5351A_CLKOUT_MIN_HZ                   8000ULL//===最大输出通道数据#define SI5351A_CLKOUT_CHANNEL_SIZE              3//===寄存器地址#define SI5351A_REG_STATUS_ADDR                   0#define SI5351A_REG_CLKEN_ADDR                 3#define SI5351A_REG_CLKIN_ADDR                 15#define SI5351A_REG_CLK0_ADDR                 16          // Register definitions#define SI5351A_REG_CLK1_ADDR                    17#define SI5351A_REG_CLK2_ADDR                 18#define SI5351A_REG_CLK3_0_DISABLE_STATE_ADDR 24#define SI5351A_REG_MSNA_ADDR                 26#define SI5351A_REG_MSNB_ADDR                 34#define SI5351A_REG_MS0_ADDR                  42#define SI5351A_REG_MS1_ADDR                  50#define SI5351A_REG_MS2_ADDR                  58#define SI5351A_REG_SSC_EN_ADDR                   149#define SI5351A_REG_SSDN_P1_ADDR             153#define SI5351A_REG_VCXO_PARAME_ADDR         162#define SI5351A_REG_PLL_RST_ADDR             177#define SI5351A_REG_CRYSTAL_LOAD_ADDR            183#define SI5351A_REG_FANOUT_ENABLE_ADDR           187//===输入时钟配置      CRYSTAL_LOAD#define SI5351A_CLKIN_DIV_1                      (0<<6)#define SI5351A_CLKIN_DIV_2                     (1<<6)#define SI5351A_CLKIN_DIV_4                     (2<<6)#define SI5351A_CLKIN_DIV_8                     (3<<6)#define SI5351A_PLLB_SRC                        (1<<3)#define SI5351A_PLLA_SRC                        (1<<2)//===输出时钟控制配置#define SI5351A_CLK_PWR                         (1<<7)#define SI5351A_CLK_MS_INT                      (1<<6)#define SI5351A_CLK_MS_SRC                      (1<<5)#define SI5351A_CLK_INV                         (1<<4)#define SI5351A_CLK_SRC_MS                      (3<<2)#define SI5351A_CLK_SRC_XTAL                    (0<<2)#define SI5351A_CLK_SRC_CLKIN                   (1<<2)#define SI5351A_CLK_IDRV_2mA                    (0)#define SI5351A_CLK_IDRV_4mA                 (1)#define SI5351A_CLK_IDRV_6mA                 (2)#define SI5351A_CLK_IDRV_8mA                 (3)//===输出时钟的分频数#define SI5351A_CLKOUT_DIV_1                 (0<<4)    #define SI5351A_CLKOUT_DIV_2                    (1<<4)#define SI5351A_CLKOUT_DIV_4                    (2<<4)#define SI5351A_CLKOUT_DIV_8                    (3<<4)#define SI5351A_CLKOUT_DIV_16                   (4<<4)#define SI5351A_CLKOUT_DIV_32                   (5<<4)#define SI5351A_CLKOUT_DIV_64                   (6<<4)#define SI5351A_CLKOUT_DIV_128                  (7<<4)//===时钟输出驱动负载电容#define SI5351A_CRYSTAL_LOAD_6pF              (1<<6)|0x12#define SI5351A_CRYSTAL_LOAD_8pF               (2<<6)|0x12#define SI5351A_CRYSTAL_LOAD_10pF              (3<<6)|0x12//===复位PLL设置#define SI5351A_PLL_RST_B                       (1<<7)#define SI5351A_PLL_RST_A                       (1<<5)//---配置CLK的不使能状态//===上下限参数#define SI5351A_PLL_A_MIN                      15#define SI5351A_PLL_A_MAX                     90#define SI5351A_PLL_B_MAX                     (SI5351A_PLL_C_MAX-1)#define SI5351A_PLL_C_MAX                      1048575#define SI5351A_MS_A_MIN                     6#define SI5351A_MS_A_MAX                       1800//===写命令#define SI5351A_WADDR                            0xC0    //===读命令#define SI5351A_RADDR                            0xC1    //===结构体定义typedef struct _SI5351A_HandlerType                SI5351A_HandlerType;//===指针结构体定义typedef struct _SI5351A_HandlerType              *pSI5351A_HandlerType;//===定义结构struct _SI5351A_HandlerType{UINT8_T msgClockCTRL[SI5351A_CLKOUT_CHANNEL_SIZE];        //---CLK输出通道的配置寄存器UINT8_T msgIsResetPll;                                    //---是否配置完成之后复位PLL,1---复位,0---不复位I2C_HandlerType msgI2C;                                 //---使用的I2C设备};//===定义的任务函数#define SI5351A_TASK_ONE                      pSI5351ADevice0#define SI5351A_TASK_TWO                     0#define SI5351A_TASK_THREE                     0//===外部调用接口extern SI5351A_HandlerType                       g_SI5351ADevice0;extern pSI5351A_HandlerType                        pSI5351ADevice0;//===函数定义UINT8_T SI5351A_I2C_WriteSingle(SI5351A_HandlerType* SI5351Ax, UINT8_T addr, UINT8_T val);UINT8_T SI5351A_I2C_ReadSingle(SI5351A_HandlerType* SI5351Ax, UINT8_T addr, UINT8_T* pVal);UINT8_T SI5351A_I2C_WriteBulk(SI5351A_HandlerType* SI5351Ax, UINT8_T addr, UINT8_T* pVal, UINT8_T length);UINT8_T SI5351A_I2C_ReadBulk(SI5351A_HandlerType* SI5351Ax, UINT8_T addr, UINT8_T* pVal, UINT8_T length);UINT8_T SI5351A_I2C_Init(SI5351A_HandlerType* SI5351Ax, void(*pFuncDelayus)(UINT32_T delay), UINT8_T isHWI2C);UINT8_T SI5351A_I2C_DeInit(SI5351A_HandlerType* SI5351Ax);UINT8_T SI5351A_I2C_START(SI5351A_HandlerType* SI5351Ax);UINT8_T SI5351A_PLLRST(SI5351A_HandlerType* SI5351Ax, UINT8_T clkChannel);UINT8_T SI5351A_ReadID(SI5351A_HandlerType* SI5351Ax);UINT8_T SI5351A_SetFreqHz(SI5351A_HandlerType* SI5351Ax, UINT8_T clkChannel, UINT64_T freq);UINT8_T SI5351A_SetFreqKHz(SI5351A_HandlerType* SI5351Ax, UINT8_T clkChannel, float freqKHz);UINT8_T SI5351A_SetFreqMHz(SI5351A_HandlerType* SI5351Ax, UINT8_T clkChannel, float freqMHz);UINT8_T SI5351A_SetClockChannelIDRV(SI5351A_HandlerType* SI5351Ax, UINT8_T clkChannel, UINT8_T idrv);//
#ifdef __cplusplus
}
#endif
//
#endif /*SI5351A_CFG_H_ */

SI5351A的信号发生器驱动程序相关推荐

  1. 咚咚咚————【封装驱动】Si5351A方波信号发生器发送任意(8K-160Mhz)频率程序

    咚咚咚----[封装驱动]Si5351A方波信号发生器发送任意[8K-160Mhz]频率程序 (一)效果展示 (二)源码分享 (三)需要改进的地方及不足 (使用阿波罗STM32F7开发板) (一)效果 ...

  2. windows 编写的硬件驱动_哪个是PXI硬件合适的设备驱动程序?VISA还是IVI?

    理想的测试系统可以认为是其组成部分的总和,包括测量和激励硬件,信号切换,电缆以及可能 的大规模互连系统,UUT电源,外部PC或嵌入式控制器,操作系统(OS)和编程环境.每个部件根据诸如UUT测试参数, ...

  3. 单片机 信号发生器(DAC0832)

    单片机 信号发生器(DAC0832) 一.简述 采用DAC0832芯片设计一个正弦波信号发生器.(数字信号转为模拟信号) 例子打包:链接: https://pan.baidu.com/s/1CwFNg ...

  4. DDS信号发生器原理与经典DDS信号发生器设计方案

    DDS信号发生器采用直接数字频率合成(Direct Digital Synthesis,简称DDS)技术,把信号发生器的频率稳定度.准确度提高到与基准频率相同的水平,并且可以在很宽的频率范围内进行精细 ...

  5. 基于 FPGA 的便携式 DDS 信号发生器与示波器

    基于 FPGA 的便携式 DDS 信号发生器与示波器 项目来源:2019年第三届全国大学生FPGA创新设计竞赛 一.设计概述 1.1 设计目的 利用赛灵思公司 A7 系列板卡 EG01.AD9226 ...

  6. 基于Labview的信号发生器的设计 [转】

    基于Labview的信号发生器的设计 目录 1 .引    言... 2 1.1 Labview开发平台... 4 1.1.1  程序前面板... 5 1.1.2  框图程序... 5 1.1.3  ...

  7. 基于Labview的信号发生器的设计

    目录 1 .引    言... 2 1.1 Labview开发平台... 4 1.1.1  程序前面板... 5 1.1.2  框图程序... 5 1.1.3  图标/连接器... 5 1.1.4  ...

  8. STC51单片机-多功能信号发生器设计-物联网应用系统设计项目开发

    目录 一.说明 二.重点 三.实现 四.下载 一.说明 信号发生器是一种能提供各种频率.波形和输出电平电信号的设备.在测量各种电信系统或电信设备的振幅特性.频率特性.传输特性及其它电参数时,以及测量元 ...

  9. STC8单片机驱动DDS信号发生器AD9850扫频

    STC8单片机驱动DDS信号发生器AD9850扫频 本程序为2019年电子设计竞赛D题扫频部分改编,拿来备战一下2021年电赛,练一下手.使用STC8H8K64U/STC8G2K64单片机驱动DDS芯 ...

最新文章

  1. 什么是三层架构?简单的介绍三层架构!
  2. jvm:运行时数据区--操作数栈
  3. 系统调用与软件中断SWI的实现
  4. 以后再也不去字节面试了…
  5. react取消捕获_React 面试指南 (上)
  6. php金额类,PHP类-人民币金额转大写
  7. 数字图像处理学习笔记(三):ORB算法(尺度不变特征变换)Oriented FAST and Rotated BRIEF
  8. strip string java_Java StringUtils.strip方法代码示例
  9. poj 3026 Borg Maze (最小生成树+bfs)
  10. PTA编程总结3:抓老鼠
  11. python for loop步进值_Python for 循环语句
  12. django框架搭建网页后台,运行后网页打不开的解决方法--windows系统下
  13. MyBatis中foreach的用法
  14. 深度学习Tir-Hi3559A使用unbuntu系统
  15. 【转载】使用Winrar对压缩文件进行加密,并且给定解压密码
  16. RFC 2544阅读笔记
  17. 浅述狭义相对论的钟慢效应和尺缩效应
  18. 202000 - AlphaGo如何进化为孤独求败?
  19. 树莓派 Pico ADC温度测量
  20. Vue——构造内嵌登录二维码

热门文章

  1. HbuilderX 小程序转快应用
  2. [vijos P1391] 想越狱的小杉
  3. Linux 部署开源WAF模块 ModSecurity
  4. 计算机boot进入u盘启动,戴尔服务器怎么进入u盘启动模式 选择oneshotbios
  5. 使用ant将flash air游戏编译和打包
  6. web前端框架——一些简单理解
  7. graphpad画生存曲线怎么样去掉删失点_Graphpad Prism 绘制散点图
  8. NAND512W3A2SZA6E停产物料替代AFND1208U1-CKA
  9. 计算机主机的光驱怎么打开,笔记本电脑光驱,教您笔记本光驱怎么打开
  10. Beats:为 Filebeat 配置 inputs