00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012
00013
00014
00015
00016
00017
00018
00019
00020
00021
00022 #include "lpc2000.h"
00023
00024 #include "global.h"
00025 #include "timer.h"
00026 #include "membus.h"
00027 #include "rprintf.h"
00028 #include "ad9854.h"
00029
00030
00031 int Ad9854RefClkMult;
00032
00033
00034 void ad9854Write(unsigned int addr, unsigned char data)
00035 {
00036 ((u16*)AD9854_REG_BASE)[addr] = data;
00037 }
00038
00039 unsigned char ad9854Read(unsigned int addr)
00040 {
00041 return ((u16*)AD9854_REG_BASE)[addr];
00042 }
00043
00044 void ad9854Init(void)
00045 {
00046
00047
00048
00049
00050
00051
00052
00053
00054
00055 ad9854SetupIOUpdate(0);
00056
00057
00058 Ad9854RefClkMult = 1;
00059 }
00060
00061 void ad9854SetupIOUpdate(int state)
00062 {
00063
00064
00065
00066
00067
00068
00069
00070
00071
00072
00073 }
00074
00075 void ad9854ClockIOUpdate(void)
00076 {
00077
00078
00079
00080 asm volatile ("nop\r\n nop\r\n");
00081
00082
00083 }
00084
00085 void ad9854WritePhase1(u16 phase)
00086 {
00087 ad9854Write(AD9854_REG_PHASE1L, phase);
00088 ad9854Write(AD9854_REG_PHASE1H, phase>>8);
00089 }
00090
00091 void ad9854WritePhase2(u16 phase)
00092 {
00093 ad9854Write(AD9854_REG_PHASE2L, phase);
00094 ad9854Write(AD9854_REG_PHASE2H, phase>>8);
00095 }
00096
00097 void ad9854WriteFreq1(u64 freq)
00098 {
00099 ad9854Write(AD9854_REG_FREQ10, freq);
00100 ad9854Write(AD9854_REG_FREQ11, freq>>8);
00101 ad9854Write(AD9854_REG_FREQ12, freq>>16);
00102 ad9854Write(AD9854_REG_FREQ13, freq>>24);
00103 ad9854Write(AD9854_REG_FREQ14, freq>>32);
00104 ad9854Write(AD9854_REG_FREQ15, freq>>40);
00105 }
00106
00107 void ad9854WriteFreq2(u64 freq)
00108 {
00109 ad9854Write(AD9854_REG_FREQ20, freq);
00110 ad9854Write(AD9854_REG_FREQ21, freq>>8);
00111 ad9854Write(AD9854_REG_FREQ22, freq>>16);
00112 ad9854Write(AD9854_REG_FREQ23, freq>>24);
00113 ad9854Write(AD9854_REG_FREQ24, freq>>32);
00114 ad9854Write(AD9854_REG_FREQ25, freq>>40);
00115 }
00116
00117 void ad9854WriteDeltaFreq(u64 freq)
00118 {
00119 ad9854Write(AD9854_REG_DELTA0, freq);
00120 ad9854Write(AD9854_REG_DELTA1, freq>>8);
00121 ad9854Write(AD9854_REG_DELTA2, freq>>16);
00122 ad9854Write(AD9854_REG_DELTA3, freq>>24);
00123 ad9854Write(AD9854_REG_DELTA4, freq>>32);
00124 ad9854Write(AD9854_REG_DELTA5, freq>>48);
00125 }
00126
00127 void ad9854WriteUpdateClock(u32 updclock)
00128 {
00129 ad9854Write(AD9854_REG_UPDCLOCK0, updclock);
00130 ad9854Write(AD9854_REG_UPDCLOCK1, updclock>>8);
00131 ad9854Write(AD9854_REG_UPDCLOCK2, updclock>>16);
00132 ad9854Write(AD9854_REG_UPDCLOCK3, updclock>>24);
00133 }
00134
00135 void ad9854WriteRampRateClock(u32 rampclock)
00136 {
00137 ad9854Write(AD9854_REG_RAMPCLOCK0, rampclock);
00138 ad9854Write(AD9854_REG_RAMPCLOCK1, rampclock>>8);
00139 ad9854Write(AD9854_REG_RAMPCLOCK2, rampclock>>16);
00140 }
00141
00142 void ad9854WriteControlReg(u32 cr)
00143 {
00144 ad9854Write(AD9854_REG_CTRL0, cr);
00145 ad9854Write(AD9854_REG_CTRL1, cr>>8);
00146 ad9854Write(AD9854_REG_CTRL2, cr>>16);
00147 ad9854Write(AD9854_REG_CTRL3, cr>>24);
00148 }
00149
00150 void ad9854WriteAmplitudeI(u16 ampi)
00151 {
00152 ad9854Write(AD9854_REG_AMPLIL, ampi);
00153 ad9854Write(AD9854_REG_AMPLIH, ampi>>8);
00154 }
00155
00156 void ad9854WriteAmplitudeQ(u16 ampq)
00157 {
00158 ad9854Write(AD9854_REG_AMPLQL, ampq);
00159 ad9854Write(AD9854_REG_AMPLQH, ampq>>8);
00160 }
00161
00162 void ad9854WriteOSKeyRampRate(u16 ramprate)
00163 {
00164 ad9854Write(AD9854_REG_OSKEYRAMP, ramprate);
00165 }
00166
00167 void ad9854WriteQDAC(u16 qdac)
00168 {
00169 ad9854Write(AD9854_REG_QDACL, qdac);
00170 ad9854Write(AD9854_REG_QDACH, qdac>>8);
00171 }
00172
00173 u32 ad9854ReadControlReg(void)
00174 {
00175 u32 cr=0;
00176 cr = (ad9854Read(AD9854_REG_CTRL0) & 0x000000FF);
00177 cr |= (ad9854Read(AD9854_REG_CTRL1) & 0x000000FF)<<8;
00178 cr |= (ad9854Read(AD9854_REG_CTRL2) & 0x000000FF)<<16;
00179 cr |= (ad9854Read(AD9854_REG_CTRL3) & 0x000000FF)<<24;
00180 return cr;
00181 }
00182
00183 void ad9854ControlClear(u32 cr_clear)
00184 {
00185 u32 cr;
00186
00187 cr = ad9854ReadControlReg();
00188
00189 cr &= ~cr_clear;
00190
00191 ad9854WriteControlReg(cr);
00192 }
00193
00194 void ad9854ControlSet(u32 cr_set)
00195 {
00196 u32 cr;
00197
00198 cr = ad9854ReadControlReg();
00199
00200 cr |= cr_set;
00201
00202 ad9854WriteControlReg(cr);
00203 }
00204
00205 void ad9854SetMode(int mode)
00206 {
00207 u32 cr;
00208
00209 cr = ad9854ReadControlReg();
00210
00211 cr &= ~AD9854_MODE_MASK;
00212 cr |= (mode<<9) & AD9854_MODE_MASK;
00213
00214 ad9854WriteControlReg(cr);
00215 }
00216
00217 void ad9854SetPLL(int enabled, int mult)
00218 {
00219 u32 cr;
00220
00221 cr = ad9854ReadControlReg();
00222
00223 if(enabled)
00224 {
00225 cr &= ~AD9854_PLL_BYPASS;
00226
00227 Ad9854RefClkMult = mult;
00228 }
00229 else
00230 {
00231 cr |= AD9854_PLL_BYPASS;
00232
00233 Ad9854RefClkMult = 1;
00234 }
00235
00236 cr &= ~AD9854_PLL_MULT_MASK;
00237 cr |= (mult<<16) & AD9854_PLL_MULT_MASK;
00238
00239 ad9854WriteControlReg(cr);
00240 }
00241
00242 void ad9854SetFreq1(u32 freqHz)
00243 {
00244 u64 ftw;
00245
00246
00247
00248
00249 if(freqHz < 0x1000)
00250 {
00251 ftw = (((u64)freqHz<<33)/(AD9854_REFCLK_FREQ*Ad9854RefClkMult))<<15;
00252 }
00253 else if(freqHz < 0x10000)
00254 {
00255 ftw = (((u64)freqHz<<32)/(AD9854_REFCLK_FREQ*Ad9854RefClkMult))<<16;
00256 }
00257 else if(freqHz < 0x1000000)
00258 {
00259 ftw = (((u64)freqHz<<32)/(AD9854_REFCLK_FREQ*Ad9854RefClkMult))<<16;
00260
00261 }
00262 else
00263 {
00264 ftw = (((u64)freqHz<<32)/(AD9854_REFCLK_FREQ*Ad9854RefClkMult))<<16;
00265
00266 }
00267 ad9854WriteFreq1(ftw);
00268 }
00269
00270 void ad9854SetUpdateClock(u32 updclockHz)
00271 {
00272 u32 updclock;
00273
00274 if(updclockHz)
00275 {
00276
00277
00278
00279
00280 updclock = ((AD9854_REFCLK_FREQ*Ad9854RefClkMult)/(2*updclockHz))-1;
00281
00282
00283 ad9854ControlClear(AD9854_INT_IO_UPDATE);
00284
00285 ad9854WriteUpdateClock(updclock);
00286
00287 ad9854ControlSet(AD9854_INT_IO_UPDATE);
00288
00289 ad9854SetupIOUpdate(1);
00290 ad9854ClockIOUpdate();
00291 ad9854SetupIOUpdate(0);
00292 }
00293 else
00294 {
00295
00296 ad9854ControlClear(AD9854_INT_IO_UPDATE);
00297
00298 ad9854SetupIOUpdate(0);
00299 }
00300
00301 }
00302
00303 void ad9854ShowRegisters(void)
00304 {
00305
00306
00307 rprintfStr("Phase1 : 0x");
00308 rprintfu08(ad9854Read(AD9854_REG_PHASE1H));
00309 rprintfu08(ad9854Read(AD9854_REG_PHASE1L));
00310 rprintfCRLF();
00311
00312 rprintfStr("Phase2 : 0x");
00313 rprintfu08(ad9854Read(AD9854_REG_PHASE2H));
00314 rprintfu08(ad9854Read(AD9854_REG_PHASE2L));
00315 rprintfCRLF();
00316
00317 rprintfStr("Freq1 : 0x");
00318 rprintfu08(ad9854Read(AD9854_REG_FREQ15));
00319 rprintfu08(ad9854Read(AD9854_REG_FREQ14));
00320 rprintfu08(ad9854Read(AD9854_REG_FREQ13));
00321 rprintfu08(ad9854Read(AD9854_REG_FREQ12));
00322 rprintfu08(ad9854Read(AD9854_REG_FREQ11));
00323 rprintfu08(ad9854Read(AD9854_REG_FREQ10));
00324 rprintfCRLF();
00325
00326 rprintfStr("Freq2 : 0x");
00327 rprintfu08(ad9854Read(AD9854_REG_FREQ25));
00328 rprintfu08(ad9854Read(AD9854_REG_FREQ24));
00329 rprintfu08(ad9854Read(AD9854_REG_FREQ23));
00330 rprintfu08(ad9854Read(AD9854_REG_FREQ22));
00331 rprintfu08(ad9854Read(AD9854_REG_FREQ21));
00332 rprintfu08(ad9854Read(AD9854_REG_FREQ20));
00333 rprintfCRLF();
00334
00335 rprintfStr("DeltaFreq : 0x");
00336 rprintfu08(ad9854Read(AD9854_REG_DELTA5));
00337 rprintfu08(ad9854Read(AD9854_REG_DELTA4));
00338 rprintfu08(ad9854Read(AD9854_REG_DELTA3));
00339 rprintfu08(ad9854Read(AD9854_REG_DELTA2));
00340 rprintfu08(ad9854Read(AD9854_REG_DELTA1));
00341 rprintfu08(ad9854Read(AD9854_REG_DELTA0));
00342 rprintfCRLF();
00343
00344 rprintfStr("Update Clock: 0x");
00345 rprintfu08(ad9854Read(AD9854_REG_UPDCLOCK3));
00346 rprintfu08(ad9854Read(AD9854_REG_UPDCLOCK2));
00347 rprintfu08(ad9854Read(AD9854_REG_UPDCLOCK1));
00348 rprintfu08(ad9854Read(AD9854_REG_UPDCLOCK0));
00349 rprintfCRLF();
00350
00351 rprintfStr("Ramp Rate : 0x");
00352 rprintfu08(ad9854Read(AD9854_REG_RAMPCLOCK2));
00353 rprintfu08(ad9854Read(AD9854_REG_RAMPCLOCK1));
00354 rprintfu08(ad9854Read(AD9854_REG_RAMPCLOCK0));
00355 rprintfCRLF();
00356
00357 rprintfStr("Control : 0x");
00358 rprintfu08(ad9854Read(AD9854_REG_CTRL3));
00359 rprintfu08(ad9854Read(AD9854_REG_CTRL2));
00360 rprintfu08(ad9854Read(AD9854_REG_CTRL1));
00361 rprintfu08(ad9854Read(AD9854_REG_CTRL0));
00362 rprintfCRLF();
00363
00364 rprintfStr("Amplitude I : 0x");
00365 rprintfu08(ad9854Read(AD9854_REG_AMPLIH));
00366 rprintfu08(ad9854Read(AD9854_REG_AMPLIL));
00367 rprintfCRLF();
00368
00369 rprintfStr("Amplitude Q : 0x");
00370 rprintfu08(ad9854Read(AD9854_REG_AMPLQH));
00371 rprintfu08(ad9854Read(AD9854_REG_AMPLQL));
00372 rprintfCRLF();
00373
00374 }
00375