This thread has been locked.

If you have a related question, please click the "Ask a related question" button in the top right corner. The newly created question will be automatically linked to this question.

CDCEL913: output frequency

Part Number: CDCEL913

Hi, support team

My customer has the questions as follow:

I am using CDCEL913.
I can output integer frequency, such as 33MHz
However, once there are decimals, such as 32.768 MHz, the output is incorrect.
For example, I set 32.768MHz, but my oscilloscope measures 4MHz.

This is my register configuration, which is obtained through Pro-ClockTm software:

Bit  ==>  76543210
Byte 00 - 00000001
Byte 01 - 00000000
Byte 02 - 10110100
Byte 03 - 00000111
Byte 04 - 00000010
Byte 05 - 01010000
Byte 06 - 01000000
Byte 07 - 00000000
Byte 08 - 00000000
Byte 09 - 00000000
Byte 10 - 00000000
Byte 11 - 00000000
Byte 12 - 00000000
Byte 13 - 00000000
Byte 14 - 00000000
Byte 15 - 00000000
Byte 16 - 00000000
Byte 17 - 00000000
Byte 18 - 00000000
Byte 19 - 00000000
Byte 20 - 00001101
Byte 21 - 00000010
Byte 22 - 00000000
Byte 23 - 00000000
Byte 24 - 11100000
Byte 25 - 00000010
Byte 26 - 10100011
Byte 27 - 10000011
Byte 28 - 11100000
Byte 29 - 00000010
Byte 30 - 10100011
Byte 31 - 10000000

And this is my C configuration code. I can make sure that the register is written in, because the output integer frequency is OK.

#include "cdce913.h"
#include "iic.h"
#include <stdbool.h> 
#include "math.h"

/************************************************
* File Name: @@@.c

* Author:xykj

* Date:2019.11.29

* function:cdce913

*************************************************/


    
void CDCE913_Init_invar(void)
{
  cdce913_I2C_WriteByte(0x02, 0x34);    //
  cdce913_I2C_WriteByte(0x03, 0x1A);    //y1·ÖƵ 
  cdce913_I2C_WriteByte(0x04, 0x02);    //s0=0,s0=1¾ùѡͨ
  cdce913_I2C_WriteByte(0x05, 0x50);    //10PF ¾§ÕñµçÈÝ
  cdce913_I2C_WriteByte(0x06, 0x40);
    

  cdce913_I2C_WriteByte(0x12, 0X00);    //SSC1_1[5:3] AND  SSC1_0[2:0]  XXX XXX	
  cdce913_I2C_WriteByte(0x13, 0X00);    //s0=0,Ñ¡Ôñfvco1   s0=1,Ñ¡ÔñFVCO_0
  cdce913_I2C_WriteByte(0x14, 0x6D);    //ʹÓÃPLL1£¬Y2ʹÓÃpdiv2£¬y3ʹÓÃpdiv3 0110 1101 (6D)
  cdce913_I2C_WriteByte(0x15, 0X02);    //S0=0,S0=1´ò¿ª
    
  cdce913_I2C_WriteByte(0x16, 0X7D);    //y2·ÖƵ 0Ϊ¹Ø
  cdce913_I2C_WriteByte(0x17, 0X00);    //y3·ÖƵ 0Ϊ¹Ø   





  cdce913_I2C_WriteByte(0x18, 0X7C);    //N
  cdce913_I2C_WriteByte(0x19, 0XE2);    //N
  cdce913_I2C_WriteByte(0x1A, 0XC2);    //R
  cdce913_I2C_WriteByte(0x1B, 0X68);    //Q



  cdce913_I2C_WriteByte(0x1C, 0X7C);    //N
  cdce913_I2C_WriteByte(0x1D, 0XE2);    //N
  cdce913_I2C_WriteByte(0x1E, 0XC2);    //R
  cdce913_I2C_WriteByte(0x1F, 0X68);    //Q
  
   
}

//void CDCE913_Init_invar(void)
//{
//  cdce913_I2C_WriteByte(0x02, 0xB4);    //
//  cdce913_I2C_WriteByte(0x03, 0x7E);    //y1·ÖƵ 
//  cdce913_I2C_WriteByte(0x04, 0x02);    //s0=0,s0=1¾ùѡͨ
//  cdce913_I2C_WriteByte(0x05, 0x50);    //10PF ¾§ÕñµçÈÝ
//  cdce913_I2C_WriteByte(0x06, 0x40);
//    

