Из гостевой книги от 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