Part Number:CDCEL913Other Parts Discussed in Thread:CDCE913, CLOCKPRO,
/** CDCEL913芯片外接晶振频率 单位:kHz*/
#define CLK_IN12000
/**
* @Description:调整ad芯片的输入频率
* @param f_out 目标频率 单位:百Hz
* @return NULL
*/
void CDCE_Init_set(float f_out)
{uint8_t i = 0;uint32_t correctnum = 0;uint32_t M, N, Q, R;float Pdiv;uint8_t reg18, reg19, reg1A, reg1B;int32_t P;float f_vco = 0;uint8_t f_odr=1;printf("f_out:%f\r\n", f_out);//a = (float)(f_out / (float)1000.0f);f_out = (f_out / 1000.0f);printf("f_out :%f\r\n", f_out);
begin:i = 0;f_vco = f_out;printf("f_vco :%f\r\n", f_vco);f_odr = f_vco/1000;bool result= false;uint8_t f_range;if (f_out <= 0) return;if(f_odr<8){while (f_vco < f_odr*12 * 1000){i++;f_vco = f_out * i;}}else{while (f_vco < 84 * 1000){i++;f_vco = f_out * i;}}while (f_vco < 231 * 1000){for (N = 4095; N > 0; N--){for (M = 511; M > 0; M--){if(((uint32_t)(f_vco * 1000) % 1000 == 0)){if ((uint32_t)((N * (CLK_IN) / M)) == (uint32_t)(f_vco)){result = true;break;}}else{if(((uint32_t)((float)N * (float)(CLK_IN) / (float)M) + correctnum) == (uint32_t)((f_vco * 1000) / 1000)){{result = true;break;}}}}if (result){break;}}if (result){break;}else{i++;f_vco = f_out * i;}}printf("M:%d\r\n", M);printf("N:%d\r\n", N);printf("f_vco:%f\r\n", f_vco);if(((M == 0) && (N == 0)) || (f_vco > 231 * 1000)){if(correctnum < 11)correctnum++;else correctnum = 1;printf("refind M N\r\n");goto begin;}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 * 1000){f_range = 0;}else if ((f_vco >= 125 * 1000) && (f_vco < 150 * 1000)){f_range = 1;}else if ((f_vco >= 150 * 1000) && (f_vco < 175 * 1000)){f_range = 2;}else{f_range = 3;}Pdiv = (uint32_t)(f_vco) / (uint32_t)(f_out);printf("f_vco:%f\r\n", f_vco);printf("Pdiv:%d\r\n", (uint8_t)Pdiv);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(0x10, 0x00);cdce913_I2C_WriteByte(0x11, 0x00);cdce913_I2C_WriteByte(0x12, 0x00);cdce913_I2C_WriteByte(0x13, 0x00);cdce913_I2C_WriteByte(0x14, 0x0d);//Y2,Y3开关控制,y1不是该引脚控制,固定有Y1cdce913_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));/** 使能时钟输出*/HAL_GPIO_WritePin(CLK_CTRL_S0_GPIO_Port, CLK_CTRL_S0_Pin, GPIO_PIN_SET);
}
f_out:1196032.000000
f_out :1196.031982
f_vco :1196.031982
bbbbbbb
M:498
N:546
f_vco:13156.351563
f_vco:13156.351563
Pdiv:11
我的目标输出为1196kHz,
但是示波器测量到频率为1160kHz。
但是我用这个代码去计算和设置cdce913的某些频率却是正确的。所以我可以确认是软件计算的 M,N的数值有问题。项目马上交付发现这个问题,希望能尽快解决掉。我看论坛和网上也几乎没有相关的驱动程序。
Amy Luo:
您好,
您输入信号频率是12MHZ吗?您可以附上您配置的ClockPro截图吗?我配置的如下截图:
,
KL C:
我用clockpro配置出来的结果跟您一样,但是我直接将 M N和fvco放入到程序中,实际输出频率为1.150Mhz
,
Amy Luo:
下面帖子中E2E工程师给出了这样的解释,说是无论是整数还是小数模式的PLL,都不能真正达到输出频率:
https://e2e.ti.com/support/clock-timing-group/clock-and-timing/f/clock-timing-forum/1063616/cdcel913-output-frequency?tisearch=e2e-sitesearch&keymatch=CDCEL913#
,
KL C:
您的意思是在某些频率下存在输出误差是避免不了的吗?就我现在的情况属于正常偏差?
,
Amy Luo:
看E2E工程师的回复,实际输出频率应该与设计输出是有差别的;
您是在设计程序以计算PLL的设置参数吗?我们建议使用TI 的 Pro-Clock 软件来自动设置相应参数,您使用Pro-Clock 软件生产的参数来配置 CDCEL913,其输出怎样呢
,
KL C:
我在上面已经说过,我使用软件生成的M , N,fvco和Pdiv1数值直接放入寄存器中,也就是没有使用我的程序去计算这几个数值。软件显示输出1.196Mhz但是实际输出为1.150Mhz左右偏差更大了。
,
KL C:
f_vco=149.5*1000;M=312;N=3887;printf("M:%d\r\n", M);printf("N:%d\r\n", N);printf("f_vco:%f\r\n", f_vco);if(((M == 0) && (N == 0)) || (f_vco > 231 * 1000)){if(correctnum < 11)correctnum++;else correctnum = 1;printf("refind M N\r\n");goto begin;}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 * 1000){f_range = 0;}else if ((f_vco >= 125 * 1000) && (f_vco < 150 * 1000)){f_range = 1;}else if ((f_vco >= 150 * 1000) && (f_vco < 175 * 1000)){f_range = 2;}else{f_range = 3;}Pdiv = (uint32_t)(f_vco) / (uint32_t)(f_out);Pdiv = 125;printf("f_vco:%f\r\n", f_vco);printf("Pdiv:%d\r\n", (uint8_t)Pdiv);我直接写死了4个变量的数值,根据Clock-pro,
,
Amy Luo:
我再确认下CDCEL913 它的输出精度范围
,
Amy Luo:
您可以查看 datasheet figure 22,配置27MHZ输入, 27MHZ输出,实际输出26.99Mhz,与输入是有一定偏差的:
,
Amy Luo:
我咨询了英文论坛工程师,他需要您提供寄存器文件,您可以附上您的寄存器文件吗?
To better assist you, can you please provide me with the register file? This way I have a better understanding of what's going on.
,
KL C:
addr:0x2----->data:0xb4 addr:0x3----->data:0xb addr:0x4----->data:0x2 addr:0x5----->data:0x50 addr:0x6----->data:0x40 addr:0x7----->data:0x40 addr:0x8----->data:0x20 addr:0x9----->data:0x20 addr:0xa----->data:0x20 addr:0xb----->data:0x20 addr:0xc----->data:0x20 addr:0xd----->data:0x20 addr:0xe----->data:0x20 addr:0xf----->data:0x20 addr:0x10----->data:00 addr:0x11----->data:00 addr:0x12----->data:00 addr:0x13----->data:00 addr:0x14----->data:0xd addr:0x15----->data:0x2 addr:0x16----->data:00 addr:0x17----->data:00 addr:0x18----->data:0x20 addr:0x19----->data:0x7 addr:0x1a----->data:0xea addr:0x1b----->data:0x30 addr:0x1c----->data:0x20 addr:0x1d----->data:0x7 addr:0x1e----->data:0xea addr:0x1f----->data:0x30目标输出1.196Mhz时写入的寄存器数值。
,
Amy Luo:
好的,我已将上述寄存器值反馈给他
,
KL C:
你好问题还没有结果吗?
,
Amy Luo:
还没有收到回复,下面链接是我咨询的帖子,您也可以随时查看回复情况:
https://e2e.ti.com/support/clock-timing-group/clock-and-timing/f/clock-timing-forum/1114071/cdcel913-output-frequency-accuracy/4129828?tisearch=e2e-sitesearch&keymatch=%25252520user%2525253A377385#4129828
,
Amy Luo:
您是在一个板子上还是在多个板子上都有这样的问题?
E2E论坛工程师在EVM上测试同样的设置,能够使用ClocksPro生成的参数输出1.196Mhz。 怀疑您使用的元件可能有问题,或者示波器可能有一些问题。
I was able to find an EVM and tested their setup in our lab. I was able to generate a 1.196Mhz output with ClocksPro using the customers parameters. Seems like the customer may have a faulty component or their Oscilloscope could be a bit faulty.
,
KL C:
示波器应该是没有问题,因为输出的频率是给AD7768使用的,测试发现AD7768的采样频率也确实不是预期采样频率(它取决于输入时钟频率),而且示波器测量晶振数值也都正常。EVM上测试使用的寄存器数值跟我提供的一样吗?会不会是PCB设计或者原理图有问题呢?
,
KL C:
这个是目前使用的原理图
,
KL C:
我在所有的不低于10个电路板上都是一样的问题
,
Amy Luo:
好的,我确认下您上面回复的信息
,
Amy Luo:
原理图我没看出什么问题,我已将您的原理图发给E2E论坛工程师也看下;
关于寄存器值与10个以上板子有这种现象,我也已向他确认和反馈;
,
Amy Luo:
E2E工程师反馈说,他使用的寄存器值与您的不一样,同时使用的EVM原理图也您的不一样,他需要一些时间来确认您的原理图是否有问题
CDCEL913 ClockPro 1.196Mhz output CSV File.ISF.CSVCDCEL913 ClockPro 1.196Mhz output HEX Intel File.ISF.CSV
,
Amy Luo:
您使用E2E工程师附件中的寄存器配置是否解决问题?
,
KL C:
他的寄存器数值是通过Pro-Clock 软件产生的?能不能给出配置的具体生成方法?
,
Amy Luo:
已向他确认寄存器生成方法,得到回复后我会第一时间反馈给您
,
Amy Luo:
是的,是通过Pro-Clock产生的;
是使用Pro-Clock 和EVM配合产生的;
您说的配置的具体生成方法是指什么?在 CDCE913EVM用户指南 中有Pro-Clock使用说明,还是说您是需要Pro-Clock 的具体配置截图?
TI中文支持网







