TESTS on LMX2820 45MHz-22.6GHz Wideband Synthesizer Module - Page 1
Forum section: electronics / rf-microwave

author: jaudet
author_rank: Newbie
timestamp: November 13, 2024, 08:49:12 pm
content: I ran measurements on the LMX2820 Synthesizer Module, as available on EBay and AliExpress. Will add ALC + Amplifier circuit to stabilize and increase the output.On my web site:http://ve2azx.net/technical/LMX2820_Tests.pdf

author: EggertEnjoyer123
author_rank: Frequent Contributor
timestamp: November 23, 2024, 04:32:45 am
content: The cheap boards suck in terms of phase noise because they copied the loop filter without changing the crystal (which is 10MHz).The optimum phase noise is achieved by using a high frequency crystal (like 100 MHz), which increases the phase detector frequency.

author: max-bit
author_rank: Frequent Contributor
timestamp: December 10, 2024, 04:42:50 pm
content: Price on aliexpress ~$250

author: EggertEnjoyer123
author_rank: Frequent Contributor
timestamp: December 11, 2024, 04:26:31 am
content: The price is not worth it, especially since their circuit has mistakes.The LMX2820 can be bought for around $50 each at LCSC.

author: dfc123dfc
author_rank: Newbie
timestamp: March 10, 2025, 03:47:49 am
content: Could you please share the LMX2820 driver code? — From an electronics enthusiast. I want to use it as a frequency source for ADL5960

