7 #define _USE_MATH_DEFINES 48 printf(
"Подготовка PLL\n");
78 printf(
"Подготовка PLL завершена\n");
90 printf(
"reg0x10=0x%.4X freq=%d \n", reg0x10, freq );
100 double dFreqIn = 100000000.0;
105 if( (dFreqIn < 5.0*1000.0*1000.0) ||
106 (dFreqIn > 900.0*1000.0*1000.0) ||
107 (freq < 47.368*1000.0*1000.0) ||
108 (freq > 3800.0*1000.0*1000.0) )
115 int nKeeR, nKeeN, nKeeD;
117 double dFpfd, dFvco, dFclk, dDelta;
121 dKeeDelta = 1.0 * freq;
123 nKeeR = nKeeN = nKeeD = 0;
126 for( rr=1; rr<=255; rr++ )
128 dFpfd = dFreqIn / rr;
129 if( (dFpfd < 5.0*1000.0*1000.0) ||
130 (dFpfd > 200.0*1000.0*1000.0) )
132 for( nn=4095; nn>=7; nn-- )
135 if( (dFvco < 1800.0*1000.0*1000.0) ||
136 (dFvco > 3800.0*1000.0*1000.0) )
138 for( dd=38; dd>=1; dd-=(dd==2)?1:2 )
141 dDelta = fabs( dFclk-(freq) );
142 if( dDelta < dKeeDelta )
149 if( 1.0 > dKeeDelta )
161 if( 0==nKeeR || 0==nKeeN || 0==nKeeD )
164 dFclk = dFreqIn * nKeeN / nKeeR / nKeeD;
166 printf(
"TF_PLL::SetPll) >>>> R=%d, N=%d, D=%d\n Fclk_req=%15.0f Hz\n Fclk_set=%15.0f Hz\n delta=%17.0f Hz\n",
167 nKeeR, nKeeN, nKeeD, freq, dFclk, dKeeDelta );
177 unsigned int nR5, nR3, nR1, nR0, code;
179 nR0 = 0x04000000 | (nKeeN<<12);
180 nR1 = 0x0C400200 | (nKeeR&0xFF);
185 nR3 |= ((nKeeD-2)/2) << 14;
188 if( dFreqIn<64.0*1000.0*1000.0) code = 0;
189 else if( dFreqIn<128.0*1000.0*1000.0) code = 1;
190 else if( dFreqIn<256.0*1000.0*1000.0) code = 2;
191 else if( dFreqIn<512.0*1000.0*1000.0) code = 3;
250 int d = (data << 4 ) | adr;
262 case 2: valA = 0;
break;
263 case 4: valA = 1;
break;
264 case 8: valA = 2;
break;
265 default: valA = 3;
break;
270 case 2: valB = 0;
break;
271 case 4: valB = 1;
break;
272 case 8: valB = 2;
break;
273 default: valB = 3;
break;
276 val = 0x44 | valB<<4 | valA;
287 printf(
"%s val = 0x%.2X\n", __FUNCTION__, val);
virtual void PkgCmdRead(int dev, int adr, int *pData)
Чтение из регистра
void SetDiv(int divA, int divB)
Установка делителей
virtual void PkgCmdStart(void)
Начало выполнения команды
double GetFreq(int n)
Установленное значение частоты
virtual void PkgCmdExecute(void)
Выполнение команды
CL_Reg * reg
Доступ к регистрам модуля
virtual void PkgCmdWrite(int dev, int adr, int data)
Запись в регистр
int SetPll(double freq, double *pFreqOut)
Установка тактовой частоты
void SpdWrite(unsigned int adr, unsigned int data)
Запись в регистр синтезатора
TF_PLL_TaskData * td
Внутренние данные класса
void Prepare(void)
Подготовка PLL.