/** CDCEL913芯片外接晶振频率 单位:kHz*/#define CLK_IN 12000/*** @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:%frn", f_out); //a = (float)(f_out / (float)1000.0f); f_out = (f_out / 1000.0f); printf("f_out :%frn", f_out);begin: i = 0; f_vco = f_out; printf("f_vco :%frn", 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:%drn", M); printf("N:%drn", N); printf("f_vco:%frn", f_vco); if(((M == 0) && (N == 0)) || (f_vco > 231 * 1000)) { if(correctnum < 11)correctnum++; else correctnum = 1; printf("refind M Nrn"); 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:%frn", f_vco); printf("Pdiv:%drn", (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不是该引脚控制,固定有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)); /** 使能时钟输出*/ 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的数值有问题。项目马上交付发现这个问题,希望能尽快解决掉。我看论坛和网上也几乎没有相关的驱动程序。
0
|
2个回答
|
|
|