#include "stm32f0xx.h" #include "main.h" #include "lmx2595.h" uint16_t debug_outen=0; _LMX2595_REG lmx; static LMX_MAP_T sLMX_MAP_T = { //sck { GPIOA, LL_GPIO_PIN_5, }, //sdi { GPIOA, LL_GPIO_PIN_7, }, //csb { GPIOA, LL_GPIO_PIN_4, }, //ldo { GPIOA, LL_GPIO_PIN_6, } }; unsigned char gLmxLdSta = 0x00; static void DELAY_Nop(uint32_t num) { while(num--) { __NOP(); } } void Lmx_CSB_SET(void) { LL_GPIO_SetOutputPin(sLMX_MAP_T.CSB.gpio, sLMX_MAP_T.CSB.gpio_pin); } void Lmx_CSB_RESET(void) { LL_GPIO_ResetOutputPin(sLMX_MAP_T.CSB.gpio, sLMX_MAP_T.CSB.gpio_pin); } void Lmx_SCK_SET(void) { LL_GPIO_SetOutputPin(sLMX_MAP_T.SCK.gpio, sLMX_MAP_T.SCK.gpio_pin); } void Lmx_SCK_RESET(void) { LL_GPIO_ResetOutputPin(sLMX_MAP_T.SCK.gpio, sLMX_MAP_T.SCK.gpio_pin); } void Lmx_SDI_SET(void) { LL_GPIO_SetOutputPin(sLMX_MAP_T.SDI.gpio, sLMX_MAP_T.SDI.gpio_pin); } void Lmx_SDI_RESET(void) { LL_GPIO_ResetOutputPin(sLMX_MAP_T.SDI.gpio, sLMX_MAP_T.SDI.gpio_pin); } uint8_t spi_8bit(uint8_t dat) { uint8_t rCtrlSpiCodeB; uint8_t i; uint8_t B_Miso = 0x00; rCtrlSpiCodeB = dat; for(i=0;i<8;i++) { B_Miso = (B_Miso<<0x01); if((rCtrlSpiCodeB&0x80) == 0x00) { Lmx_SDI_RESET(); } else { Lmx_SDI_SET(); } Lmx_SCK_RESET(); DELAY_Nop(100); Lmx_SCK_SET(); DELAY_Nop(100); //上升沿后微小延时,读取MISO数据// B_Miso = (LL_GPIO_ReadInputPort(sLMX_MAP_T.LDO.gpio) & (0x01<< 6)); Lmx_SCK_RESET(); rCtrlSpiCodeB = (rCtrlSpiCodeB<<1); } return B_Miso; } uint16_t spi_16bit(uint16_t dat) { uint16_t rCtrlSpiCodeW; uint8_t i; uint16_t W_Miso = 0x00; rCtrlSpiCodeW = dat; for(i=0;i<16;i++) { W_Miso = (W_Miso<<0x0001); if((rCtrlSpiCodeW&0x8000) == 0x0000) { Lmx_SDI_RESET(); } else { Lmx_SDI_SET(); } Lmx_SCK_RESET(); DELAY_Nop(100); Lmx_SCK_SET(); //上升沿后微小延时,读取MISO数据// W_Miso = (W_Miso | (LL_GPIO_ReadInputPort(sLMX_MAP_T.LDO.gpio)& (0x01<<6))); DELAY_Nop(100); Lmx_SCK_RESET(); rCtrlSpiCodeW = (rCtrlSpiCodeW<<1); } return W_Miso; } //对器件进行读操作,输入为寄存器地址,返回读出的数据// uint16_t lmxRead(uint8_t regadr) { uint16_t rddat; regadr = regadr|0x80; //将寄存器地址最高位置1,确保为读操作// Lmx_CSB_RESET(); //片选信号拉低// DELAY_Nop(50); Lmx_SCK_RESET(); DELAY_Nop(50); spi_8bit(regadr); //送出地址// rddat=spi_16bit(0); //送出16位无效数据,用于回读寄存器数据// DELAY_Nop(50); Lmx_CSB_SET(); //片选失效// return rddat; } void LmxWrite(uint8_t regadr,uint16_t dat) { regadr=regadr&0x7f; //将寄存器地址最高位置0,确保为写操作// Lmx_CSB_RESET(); //片选信号拉低// DELAY_Nop(50); Lmx_SCK_RESET(); DELAY_Nop(50); spi_8bit(regadr); //送出地址// spi_16bit(dat); //送出数据// DELAY_Nop(50); Lmx_CSB_SET(); //片选失效// } void LmxPortReset(void) { Lmx_CSB_SET(); //片选失效// Lmx_SCK_RESET(); Lmx_SDI_RESET(); } void Lmx_PortIntit(void) { LL_GPIO_InitTypeDef GPIO_InitStruct = {0}; GPIO_InitStruct.Pin = LL_GPIO_PIN_2; GPIO_InitStruct.Mode = LL_GPIO_MODE_OUTPUT; GPIO_InitStruct.Speed = LL_GPIO_SPEED_FREQ_HIGH; GPIO_InitStruct.OutputType = LL_GPIO_OUTPUT_PUSHPULL; GPIO_InitStruct.Pull = LL_GPIO_PULL_UP; LL_GPIO_Init(GPIOA, &GPIO_InitStruct); GPIO_InitStruct.Pin = LL_GPIO_PIN_3; GPIO_InitStruct.Mode = LL_GPIO_MODE_OUTPUT; GPIO_InitStruct.Speed = LL_GPIO_SPEED_FREQ_HIGH; GPIO_InitStruct.OutputType = LL_GPIO_OUTPUT_PUSHPULL; GPIO_InitStruct.Pull = LL_GPIO_PULL_UP; LL_GPIO_Init(GPIOA, &GPIO_InitStruct); GPIO_InitStruct.Pin = LL_GPIO_PIN_4; GPIO_InitStruct.Mode = LL_GPIO_MODE_OUTPUT; GPIO_InitStruct.Speed = LL_GPIO_SPEED_FREQ_HIGH; GPIO_InitStruct.OutputType = LL_GPIO_OUTPUT_PUSHPULL; GPIO_InitStruct.Pull = LL_GPIO_PULL_UP; LL_GPIO_Init(GPIOA, &GPIO_InitStruct); GPIO_InitStruct.Pin = LL_GPIO_PIN_5; GPIO_InitStruct.Mode = LL_GPIO_MODE_OUTPUT; GPIO_InitStruct.Speed = LL_GPIO_SPEED_FREQ_HIGH; GPIO_InitStruct.OutputType = LL_GPIO_OUTPUT_PUSHPULL; GPIO_InitStruct.Pull = LL_GPIO_PULL_UP; LL_GPIO_Init(GPIOA, &GPIO_InitStruct); GPIO_InitStruct.Pin = LL_GPIO_PIN_6; GPIO_InitStruct.Mode = LL_GPIO_MODE_INPUT; GPIO_InitStruct.Speed = LL_GPIO_SPEED_FREQ_LOW; GPIO_InitStruct.Pull = LL_GPIO_PULL_UP; LL_GPIO_Init(GPIOA, &GPIO_InitStruct); GPIO_InitStruct.Pin = LL_GPIO_PIN_7; GPIO_InitStruct.Mode = LL_GPIO_MODE_OUTPUT; GPIO_InitStruct.Speed = LL_GPIO_SPEED_FREQ_HIGH; GPIO_InitStruct.OutputType = LL_GPIO_OUTPUT_PUSHPULL; GPIO_InitStruct.Pull = LL_GPIO_PULL_UP; LL_GPIO_Init(GPIOA, &GPIO_InitStruct); LmxPortReset(); } void SetLmxParameter(void) { lmx.LMX_R70.All= 0x0000; lmx.LMX_R69.All= 0x0000; lmx.LMX_R68.All= 0x0089; lmx.LMX_R64.All= 0x0377; lmx.LMX_R62.All= 0x0000; lmx.LMX_R61.All= 0x0001; lmx.LMX_R59.All= 0x0000; lmx.LMX_R48.All= 0x03FC; lmx.LMX_R47.All= 0x08D4; lmx.LMX_R46.All= 0x1E21; lmx.LMX_R45.All= 0x0000; lmx.LMX_R44.All= 0x0000; lmx.LMX_R43.All= 0x0008; lmx.LMX_R42.All= 0x0000; lmx.LMX_R41.All= 0x0001; lmx.LMX_R40.All= 0x0000; lmx.LMX_R39.All= 0x8104; lmx.LMX_R38.All= 0x0960; lmx.LMX_R37.All= 0x5000; lmx.LMX_R36.All= 0x0821; lmx.LMX_R35.All= 0x109F; lmx.LMX_R34.All= 0xC3EA; lmx.LMX_R33.All= 0x2A0A; lmx.LMX_R32.All= 0x210A; lmx.LMX_R31.All= 0x0401; lmx.LMX_R30.All= 0x0034; lmx.LMX_R29.All= 0x0084; lmx.LMX_R28.All= 0x2924; lmx.LMX_R25.All= 0x0000; lmx.LMX_R24.All= 0x0509; lmx.LMX_R23.All= 0x8842; lmx.LMX_R22.All= 0x2300; lmx.LMX_R20.All= 0x012C; lmx.LMX_R19.All= 0x0965; lmx.LMX_R14.All= 0x0318; lmx.LMX_R13.All= 0x4003; lmx.LMX_R12.All= 0x700A; lmx.LMX_R11.All= 0x0018; lmx.LMX_R10.All= 0x10D8; lmx.LMX_R9.All =0x0302; lmx.LMX_R8.All =0x1084; lmx.LMX_R7.All =0x28B2; lmx.LMX_R4.All =0x0C43; lmx.LMX_R2.All =0x0500; lmx.LMX_R1.All =0x080A; lmx.LMX_R0.All =0x2278; /* lmx.LMX_R112.All = 0x0000; lmx.LMX_R111.All = 0x0000; lmx.LMX_R110.All = 0x0000; lmx.LMX_R109.All = 0x0000; lmx.LMX_R108.All = 0x0000; lmx.LMX_R107.All = 0x0000; lmx.LMX_R106.All = 0x0000; lmx.LMX_R105.All = 0x0021; lmx.LMX_R104.All = 0x0000; lmx.LMX_R103.All = 0x0000; lmx.LMX_R102.All = 0x3F80; lmx.LMX_R101.All = 0x0011; lmx.LMX_R100.All = 0x0000; lmx.LMX_R99.All = 0x0000 ; lmx.LMX_R98.All = 0x0200 ; lmx.LMX_R97.All = 0x0888 ; lmx.LMX_R96.All = 0x0000 ; lmx.LMX_R95.All = 0x0000 ; lmx.LMX_R94.All = 0x0000 ; lmx.LMX_R93.All = 0x0000 ; lmx.LMX_R92.All = 0x0000 ; lmx.LMX_R91.All = 0x0000 ; lmx.LMX_R90.All = 0x0000 ; lmx.LMX_R89.All = 0x0000 ; lmx.LMX_R88.All = 0x0000 ; lmx.LMX_R87.All = 0x0000 ; lmx.LMX_R86.All = 0xFFFF ; lmx.LMX_R85.All = 0xD2FF ; lmx.LMX_R84.All = 0x0001 ; lmx.LMX_R83.All = 0x0000 ; lmx.LMX_R82.All = 0x1E00 ; lmx.LMX_R81.All = 0x0000 ; lmx.LMX_R80.All = 0x6666 ; lmx.LMX_R79.All = 0x0026 ; lmx.LMX_R78.All = 0x0003 ; lmx.LMX_R77.All = 0x0000 ; lmx.LMX_R76.All = 0x000C ; lmx.LMX_R75.All = 0x0B80 ; lmx.LMX_R74.All = 0x0000 ; lmx.LMX_R73.All = 0x003F ; lmx.LMX_R72.All = 0x0001 ; lmx.LMX_R71.All = 0x0081 ; lmx.LMX_R70.All = 0xC350 ; lmx.LMX_R69.All = 0x0000 ; lmx.LMX_R68.All = 0x03E8 ; lmx.LMX_R67.All = 0x0000 ; lmx.LMX_R66.All = 0x01F4 ; lmx.LMX_R65.All = 0x0000 ; lmx.LMX_R64.All = 0x1388 ; lmx.LMX_R63.All = 0x0000 ; lmx.LMX_R62.All = 0x0322 ; lmx.LMX_R61.All = 0x00A8 ; lmx.LMX_R60.All = 0x0000 ; lmx.LMX_R59.All = 0x0001 ; lmx.LMX_R58.All = 0x9001 ; lmx.LMX_R57.All = 0x0020 ; lmx.LMX_R56.All = 0x0000 ; lmx.LMX_R55.All = 0x0000 ; lmx.LMX_R54.All = 0x0000 ; lmx.LMX_R53.All = 0x0000 ; lmx.LMX_R52.All = 0x0820 ; lmx.LMX_R51.All = 0x0080 ; lmx.LMX_R50.All = 0x0000 ; lmx.LMX_R49.All = 0x4180 ; lmx.LMX_R48.All = 0x0300 ; lmx.LMX_R47.All = 0x0300 ; lmx.LMX_R46.All = 0x07FC ; lmx.LMX_R45.All = 0xC0FC ; lmx.LMX_R44.All = 0x1FE3 ; lmx.LMX_R43.All = 0x0000 ; lmx.LMX_R42.All = 0x0000 ; lmx.LMX_R41.All = 0x0000 ; lmx.LMX_R40.All = 0x0000 ; lmx.LMX_R39.All = 0x0001 ; lmx.LMX_R38.All = 0x0000 ; lmx.LMX_R37.All = 0x8304 ; lmx.LMX_R36.All = 0x0300 ; lmx.LMX_R35.All = 0x0004 ; lmx.LMX_R34.All = 0x0000 ; lmx.LMX_R33.All = 0x1E21 ; lmx.LMX_R32.All = 0x0393 ; lmx.LMX_R31.All = 0x43EC ; lmx.LMX_R30.All = 0x318C ; lmx.LMX_R29.All = 0x318C ; lmx.LMX_R28.All = 0x0488 ; lmx.LMX_R27.All = 0x0002 ; lmx.LMX_R26.All = 0x0DB0 ; lmx.LMX_R25.All = 0x0C2B ; lmx.LMX_R24.All = 0x071A ; lmx.LMX_R23.All = 0x007C ; lmx.LMX_R22.All = 0x0001 ; lmx.LMX_R21.All = 0x0401 ; lmx.LMX_R20.All = 0xE048 ; lmx.LMX_R19.All = 0x27B7 ; lmx.LMX_R18.All = 0x0064 ; lmx.LMX_R17.All = 0x012C ; lmx.LMX_R16.All = 0x0080 ; lmx.LMX_R15.All = 0x064F ; lmx.LMX_R14.All = 0x1E70 ; //0x1E30:1.2mA 0x1E70: 1.5mA lmx.LMX_R13.All = 0x4000 ; lmx.LMX_R12.All = 0x5001 ; lmx.LMX_R11.All = 0x0018 ; lmx.LMX_R10.All = 0x10D8 ; lmx.LMX_R9.All = 0x0604 ; lmx.LMX_R8.All = 0x2000 ; lmx.LMX_R7.All = 0x40B2 ; lmx.LMX_R6.All = 0xC802 ; lmx.LMX_R5.All = 0x00C8 ; lmx.LMX_R4.All = 0x0A43 ; lmx.LMX_R3.All = 0x0642 ; lmx.LMX_R2.All = 0x0500 ; lmx.LMX_R1.All = 0x0800 ; lmx.LMX_R0.All = 0x2418 ; */ } void SetLmxFreq(void) { LmxWrite(0,0x0002);//reset device LL_mDelay(50); /* LmxWrite(112,lmx.LMX_R112.All); LmxWrite(111,lmx.LMX_R111.All); LmxWrite(110,lmx.LMX_R110.All); LmxWrite(109,lmx.LMX_R109.All); LmxWrite(108,lmx.LMX_R108.All); LmxWrite(107,lmx.LMX_R107.All); LmxWrite(106,lmx.LMX_R106.All); LmxWrite(105,lmx.LMX_R105.All); LmxWrite(104,lmx.LMX_R104.All); LmxWrite(103,lmx.LMX_R103.All); LmxWrite(102,lmx.LMX_R102.All); LmxWrite(101,lmx.LMX_R101.All); LmxWrite(100,lmx.LMX_R100.All); LmxWrite(99,lmx.LMX_R99.All); LmxWrite(98,lmx.LMX_R98.All); LmxWrite(97,lmx.LMX_R97.All); LmxWrite(96,lmx.LMX_R96.All); LmxWrite(95,lmx.LMX_R95.All); LmxWrite(94,lmx.LMX_R94.All); LmxWrite(93,lmx.LMX_R93.All); LmxWrite(92,lmx.LMX_R92.All); LmxWrite(91,lmx.LMX_R91.All); LmxWrite(90,lmx.LMX_R90.All); LmxWrite(89,lmx.LMX_R89.All); LmxWrite(88,lmx.LMX_R88.All); LmxWrite(87,lmx.LMX_R87.All); LmxWrite(86,lmx.LMX_R86.All); LmxWrite(85,lmx.LMX_R85.All); LmxWrite(84,lmx.LMX_R84.All); LmxWrite(83,lmx.LMX_R83.All); LmxWrite(82,lmx.LMX_R82.All); LmxWrite(81,lmx.LMX_R81.All); LmxWrite(80,lmx.LMX_R80.All); LmxWrite(79,lmx.LMX_R79.All); LmxWrite(78,lmx.LMX_R78.All); LmxWrite(77,lmx.LMX_R77.All); LmxWrite(76,lmx.LMX_R76.All); LmxWrite(75,lmx.LMX_R75.All); LmxWrite(74,lmx.LMX_R74.All); LmxWrite(73,lmx.LMX_R73.All); LmxWrite(72,lmx.LMX_R72.All); LmxWrite(71,lmx.LMX_R71.All); */ LmxWrite(70,lmx.LMX_R70.All); LmxWrite(69,lmx.LMX_R69.All); LmxWrite(68,lmx.LMX_R68.All); LmxWrite(64,lmx.LMX_R64.All); LmxWrite(62,lmx.LMX_R62.All); LmxWrite(61,lmx.LMX_R61.All); LmxWrite(59,lmx.LMX_R59.All); LmxWrite(48,lmx.LMX_R48.All); LmxWrite(47,lmx.LMX_R47.All); LmxWrite(46,lmx.LMX_R46.All); LmxWrite(45,lmx.LMX_R45.All); LmxWrite(44,lmx.LMX_R44.All); LmxWrite(43,lmx.LMX_R43.All); LmxWrite(42,lmx.LMX_R42.All); LmxWrite(41,lmx.LMX_R41.All); LmxWrite(40,lmx.LMX_R40.All); LmxWrite(39,lmx.LMX_R39.All); LmxWrite(38,lmx.LMX_R38.All); LmxWrite(37,lmx.LMX_R37.All); LmxWrite(36,lmx.LMX_R36.All); LmxWrite(35,lmx.LMX_R35.All); LmxWrite(34,lmx.LMX_R34.All); LmxWrite(33,lmx.LMX_R33.All); LmxWrite(32,lmx.LMX_R32.All); LmxWrite(31,lmx.LMX_R31.All); LmxWrite(30,lmx.LMX_R30.All); LmxWrite(29,lmx.LMX_R29.All); LmxWrite(28,lmx.LMX_R28.All); LmxWrite(25,lmx.LMX_R25.All); LmxWrite(24,lmx.LMX_R24.All); LmxWrite(23,lmx.LMX_R23.All); LmxWrite(22,lmx.LMX_R22.All); LmxWrite(21,lmx.LMX_R21.All); LmxWrite(20,lmx.LMX_R20.All); LmxWrite(19,lmx.LMX_R19.All); LmxWrite(14,lmx.LMX_R14.All); LmxWrite(13,lmx.LMX_R13.All); LmxWrite(12,lmx.LMX_R12.All); LmxWrite(11,lmx.LMX_R11.All); LmxWrite(10,lmx.LMX_R10.All); LmxWrite(9,lmx.LMX_R9.All); LmxWrite(8,lmx.LMX_R8.All); LmxWrite(7,lmx.LMX_R7.All); LmxWrite(3,lmx.LMX_R3.All); LmxWrite(2,lmx.LMX_R2.All); LmxWrite(1,lmx.LMX_R1.All); LmxWrite(0,lmx.LMX_R0.All); DELAY_Nop(500000); LmxWrite(0,lmx.LMX_R0.All); } //check LD //configure the register again,when check the LD is low void ConfigLmxAgain(void) { uint8_t LmxLdSta = 0x00; static uint8_t sChkLdDone = 0x00; gLmxLdSta = LL_GPIO_ReadInputPort(sLMX_MAP_T.LDO.gpio) &( 0x01 << sLMX_MAP_T.LDO.gpio_pin); //if(sChkLdDone != 0x00) //return; LmxLdSta = LL_GPIO_ReadInputPort(sLMX_MAP_T.LDO.gpio) & (0x01<9800){ } else if(freq>7100){ *chdiv_num = 1; //disable chdiv *vco_doubler=1;//enable vco doubler *vco_level=0; } else if(freq>6500){ *chdiv_num = 1; //disable chdiv *vco_doubler=0;//enable vco doubler *vco_level=1;//high level (REG30 7:6) } else if(freq>3550){ *chdiv_num = 1; //disable chdiv *vco_doubler=0;//disable vco doubler *vco_level=0;//low level (REG30 7:6) } else if(freq>1775){ *chdiv_num = 2; //enable chdiv *vco_doubler=0;//enable vco doubler *vco_level=0;//low level (REG30 7:6) } else if(freq>1184){ *chdiv_num = 3; //enable chdiv *vco_doubler=0;//enable vco doubler *vco_level=0;//low level (REG30 7:6) } else if(freq>888){ *chdiv_num = 4; //enable chdiv *vco_doubler=0;//enable vco doubler *vco_level=0;//low level (REG30 7:6) } else if(freq>592){ *chdiv_num = 6; //enable chdiv *vco_doubler=0;//enable vco doubler *vco_level=0;//low level (REG30 7:6) } else if(freq>444){ *chdiv_num = 8; //enable chdiv *vco_doubler=0;//enable vco doubler *vco_level=0;//low level (REG30 7:6) } else if(freq>296){ *chdiv_num = 12; //enable chdiv *vco_doubler=0;//enable vco doubler *vco_level=0;//low level (REG30 7:6) } else if(freq>222){ *chdiv_num = 16; //enable chdiv *vco_doubler=0;//enable vco doubler *vco_level=0;//low level (REG30 7:6) } else if(freq>148){ *chdiv_num = 24; //enable chdiv *vco_doubler=0;//enable vco doubler *vco_level=0;//low level (REG30 7:6) } else if(freq>111){ *chdiv_num = 32; //enable chdiv *vco_doubler=0;//enable vco doubler *vco_level=0;//low level (REG30 7:6) } else if(freq>99){ *chdiv_num = 36; //enable chdiv *vco_doubler=0;//enable vco doubler *vco_level=0;//low level (REG30 7:6) } else if(freq>74){ *chdiv_num = 48; //enable chdiv *vco_doubler=0;//enable vco doubler *vco_level=0;//low level (REG30 7:6) } else if(freq>56){ *chdiv_num = 64; //enable chdiv *vco_doubler=0;//enable vco doubler *vco_level=0;//low level (REG30 7:6) } else if(freq>37){ *chdiv_num = 96; //enable chdiv *vco_doubler=0;//enable vco doubler *vco_level=0;//low level (REG30 7:6) } else if(freq>28){ *chdiv_num = 128; //enable chdiv *vco_doubler=0;//enable vco doubler *vco_level=0;//low level (REG30 7:6) } else if(freq>=20){ *chdiv_num = 192; //enable chdiv *vco_doubler=0;//enable vco doubler *vco_level=0;//low level (REG30 7:6) } else{ } } uint16_t REG46=0x1424; uint16_t REG47=0x08D4; uint16_t REG48=0x03FD; void LMX2592_SETOUT(uint16_t channel ,uint16_t state){ if(channel == 1){//cha if(state) REG47 = (REG47 & 0xEFFF); else REG47 = (REG47 & 0xEFFF) | 0x1000; LmxWrite(47,REG47); } if(channel == 2){//chb if(state) REG48 = (REG48 & 0xFFFD); else REG48 = (REG48 & 0xFFFD) | 0x0002; LmxWrite(48,REG48); } } void LMX2592_WRITE_FREQ(double freq){ // Fvco = Fpd x PLL_N_PRE x (PLL_N + PLL_NUM / PLL_DEN) // The VCO core covers an octave from 3.55 to 7.1 GHz. // F_PFD=20Mhz Fout = pfd * (N) / channel_div; input freq is in Mhz // denominator = 20M(0x0131 2D00 ) the resolution = 1Hz uint16_t chdiv_num; uint16_t vco_doubler; uint16_t vco_level; uint16_t FPFD=20; LMX2592_FIND_CHANNEL_DIV(freq,&chdiv_num,&vco_doubler,&vco_level); if(freq>5000){//pfd=5Mhz FPFD=5; LmxWrite(0,0x2206); //reset device; en ld;power up LmxWrite(1,0x0808);//cal_clk div=1;cal clk = 10Mhz LmxWrite(10,0x10d8);//disable multiplier //LmxWrite(9,0x0b02); LmxWrite(12,0x7002);//pll r pre div =2 LmxWrite(11,0x0018);//pll r div =1; set pfd = 20Mhz } else{//pfd=1Mhz FPFD=1; LmxWrite(0,0x2206); //reset device; en ld; pfd>10M;power up LmxWrite(1,0x0808);//cal_clk div=1;cal clk = 10Mhz LmxWrite(10,0x10d8);//disable multiplier LmxWrite(12,0x700A);//pll r pre div =10 1 LmxWrite(11,0x0018);//pll r div =1; set pfd = 1Mhz 1 } LmxWrite(37,0x5000); // presacle 4 1 LmxWrite(39,0x8104); LmxWrite(14,0x0841); // 1.25 MA /****************** OUTPUT PART ********************/ if(chdiv_num == 1){ // Direct out through VCO if(vco_doubler == 1){ LmxWrite(30,0x0135);//enable vco doubler freq = freq/2; } else if(vco_level){ LmxWrite(30,0x01F4);//level = high( fvco>6500Mhz) } else { LmxWrite(30,0x0134);//level = low( fvco<6500Mhz) } LmxWrite(35,0x0019);//div0 LmxWrite(34,0xC3CA);// dis channel divider LmxWrite(31,0x0081);// LmxWrite(36,0x0000);//dis channel and out LmxWrite(46,REG46);// A level=20 ;dis out a & b; MASH_ORDER=3 REG47 = (REG47 & 0xF7FF) | 0x0800; LmxWrite(47,REG47);//Selects output from VCO REG48 = (REG48 & 0xFFFE) | 0x0001; LmxWrite(48,REG48); //Selects output from VCO } else {// use channel divider LmxWrite(13,4003); LmxWrite(30,0x0034);//level = low( fvco<6500Mhz) DIS vco doubler LmxWrite(31,0x0601);//dis vco buffer; en channel buffer 1 LmxWrite(34,0xC3EA);// en channel divider LmxWrite(46,REG46);// A level=20 ;dis out a & b; MASH_ORDER=3 REG47 = (REG47 & 0xF7FF) | 0x0000; LmxWrite(47,REG47);//Selects A output from channel divider REG48 = (REG48 & 0xFFFE); LmxWrite(48,REG48); //Selects B output from channel divider //write channel divider LMX2592_Wchannel_div(chdiv_num); } /****************** NDIV SET ********************/ double N_DIV = freq * (double)chdiv_num ; N_DIV = N_DIV/(FPFD); N_DIV = N_DIV/4; uint16_t N_integer = (uint16_t)N_DIV; double N_fraction = N_DIV - (double)N_integer; //write N_integer N_integer = (N_integer<<1)&(0x1FFE);//save 12bit LmxWrite(38,(N_integer));// pll Integer part of N-divider //write N_fraction N_fraction = N_fraction * 20000000; uint32_t N_frac_REG = (uint32_t)N_fraction; LmxWrite(44,(N_frac_REG>>16));//Numerator MSB of N-divider fraction LmxWrite(45,N_frac_REG);//Numerator LSB of N-divider fraction //LmxWrite(40,0x0131);//Denominator MSB of N-divider fraction //LmxWrite(41,0x2d00);//Denominator LSB of N-divider fraction LmxWrite(40,0x0131);//Denominator MSB of N-divider fraction LmxWrite(41,0x2d00);//Denominator LSB of N-divider fraction //LmxWrite(47,0x18D4); /****************** STRAT WORK ********************/ if(FPFD == 1) LmxWrite(0,0x2278); //set pfd < 2.5Mhz else LmxWrite(0,0x220c | 0X0020); }