author: EggertEnjoyer123
author_rank: Frequent Contributor
timestamp: March 10, 2025, 05:08:20 am
content: Here's my code for the STM32:Code:/*#include "LMX2820.h"#include "utils.h"//mode: 0 = both, 1 = Port 1, 2 = Port 2void setRegisterLMX(uint8_t address, uint16_t data, int mode){if (mode == 0){HAL_GPIO_WritePin( GPIOC, GPIO_PIN_0, GPIO_PIN_RESET);HAL_GPIO_WritePin( GPIOD, GPIO_PIN_12, GPIO_PIN_RESET);}if (mode == 1){HAL_GPIO_WritePin( GPIOC, GPIO_PIN_0, GPIO_PIN_SET);HAL_GPIO_WritePin( GPIOD, GPIO_PIN_12, GPIO_PIN_RESET);}if (mode == 2){HAL_GPIO_WritePin( GPIOC, GPIO_PIN_0, GPIO_PIN_RESET);HAL_GPIO_WritePin( GPIOD, GPIO_PIN_12, GPIO_PIN_SET);}uint8_t txData = {address, (uint8_t)((data >> 8) & 0xFF), (uint8_t)(data & 0xFF)};HAL_SPI_Transmit(&hspi3, txData, 3, HAL_MAX_DELAY);HAL_GPIO_WritePin( GPIOC, GPIO_PIN_0, GPIO_PIN_SET);HAL_GPIO_WritePin( GPIOD, GPIO_PIN_12, GPIO_PIN_SET);}void resetLMX(){//mute chipHAL_GPIO_WritePin( GPIOC, GPIO_PIN_2, GPIO_PIN_SET);HAL_GPIO_WritePin( GPIOD, GPIO_PIN_14, GPIO_PIN_SET);//Set CS highHAL_GPIO_WritePin( GPIOC, GPIO_PIN_0, GPIO_PIN_SET);HAL_GPIO_WritePin( GPIOD, GPIO_PIN_12, GPIO_PIN_SET);//Toggle Chip EnableHAL_GPIO_WritePin( GPIOD, GPIO_PIN_10, GPIO_PIN_RESET);HAL_GPIO_WritePin( GPIOA, GPIO_PIN_2, GPIO_PIN_RESET);HAL_Delay(1);HAL_GPIO_WritePin( GPIOD, GPIO_PIN_10, GPIO_PIN_SET);HAL_GPIO_WritePin( GPIOA, GPIO_PIN_2, GPIO_PIN_SET);HAL_Delay(2000);setRegisterLMX(0x00, 0x6432, 0);HAL_Delay(10);setRegisterLMX(0x00, 0x6430, 0);HAL_Delay(1000);//----Reset device----// Reset through SPIsetRegisterLMX(0x70, 0xFFFF, 0); //reservedsetRegisterLMX(0x6F, 0x0000, 0); //reservedsetRegisterLMX(0x6E, 0x001F, 0); //reservedsetRegisterLMX(0x6D, 0x0000, 0); //reservedsetRegisterLMX(0x6C, 0x0000, 0); //reservedsetRegisterLMX(0x6B, 0x0000, 0); //reservedsetRegisterLMX(0x6A, 0x0000, 0); //reservedsetRegisterLMX(0x69, 0x000A, 0); //reservedsetRegisterLMX(0x68, 0x0014, 0); //reservedsetRegisterLMX(0x67, 0x0014, 0); //reservedsetRegisterLMX(0x66, 0x0028, 0); //reservedsetRegisterLMX(0x65, 0x03E8, 0); //reservedsetRegisterLMX(0x64, 0x0533, 0); //reservedsetRegisterLMX(0x63, 0x19B9, 0); //reservedsetRegisterLMX(0x62, 0x1C80, 0); //reservedsetRegisterLMX(0x61, 0x0000, 0); //reservedsetRegisterLMX(0x60, 0x17F8, 0); //reservedsetRegisterLMX(0x5F, 0x0000, 0); //reservedsetRegisterLMX(0x5E, 0x0000, 0); //reservedsetRegisterLMX(0x5D, 0x1000, 0); //reservedsetRegisterLMX(0x5C, 0x0000, 0); //reservedsetRegisterLMX(0x5B, 0x0000, 0); //reservedsetRegisterLMX(0x5A, 0x0000, 0); //reservedsetRegisterLMX(0x59, 0x0000, 0); //reservedsetRegisterLMX(0x58, 0x03FF, 0); //reservedsetRegisterLMX(0x57, 0xFF00, 0); //reservedsetRegisterLMX(0x56, 0x0040, 0); //reservedsetRegisterLMX(0x55, 0x0000, 0); //reservedsetRegisterLMX(0x54, 0x0040, 0); //reservedsetRegisterLMX(0x53, 0x0F00, 0); //reservedsetRegisterLMX(0x52, 0x0000, 0); //reservedsetRegisterLMX(0x51, 0x0000, 0); //reservedsetRegisterLMX(0x50, 0x01C0, 0); //OUT_B PowersetRegisterLMX(0x4F, 0x011E, 0); //Disable Port B, set Port A power to 7setRegisterLMX(0x4E, 0x0001, 0); //Enable Port A, set MUX to VCOsetRegisterLMX(0x4D, 0x0608, 0); //MUTE pin = active highsetRegisterLMX(0x46, 0x00FE, 0); //Enable double bufferingsetRegisterLMX(0x45, 0x0011, 0); //Disables SYSREFsetRegisterLMX(0x44, 0x0000, 0); //Disables PSYNCsetRegisterLMX(0x43, 0x0000, 0); //SYSREF settings (unused)setRegisterLMX(0x42, 0x003F, 0); //setRegisterLMX(0x41, 0x0001, 0); //setRegisterLMX(0x40, 0x0080, 0); //setRegisterLMX(0x3F, 0xC350, 0); //MASH (unused)setRegisterLMX(0x3E, 0x0000, 0); //setRegisterLMX(0x3D, 0x03E8, 0); //reservedsetRegisterLMX(0x3C, 0x01F4, 0); //setRegisterLMX(0x3B, 0x1388, 0); //setRegisterLMX(0x3A, 0x0000, 0); //setRegisterLMX(0x39, 0x0001, 0); //Disable PFDINsetRegisterLMX(0x38, 0x0001, 0); //PFD (unused)setRegisterLMX(0x37, 0x0002, 0); //reservedsetRegisterLMX(0x36, 0x0000, 0); //setRegisterLMX(0x35, 0x0000, 0); //setRegisterLMX(0x34, 0x0000, 0); //setRegisterLMX(0x33, 0x203F, 0); //setRegisterLMX(0x32, 0x0080, 0); //setRegisterLMX(0x31, 0x0000, 0); //setRegisterLMX(0x30, 0x4180, 0); //setRegisterLMX(0x2F, 0x0300, 0); //setRegisterLMX(0x2E, 0x0300, 0); //setRegisterLMX(0x2D, 0x6666, 0); //instcalsetRegisterLMX(0x2C, 0x4666, 0); //instcalsetRegisterLMX(0x2B, 0x0001, 0); //Frac-N numsetRegisterLMX(0x2A, 0x0000, 0); //setRegisterLMX(0x29, 0x0000, 0); //MASH seedsetRegisterLMX(0x28, 0x0000, 0); //setRegisterLMX(0x27, 0x0004, 0); //Frac-N densetRegisterLMX(0x26, 0x0000, 0); //setRegisterLMX(0x25, 0x0500, 0); //unused - PFD_DLYsetRegisterLMX(0x24, 0x001C, 0); //NsetRegisterLMX(0x23, 0x3100, 0); //MASHsetRegisterLMX(0x22, 0x0010, 0); //Disable external VCO modesetRegisterLMX(0x21, 0x0000, 0); //ressetRegisterLMX(0x20, 0x1001, 0); //DividerssetRegisterLMX(0x1F, 0x0401, 0); //ressetRegisterLMX(0x1E, 0xB18C, 0);setRegisterLMX(0x1D, 0x318C, 0);setRegisterLMX(0x1C, 0x0639, 0);setRegisterLMX(0x1B, 0x8001, 0);setRegisterLMX(0x1A, 0x0DB0, 0);setRegisterLMX(0x19, 0x0624, 0);setRegisterLMX(0x18, 0x0E34, 0); //ressetRegisterLMX(0x17, 0x1102, 0); //vco manual setting - unusedsetRegisterLMX(0x16, 0xE2BF, 0); //setRegisterLMX(0x15, 0x1C64, 0); //ressetRegisterLMX(0x14, 0x272C, 0); //manual settingsetRegisterLMX(0x13, 0x2120, 0); //disable temp senssetRegisterLMX(0x12, 0x0000, 0); //lock detectsetRegisterLMX(0x11, 0x15C0, 0); //setRegisterLMX(0x10, 0x171E, 0); //chg pump settingsetRegisterLMX(0x0F, 0x2001, 0);setRegisterLMX(0x0E, 0x3001, 0);setRegisterLMX(0x0D, 0x0038, 0);setRegisterLMX(0x0C, 0x0408, 0);setRegisterLMX(0x0B, 0x0612, 0); //enable OSC_2x -> Fpd = 200MHzsetRegisterLMX(0x0A, 0x0000, 0);setRegisterLMX(0x09, 0x0005, 0);setRegisterLMX(0x08, 0xC802, 0);setRegisterLMX(0x07, 0x0000, 0);setRegisterLMX(0x06, 0x0A43, 0);setRegisterLMX(0x05, 0x0032, 0);setRegisterLMX(0x04, 0x4204, 0);setRegisterLMX(0x03, 0x0041, 0);//setRegisterLMX(0x02, 0x81F4, 0);setRegisterLMX(0x02, 0xBFFE, 0);setRegisterLMX(0x01, 0x57A0, 0);setRegisterLMX(0x00, 0x6430, 0);HAL_Delay(10);#ifdef INSTCALsetRegisterLMX(0x01, 0x57A3, 0);setRegisterLMX(0x2C, 0x4000, 0);setRegisterLMX(0x2D, 0x0000, 0);setRegisterLMX(0x6A, 0x0400, 0);setRegisterLMX(0x6B, 0x0000, 0);setRegisterLMX(0x6C, 0x0000, 0);setRegisterLMX(0x6D, 0x0000, 0);setRegisterLMX(0x6A, 0x0602, 0);setRegisterLMX(0x6A, 0x0E02, 0);setRegisterLMX(0x6A, 0x0602, 0);setRegisterLMX(0x6A, 0x0603, 0);setRegisterLMX(0x6A, 0x0E03, 0);setRegisterLMX(0x6A, 0x0603, 0);setRegisterLMX(0x6A, 0x0604, 0);setRegisterLMX(0x6A, 0x0E04, 0);setRegisterLMX(0x6A, 0x0604, 0);setRegisterLMX(0x6A, 0x0605, 0);setRegisterLMX(0x6A, 0x0E05, 0);setRegisterLMX(0x6A, 0x0605, 0);setRegisterLMX(0x6A, 0x0606, 0);setRegisterLMX(0x6A, 0x0E06, 0);setRegisterLMX(0x6A, 0x0606, 0);setRegisterLMX(0x6A, 0x0607, 0);setRegisterLMX(0x6A, 0x0E07, 0);setRegisterLMX(0x6A, 0x0607, 0);setRegisterLMX(0x6A, 0x0000, 0);//setRegisterLMX(0x00, 0x4430, 0);HAL_Delay(100);//setRegisterLMX(0x00, 0x4420, 0);#endif//Unmute chipHAL_GPIO_WritePin( GPIOC, GPIO_PIN_2, GPIO_PIN_RESET);HAL_GPIO_WritePin( GPIOD, GPIO_PIN_14, GPIO_PIN_RESET);}int setFrequency(long long freq, int mode){int divState = 0;if (freq >= 11300LL * MHz ){setRegisterLMX(0x4E, 0x0002, mode);divState = -1;}else if (freq >= 5650LL * MHz ){setRegisterLMX(0x4E, 0x0001, mode);}else if (freq >= 2825LL * MHz){divState = 1;}else if (freq >= 1412500000LL){divState = 2;}else if (freq >= 706250000LL){divState = 3;}else if (freq >= 353125000LL){divState = 4;}else if (freq >= 176562500LL){divState = 5;}else if (freq >= 88281250LL){divState = 6;}else if (freq >= 44140625LL){divState = 7;}if (divState > 0){setRegisterLMX(0x4E, 0x0000, mode);setRegisterLMX(0x20, (uint16_t)(0x1000 | (uint8_t)(0x01 | (((divState - 1) << 6) & 0x01C0))) , mode);}long long den = divState < 0 ? REFFREQ * 2 : REFFREQ >> divState;long long N = freq / den;long long num = freq % den;long long gcd = GCD(num, den);num = num / gcd;den = den / gcd;long long instcal = 0;if (num == 0){den = 0;setRegisterLMX(0x23, 0x3000, mode);}else{setRegisterLMX(0x23, 0x3100, mode);instcal = 4294967296LL * num / den;}setRegisterLMX(0x24, (uint16_t)(N & 0x7FFF), mode);setRegisterLMX(0x26, (uint16_t)((den >> 16) & 0xFFFF), mode);setRegisterLMX(0x27, (uint16_t)( den & 0xFFFF), mode);setRegisterLMX(0x2A, (uint16_t)( (num >> 16) & 0xFFFF), mode);setRegisterLMX(0x2B, (uint16_t)( num & 0xFFFF), mode);#ifdef INSTCALsetRegisterLMX(0x2C, (uint16_t)( (instcal >> 16) & 0xFFFF), mode);setRegisterLMX(0x2D, (uint16_t)( instcal & 0xFFFF), mode);setRegisterLMX(0x00, 0x4420, mode);#elseif (divState < 0){setRegisterLMX(0x00, 0x6470, mode);}else{setRegisterLMX(0x00, 0x6430, mode);}#endifreturn 0;}I could not get instcal working reliably.Also please let me know what results you get with the ADL5960. I'm interested in the actual performance of that chip.

author: dfc123dfc
author_rank: Newbie
timestamp: March 10, 2025, 07:17:41 am
content: Thank you for sharing! I believe your input will greatly accelerate my work progress. Additionally, the ADL5960 chip has been sent for PCB fabrication, and I will keep you informed and share any new progress promptly.

author: dfc123dfc
author_rank: Newbie
timestamp: March 10, 2025, 08:38:28 am
content: For more information on Instant Calibration, you can refer to the following link:https://blog.csdn.net/m0_50789787/article/details/145595619

author: prutser
author_rank: Regular Contributor
timestamp: March 11, 2025, 03:27:20 pm
content: Just curious, what substrate did you use the the ADL5960 and were you able to get a PCB for reasonable cost ?