//  cdce913_I2C_WriteByte(0x12, 0X00);    //SSC1_1[5:3] AND  SSC1_0[2:0]  XXX XXX	
//  cdce913_I2C_WriteByte(0x13, 0X00);    //s0=0,Ñ¡Ôñfvco1   s0=1,Ñ¡ÔñFVCO_0
//  cdce913_I2C_WriteByte(0x14, 0x2D);    //ʹÓÃPLL1£¬Y2ʹÓÃpdiv2£¬y3ʹÓÃpdiv3 0110 1101 (6D)
//  cdce913_I2C_WriteByte(0x15, 0X02);    //S0=0,S0=1´ò¿ª
//    
//  cdce913_I2C_WriteByte(0x16, 0X00);    //y2·ÖƵ 0Ϊ¹Ø
//  cdce913_I2C_WriteByte(0x17, 0X00);    //y3·ÖƵ 0Ϊ¹Ø   





//  cdce913_I2C_WriteByte(0x18, 0X6A);    //N
//  cdce913_I2C_WriteByte(0x19, 0X59);    //N
//  cdce913_I2C_WriteByte(0x1A, 0X82);    //R
//  cdce913_I2C_WriteByte(0x1B, 0X89);    //Q



//  cdce913_I2C_WriteByte(0x1C, 0X6A);    //N
//  cdce913_I2C_WriteByte(0x1D, 0X59);    //N
//  cdce913_I2C_WriteByte(0x1E, 0X82);    //R
//  cdce913_I2C_WriteByte(0x1F, 0X88);    //Q
//  
//   
//}

#define CLK_IN    26 

void CDCE_Init_set(float f_out)
{
  uint8_t read_back;
  uint8_t i = 0;
  uint32_t M, N,  Q, R;
  float Pdiv;
  uint8_t reg18, reg19, reg1A, reg1B;
  int32_t P;
  float f_vco = f_out;
  bool result    = false;
  uint8_t f_range;



  while (f_vco < 80)
  {
    i++;
    f_vco = f_out * i;
  }



  while (f_vco < 231)
  {
    for (N = 4095; N > 0; N--)
    {
      for (M = 511; M > 0; M--)
      {
        if ((N * CLK_IN / M) == f_vco)
        {          
          {
            result = true;
            break;
          }
        }
      }
      if (result)
      {
        break;
      }
    }
    if (result)
    {
      break;
    }
    else
    {
      i++;
      f_vco = f_out * i;
    }
  }



  P = 4 - (int)((log((double)N / (double)M))/log(2));
  if (P < 0)
  {
    P = 0;
  }
  Q = (int)((double)N * pow(2, (double)P) / (double)M);
  R = (double)N * pow(2, (double)P) - M * Q;



  if (f_vco < 125)
  {
    f_range = 0;
  }
  else if ((f_vco >= 125) && (f_vco < 150))
  {
    f_range = 1;
  }
  else if ((f_vco >= 150) && (f_vco < 175))
  {
    f_range = 2;
  }
  else
  {
    f_range = 3;
  }


  Pdiv = f_vco/ f_out;






  cdce913_I2C_WriteByte(0x02, 0xB4);
  cdce913_I2C_WriteByte(0x03, (uint8_t)Pdiv);
  cdce913_I2C_WriteByte(0x04, 0x02);
  cdce913_I2C_WriteByte(0x05, 0x50);
  cdce913_I2C_WriteByte(0x06, 0x40);
  
  cdce913_I2C_WriteByte(0x12, 0x00);
  cdce913_I2C_WriteByte(0x13, 0x00);
  cdce913_I2C_WriteByte(0x14, 0x6D);        //Y2,Y3¿ª¹Ø¿ØÖÆ£¬y1²»ÊǸÃÒý½Å¿ØÖÆ£¬¹Ì¶¨ÓÐY1
  cdce913_I2C_WriteByte(0x15, 0x02);
  
  cdce913_I2C_WriteByte(0x16, 0);
  cdce913_I2C_WriteByte(0x17, 0);



  reg18 = (N >> 4) & 0xFFF;
  reg19 = (N & 0xf) << 4 | (R & 0xf0) >> 5;
  reg1A = (R & 0x1f) << 3 | ((Q >> 3) & 0x7);
  reg1B = (Q & 0x7) << 5 | (P & 0x07) << 2 | (f_range & 0x03);



  cdce913_I2C_WriteByte(0x18, reg18);
  cdce913_I2C_WriteByte(0x19, reg19);
  cdce913_I2C_WriteByte(0x1A, reg1A);
  cdce913_I2C_WriteByte(0x1B, reg1B);


  cdce913_I2C_WriteByte(0x1C, N);
  cdce913_I2C_WriteByte(0x1D, ((N & 0xf) << 4) | (R & 0xf0));
  cdce913_I2C_WriteByte(0x1E, (R & 0x0f) | (Q & 0xf0));
  cdce913_I2C_WriteByte(0x1F, ((Q & 0x07) << 5) | ((P & 0x07) << 2) | (f_range & 0x03));



}

