Перейти к содержанию
    

Использовавшим DDS ad9959 или 9958

Понимаю, что этот вопрос надо писать в разделе для чайников, но спрошу здесь. Есть проэкт на данной микросхеме (9959) все сигналы на нее приходят вроде правильно. Клок приходит, на ноге syncclock я, как и написано в glat вижу его, поделенный на 4. теперь пытаюсь ее запрограммировать. Подаю ресет(1мс) для сброса, CS вниз, IO update тоже вниз. передаю 5 байт ( первый байт - номер регистра (0х4) затем 4 байта настройка выходной частоты. затем поднимаю ioupdate и снимаю CS. Все. Но никакой реакции на выходе не получаю. Что я делаб не так??? Уже третий день сижу как дурак, а толку ноль. Любые, пусть даже самые нетривиальные мысли приветствуются.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

1) После Reset обнуляются ВСЕ регистры, в том числе и регистр управления тактированием Clkmodeselect, который определяет использование внутреннего аппаратного умножителя тактовой и его значение (от 4 до 20) - очень похоже на причину отказа. Попробуйте не сбрасывать, а обходиться IO_Update и CS.

2) Проверьте настройки остальных регистров.

3) Желательно контролировать состояние пинов IO_Update и CS? (кстати, CS инверсный: для передачи данных нужно подавать 0) - логическим анализатором или осциллографом;

 

4) Сменить интерфейс загрузки - SPI на TWI или наоборот :-))

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

1) После Reset обнуляются ВСЕ регистры, в том числе и регистр управления тактированием Clkmodeselect, который определяет использование внутреннего аппаратного умножителя тактовой и его значение (от 4 до 20) - очень похоже на причину отказа. Попробуйте не сбрасывать, а обходиться IO_Update и CS.

2) Проверьте настройки остальных регистров.

3) Желательно контролировать состояние пинов IO_Update и CS? (кстати, CS инверсный: для передачи данных нужно подавать 0) - логическим анализатором или осциллографом;

 

4) Сменить интерфейс загрузки - SPI на TWI или наоборот :-))

 

После долгого копания удалось добиться, что pll начала программироваться, могу управлять выдачей всех синкклоков и включать-выключать DAC. Причем при его выключении на его ноге появляется напряжение подтяжки. при включении - ноль. сигнала нет. сдается мне, что дело в регистре амплитуды, но никак не могу с ним разобраться.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Посмотрите настройки Control Function Register 1 (CFR1) - в нем есть 4-й бит "разрешение выхода синуса" (Enable Sine Output - должен быть установлен в 1) и 2-й бит "Очистка аккумулятора фазы" (Clear Phase Accum. - в 0) - проверьте их настройку.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Посмотрите настройки Control Function Register 1 (CFR1) - в нем есть 4-й бит "разрешение выхода синуса" (Enable Sine Output - должен быть установлен в 1) и 2-й бит "Очистка аккумулятора фазы" (Clear Phase Accum. - в 0) - проверьте их настройку.

Вы ничего не путаете? В регистре CFR есть бит enable sinus output, но он нулевой(по номеру) и определет лишь выдачу либо синуса либо косинуса.

Еще вопрос - вы с этой или подобной микросхемой работали или читаете пдф? если работали не осталось ли у вас куска кода? заранее спасибо.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Путаю, видимо - у меня 9951. Код ещё не написал, в процессе. Вы уже пользовались девичей утилитой ADIsimDDS - если нет, посмотрите

http://designtools.analog.com/dtDDSWeb/dtD...spx?part=AD9958

