Post Go back to editing

HMC833 Integer Mode Issue

Hello

I am using HMC833 IC in my design.

Up to now I have used it in fractional mode and everything was fine.

Due to some spurious signals I would like to change its mode to integer one.

I have changed the code accordingly but for some reason I receive PLL lock status only in case the RF divider value "R" is 1. For any other values the PLL is not locked according to the provided status.

Attached the code that initializes the device.

What can be the reason for this issue?

Thanks in advance.

Status pll_setFreq(XSpi* spi, UInt4 freqInMHz, UInt4* realFreq)
{
	int nInt, nFrac, devider;
	UInt4 spiRead = 0;
	Bool deviderFound = FALSE;
	Bool needDoubler = FALSE;
	UInt4 realFreqInMHz;
	UInt4 vcoRegVal;

	if ((freqInMHz < 25) || (freqInMHz > 6000)) {
		return ERROR;
	}

	realFreqInMHz = freqInMHz;

	if (realFreqInMHz < 1500) {
		devider = 0;
		while ((deviderFound == FALSE) && (devider <= 64)) {
			devider += 2;
			freqInMHz = realFreqInMHz * devider;
			if ((freqInMHz >= 1500) && (freqInMHz <= 3000)) {
				deviderFound = TRUE;
			}
		}

		if (deviderFound == FALSE) {
			return ERROR;
		}
	} else {
		devider = 1;

		if (realFreqInMHz > 3000) {
			needDoubler = TRUE;
			freqInMHz /= 2;
		}
	}


	nInt = 2 * freqInMHz / 80;
//	nFrac = freqInMHz - nInt*80;
//	nFrac *= pow(2,24);
//	nFrac /= 80;

	pll_writeReg(spi, 0x0,0x00000020); // Soft reset
	pll_writeReg(spi, 0x1,0x00000002); // Reset Register
	pll_writeReg(spi, 0x2,0x00000002); // Reference Divider Register

	pll_writeReg(spi, 0x5,0x00001628); // VCO Subsystem Register 05h
	pll_writeReg(spi, 0x5,0x000060A0); // VCO Subsystem Register 04h

	if (needDoubler) {
		pll_writeReg(spi, 0x5,0x00002018); // VCO Subsystem Register 03h - doubler mode
		pll_writeReg(spi, 0x5,0x00005010); // VCO Subsystem Register 02h - doubler mode
	} else {
		pll_writeReg(spi, 0x5,0x00002898); // VCO Subsystem Register 03h - fundamental mode
	}
	printf("devider %d\n\r", devider);
	devider = devider << 7;
	vcoRegVal = 0x0000E010;
	vcoRegVal |= devider;
	pll_writeReg(spi, 0x5,vcoRegVal); // VCO Subsystem Register 02h - setting devider
	printf("PLL HF divider value %d\n\r", vcoRegVal);
	pll_writeReg(spi, 0x5,0x00000000); // VCO Subsystem

//	pll_writeReg(spi, 0x6,0x00030F4A); // Delta Sigma Modulator Configuration Register - Fractional mode
	pll_writeReg(spi, 0x6,0x000307CA);//Delta Sigma Modulator Configuration Register - Integer mode
	pll_writeReg(spi, 0x7,0x0000014D); // Lock Detect Register 32 cycles of lock detect 2048 windows size
	pll_writeReg(spi, 0x8,0x00C1BEFF); // Analog Control Enable Register
	pll_writeReg(spi, 0x9,0x005CBFFF); // Charge Pump Register
	pll_writeReg(spi, 0xA,0x00002046); // VCO AutoCAL Configuration Register
	pll_writeReg(spi, 0xB,0x0007C061); // Phase Frequency Detector Register
	pll_writeReg(spi, 0xC,0x00000000); // Fine Frequency Correction Register
	pll_writeReg(spi, 0xF,0x00000081); // GPO_SPI_RDIV Register lock detect output, LD_SDO Pin Driver always on

	pll_readReg(spi,  0x12, &spiRead);
	pll_writeReg(spi, 0x3,nInt); 		// Integer Frequency Register Integer Part
//	pll_writeReg(spi, 0x4,nFrac); 		// Integer Frequency Register Fractional Part
	pll_readReg(spi,  0x12, &spiRead);

	if (spiRead == 0xFF000003) {
	//	printf("PLL locked at %d[MHz]\n\r", realFreqInMHz);
		*realFreq = realFreqInMHz;
		return SUCCESS;
	} else{
		printf("PLL  NOT locked at %d[MHz] (0x%08X)\n\r", realFreqInMHz, spiRead);
		return ERROR;
	}
}

Edit Notes

tag
[edited by: lallison at 5:03 PM (GMT 0) on 16 Jul 2019]