//void CDCE_Init_set(uint16_t f_out)
//{
//  uint8_t read_back;
//  uint8_t i = 0;
//  uint32_t M, N, Pdiv, Q, R;
//  uint8_t reg18, reg19, reg1A, reg1B;
//  int P;
//  uint16_t f_vco = f_out;
//  bool result    = false;
//  uint8_t f_range;



//  while (f_vco < 80)
//  {
//    i++;
//    f_vco = f_out * i;
//  }



//  while (f_vco < 231)
//  {
//    for (N = 4095; N > 0; N--)
//    {
//      for (M = 511; M > 0; M--)
//      {
//        if ((N * CLK_IN / M) == f_vco)
//        {          
//          {
//            result = true;
//            break;
//          }
//        }
//      }
//      if (result)
//      {
//        break;
//      }
//    }
//    if (result)
//    {
//      break;
//    }
//    else
//    {
//      i++;
//      f_vco = f_out * i;
//    }
//  }



//  P = 4 - (int)((log((double)N / (double)M))/log(2));
//  if (P < 0)
//  {
//    P = 0;
//  }
//  Q = (int)((double)N * pow(2, (double)P) / (double)M);
//  R = (double)N * pow(2, (double)P) - M * Q;



//  if (f_vco < 125)
//  {
//    f_range = 0;
//  }
//  else if ((f_vco >= 125) && (f_vco < 150))
//  {
//    f_range = 1;
//  }
//  else if ((f_vco >= 150) && (f_vco < 175))
//  {
//    f_range = 2;
//  }
//  else
//  {
//    f_range = 3;
//  }


//  Pdiv = f_vco/ f_out;






//  cdce913_I2C_WriteByte(0x02, 0xB4);
//  cdce913_I2C_WriteByte(0x03, (uint8_t)Pdiv);
//  cdce913_I2C_WriteByte(0x04, 0x02);
//  cdce913_I2C_WriteByte(0x05, 0x50);
//  cdce913_I2C_WriteByte(0x06, 0x40);
//  
//  cdce913_I2C_WriteByte(0x12, 0x00);
//  cdce913_I2C_WriteByte(0x13, 0x00);
//  cdce913_I2C_WriteByte(0x14, 0x6D);        //Y2,Y3Ñ¡Ôñ
//  cdce913_I2C_WriteByte(0x15, 0x02);
//  
//  cdce913_I2C_WriteByte(0x16, 0);
//  cdce913_I2C_WriteByte(0x17, 0);



//  reg18 = (N >> 4) & 0xFFF;
//  reg19 = (N & 0xf) << 4 | (R & 0xf0) >> 5;
//  reg1A = (R & 0x1f) << 3 | ((Q >> 3) & 0x7);
//  reg1B = (Q & 0x7) << 5 | (P & 0x07) << 2 | (f_range & 0x03);



//  cdce913_I2C_WriteByte(0x18, reg18);
//  cdce913_I2C_WriteByte(0x19, reg19);
//  cdce913_I2C_WriteByte(0x1A, reg1A);
//  cdce913_I2C_WriteByte(0x1B, reg1B);


//  cdce913_I2C_WriteByte(0x1C, N);
//  cdce913_I2C_WriteByte(0x1D, ((N & 0xf) << 4) | (R & 0xf0));
//  cdce913_I2C_WriteByte(0x1E, (R & 0x0f) | (Q & 0xf0));
//  cdce913_I2C_WriteByte(0x1F, ((Q & 0x07) << 5) | ((P & 0x07) << 2) | (f_range & 0x03));



//}

Please help me see what the problem is.

Thanks so much.

Best regards,
Yuki

  • Hi Yuki,

    Whether it's integer or fractional isn't really up to the output frequency. It describes the relationship between the input frequency and the VCO frequency. If VCO is an integer multiple of the input then we say the PLL works in integer mode. Otherwise it's fractional PLL. So in this case, both 33MHz and 32.768MHz are "fractional" assuming VCO = 198MHz for 33MHz. Therefore, I don't think the difference is because of that. The configuration looks correct to me and I'm not seeing any obvious mistake. Please try a few other frequencies and find other potential differences between 33MHz setup and 32.768Mhz setup.

    Regards,
    Hao