Правда, готовый код для мк она не выдаст...(

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

2Миша - эта приблуда от analoga слов нет одни эмоции. когда я год назад делал проэкт на 9834 она была не в пример лучше. все прям по регистрам. красота.

2khach Спасибо. сижу разгребаю.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Может поможет этот код, здесь описана последовательность как я инициализирую ДДСку и парочка значений. На 3 аргумент функции записи не обращайте внимание

 

//DDS Register Map
  #define DDS_CSR_REG   0x00
  #define DDS_FR1_REG   0x01
  #define DDS_FR2_REG   0x02
  #define DDS_CFR_REG   0x03
  #define DDS_CTW0_REG  0x04
  #define DDS_CPW0_REG  0x05
  #define DDS_ACR_REG   0x06
  #define DDS_LSR_REG   0x07
  #define DDS_RDW_REG   0x08
  #define DDS_FDW_REG   0x09
  #define DDS_CTW1_REG  0x0A
  
  #define Chanel0_Select 0x42
  #define Chanel1_Select 0x82
  #define ChanelS_Select 0xC2
  

  #define Init_Function_Register1   0x00505000&0x83ffff  
  #define Init_Function_Register2   0x0    
  #define Init_Function_Register3_0 0x00000301
  #define Init_Function_Register3_1 0x00000301
  #define StartSweep                0x0080E014
  #define StopSweep                 0x0000000A



int DDS_Init (unsigned int qmult)
{

unsigned char last=1;
unsigned int data;
unsigned char f;

DDS_WriteData (DDS_CSR_REG, Chanel0_Select, 1);
data=qmult&0x1f;
data=(Init_Function_Register1&0x83ffff)|(data<<18);
DDS_WriteData (DDS_FR1_REG, data, 1); 
DDS_WriteData (DDS_FR2_REG, Init_Function_Register2, 1); 
DDS_WriteData (DDS_CFR_REG, Init_Function_Register3_0, last);
DDS_IO_Update();
f=DDS_ReadData(DDS_CSR_REG, &data);  
if (((data&0xFF)!=Chanel0_Select)||(f!=1))
{
   return f;
}
DDS_WriteData (DDS_CSR_REG, Chanel1_Select, 1);
DDS_WriteData (DDS_CFR_REG, Init_Function_Register3_1, last);
DDS_IO_Update();
f=DDS_ReadData(DDS_CSR_REG, &data);  
if (((data&0xFF)!=Chanel1_Select)||(f!=1))  
{                                
   return f;                   
}                                
return 1;
}

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Я так понял, что это под 9958. не помогло. может я не вижу очевидных вещей? Вот мой кусок кода. Посмотрите его, если не сложно.

 

cs1(0); //chipselect =0

spi(0x00);

spi (0xF2); //all chanels en

 

 

 

spi(0x01); //clock mult x10

spi (0x28);

spi (0x00);

spi (0x00);

iop(); //io update

 

 

spi (0x03); //CFR

spi (0x00);

spi (0x03);

spi (0x01);

iop();

 

spi(0x04); // freq code

spi (0x01);

spi (0x40);

spi (0xA2);

spi (0x14);

iop();

 

cs1(1);

 

Посылки по SPI я вижу. результат - на выходе даков чистый ноль.

При этом на ноге sync clock я как и положено вижу опрный клок умноженый на 10 и деленный на 4.

Изменено пользователем MaFIA

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Забыл сказать еще одну вещь :) сорри

 

после Init_DDS

 

 
void DDS_SetStartFreq (unsigned int startfreq, unsigned int chanel)
{
if (!chanel) DDS_WriteData (DDS_CSR_REG, Chanel0_Select, 1);
else DDS_WriteData (DDS_CSR_REG, Chanel1_Select, 1);
DDS_WriteData (DDS_CTW0_REG, startfreq, 1);
}

void DDS_SetStopFreq (unsigned int stopfreq, unsigned int chanel)
{
if (!chanel) DDS_WriteData (DDS_CSR_REG, Chanel0_Select, 1);                                            
else DDS_WriteData (DDS_CSR_REG, Chanel1_Select, 1);
DDS_WriteData (DDS_CTW1_REG, stopfreq, 1); 
}

void DDS_ScanPrepare (STData *td)
{
    
DDS_WriteData (DDS_CSR_REG, ChanelS_Select, 1);
DDS_WriteData (DDS_CFR_REG, Init_Function_Register3_0 | StopSweep, 1); 
DDS_IO_Update ();

DDS_SetStartFreq (td->StartFreq0, 0);
DDS_SetStopFreq (td->StopFreq0, 0);

DDS_SetStartFreq (td->StartFreq1, 1);
DDS_SetStopFreq (td->StopFreq1, 1);

DDS_WriteData (DDS_CSR_REG, ChanelS_Select, 1); 
DDS_WriteData (DDS_LSR_REG, td->RampRate, 1);
DDS_WriteData (DDS_RDW_REG, td->DeltaFreq, 1);
DDS_WriteData (DDS_CFR_REG, Init_Function_Register3_0 | StartSweep, 1);  
DDS_IO_Update (); //Здесь на выходе должны появится сигналы
}

 

