Из гостевой книги от 03.09.2008

Несколько дней бьюсь, не могу реализовать режим Direct Switch на AD9954.
CFR1 0x80 <31:24>
0x00
0x02
0x00 <7:0>
RAMSegmentCW(0-профиль, 0-Mode ,0-No-DWELL, 0-begin adr,0- finish adr,0-RampRate);
RAMSegmentCW(1, 0,0, 1,1,0);
затем пишу две частоты в RAM
writeDDS(0xb) // PS0=0 PS1=0
writeDDSFreq(5);//5МГц
writeDDSFreq(10);//10МГц PS0=1 PS1=0
DDSUpdate();
далее переключаю PS0 1/0, а излучается только частота 5 Мгц.
Уже всю голову сломал. Подскажите пожалуйста в чем ошибка.

20.09.2008

Согласно Data Sheet AD9954 - DETAILED PROGRAMMING EXAMPLES - RAM MODE, получается вот такой код:

    
	// Александр Покладов 20.09.2008
	// Настройка  AD9954 для работы в режиме выдачи двух частот

#include "Hard_Init.h"

void two_freq(void){    //проверка выдачи двух частот
  int f1, f2, i;
  double dFs, dFo;  

  Displ_full_Rectangle (0, 0, 175, 132, FON_G); //clear display
  _Freq_End = 5000000; 	// первая частота
  _Freq = 10000000; 		// вторая частота
  
  SPI_PLD (6, WR, 7); // установка амплитуды - это уже к кокретной реализации аппаратуры
  SPI_CfgCsC();   // Записать в DDS
  Write_DDS(ASF); // address
  Write_DDS(0x3F); // [15..8] - максимальная амплитуда
  Write_DDS(0xFF); // [7..0]
  SPI_CfgCsE(); // CS DDS = '1'
  
  
  SPI_PLD (2, WR, 0x04); //(int adr, int rd_wr, int data) - P0 and P1 = 0


  dFs = FS; // #define FS (18432000 * 20.0) //частота DDS Hz
  dFo = _Freq_End;  
  dFo = (dFo / dFs) * 0xFFFFFFFF; //Вычисление коеффициента для установки частоты в DDS
  f1 = dFo;
  dFs = FS;
  dFo = _Freq;  
  dFo = (dFo / dFs) * 0xFFFFFFFF; //Вычисление коеффициента для установки частоты в DDS
  f2 = dFo;  
  
  
// config DDS
  SPI_CfgCsC();//AT91F_SPI_CfgCs(pSPI, 3, SPI_NPCS3_C_CONFIG);
  Write_DDS(CFR1); // address CFR1
  Write_DDS(0x82);// [31..24]
  Write_DDS(0x00);// [23..16]
  Write_DDS(0x70);//  [15..8]
  Write_DDS(0x00);//   [7..0]
  SPI_CfgCsE();
  
  SPI_CfgCsC();
  Write_DDS(CFR2); // address
  Write_DDS(0x00); // [23..16]
  Write_DDS(0x00);
  Write_DDS((20<<3) | 0x07); // [7..0]
  SPI_CfgCsE();
  
  SPI_CfgCsC();
  Write_DDS(RSCW0); // address RSCW0
  Write_DDS(0x01);// [39..32]
  Write_DDS(0x00);// [31..24]
  Write_DDS(0x63);// [23..16]
  Write_DDS(0x00);//  [15..8]
  Write_DDS(0x20);//   [7..0]
  SPI_CfgCsE();
  
  SPI_CfgCsC();
  Write_DDS(RSCW3); // address RSCW3
  Write_DDS(0x01);// [39..32]
  Write_DDS(0x00);// [31..24]
  Write_DDS(0xC7);// [23..16]
  Write_DDS(0x90);//  [15..8]
  Write_DDS(0x21);//   [7..0]
  SPI_CfgCsE();  
  
  SPI_PLD (2, WR, 0x04); //(int adr, int rd_wr, int data) - P0 and P1 = static = 0
  SPI_CfgCsC();
  Write_DDS(RAM);
  for (i = 0; i < 100; i++){ // запись 100 значений по адресу в RSCW0
    Write_DDS((f1 >> 24) & 0xFF);// [31..24]
    Write_DDS((f1 >> 16) & 0xFF);// [23..16]
    Write_DDS((f1 >> 8) & 0xFF);//  [15..8]
    Write_DDS(f1 & 0xFF);//   [7..0]
  }
  SPI_CfgCsE();

  SPI_PLD (2, WR, 0x07); //(int adr, int rd_wr, int data) - P0 and P1 = static = 3
  SPI_CfgCsC();
  Write_DDS(RAM);
  for (i = 0; i < 100; i++){ // запись 100 значений по адресу в RSCW1
    Write_DDS((f2 >> 24) & 0xFF);// [31..24]
    Write_DDS((f2 >> 16) & 0xFF);// [23..16]
    Write_DDS((f2 >> 8) & 0xFF);//  [15..8]
    Write_DDS(f2 & 0xFF);//   [7..0]
  }
  SPI_CfgCsE();  
  
  // выдача двух частот - управление P0 and P1
  while (1){ 
    SPI_PLD (2, WR, 0x04); //(int adr, int rd_wr, int data) - P0 and P1 = 0
    Delay_mks (20);
    SPI_PLD (2, WR, 0x07); //(int adr, int rd_wr, int data) - P0 and P1 = 1
    Delay_mks (10);    
  }
}	

на главную

последнее изменение 12.10.2008

 



Hosted by uCoz