Это я дал пример для моего случая, но порядок записи в регистры лучше придерживаться.

И еще кой какие замечания:

 

1. IOUPDATE не надо делать после каждой записи в регистр

Each set of communication cycles does not require an

I/O_UPDATE to be issued. The I/O_UPDATE transfers data

from the I/O port buffer to active registers. The I/O_UPDATE

can be sent for each communication cycle or can be sent when

all serial operations are complete. However, data is not active

until an I/O_UPDATE is sent, with the exception of the channel

enable bits in the Channel Select Register (CSR). These bits do

not require an I/O_UPDATE to be enabled.

 

2. Записали Вы к примеру в DDS_CSR_REG значение F2, пробовали прочитать обратно? (какой результат)

 

3. Если не читается (п.2), проверте SDIO(0-3) ноги, в моем случае (AD9958) SDIO_3 должно быть на земле, иначе SPI не работает (я о режиме когда SDIO_2=DO, SDIO_0=DI)

 

Успехов!!!

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

из всех регистров читается то, что я туда пишу. Если не сложно структуру Td покажите. Спасибо.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

В моем случае ДДСка программируется на линейный свип, ноудвелл.

Здесь приводится мой расчет, но Вам думаю врядли это поможет, почитайте доку:

 

 typedef struct _STData
{
unsigned int StartFreq0;
unsigned int StopFreq0;
unsigned int StartFreq1;
unsigned int StopFreq1;
unsigned int RampRate;
unsigned int DeltaFreq;
double fstep;
double calcspan;
double frspan;
} STData;
  ..........

  double KCoeff=60;
  double MCoeff=15;
  unsigned int timer_reg;
  double dmod32=4294967296.0;
  double startfreq;
  double stopfreq;
  double tspan=*span;
  
  ........

  timer_reg = 8; 
  td->RampRate = averen? (timer_reg<<avernum) : timer_reg;
  td->fstep = 4.0*tspan * (double)timer_reg/((double)packlen * KCoeff * (MCoeff+1) * qmult);                     
  td->DeltaFreq = (unsigned int)(td->fstep*dmod32/(Synt_clock_freq*qmult) + 0.5); //Delta Freq                                     
  td->calcspan = (double)td->DeltaFreq*(Synt_clock_freq*qmult)*((double)(packlen*KCoeff*(MCoeff+1)*qmult))/(4.0*dmod32*((double)timer_reg));                                                                                          
  *span = td->calcspan;
  td->frspan=td->calcspan;
  startfreq = td->BaseFreq - td->calcspan/2.0;                                                                                          
  stopfreq = td->BaseFreq + td->calcspan/2.0;
  td->StartFreq0 = (unsigned int)(startfreq/(Synt_clock_freq*qmult)*dmod32+0.5);
  td->StopFreq0 = (unsigned int)(stopfreq/(Synt_clock_freq*qmult)*dmod32+0.5);
  td->StartFreq1 = (unsigned int)((startfreq+dfreq)/(Synt_clock_freq*qmult)*dmod32+0.5);
  td->StopFreq1 = (unsigned int)((stopfreq+dfreq)/(Synt_clock_freq*qmult)*dmod32+0.5);
...........

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

ВСЕ!!! победил. Дело было не в бобине :) оказалось, что я вместо 50омных резисторов подтяжки выхода запаял 1.8к. вот и все. Огромное спасибо всем откликнувшимся!

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Присоединяйтесь к обсуждению

Вы можете написать сейчас и зарегистрироваться позже. Если у вас есть аккаунт, авторизуйтесь, чтобы опубликовать от имени своего аккаунта.

Гость
Ответить в этой теме...

×   Вставлено с форматированием.   Вставить как обычный текст

  Разрешено использовать не более 75 эмодзи.

×   Ваша ссылка была автоматически встроена.   Отображать как обычную ссылку

×   Ваш предыдущий контент был восстановлен.   Очистить редактор

×   Вы не можете вставлять изображения напрямую. Загружайте или вставляйте изображения по ссылке.

×
×
  • Создать...