реклама на сайте
подробности

 
 
 
Reply to this topicStart new topic
> Использовавшим DDS ad9959 или 9958, совсем запутался с программирование
MaFIA
сообщение Oct 4 2006, 11:41
Сообщение #1


Участник
*

Группа: Свой
Сообщений: 30
Регистрация: 10-03-05
Из: Москва
Пользователь №: 3 213



Понимаю, что этот вопрос надо писать в разделе для чайников, но спрошу здесь. Есть проэкт на данной микросхеме (9959) все сигналы на нее приходят вроде правильно. Клок приходит, на ноге syncclock я, как и написано в glat вижу его, поделенный на 4. теперь пытаюсь ее запрограммировать. Подаю ресет(1мс) для сброса, CS вниз, IO update тоже вниз. передаю 5 байт ( первый байт - номер регистра (0х4) затем 4 байта настройка выходной частоты. затем поднимаю ioupdate и снимаю CS. Все. Но никакой реакции на выходе не получаю. Что я делаб не так??? Уже третий день сижу как дурак, а толку ноль. Любые, пусть даже самые нетривиальные мысли приветствуются.
Go to the top of the page
 
+Quote Post
Миша
сообщение Oct 4 2006, 13:23
Сообщение #2


Частый гость
**

Группа: Новичок
Сообщений: 90
Регистрация: 1-12-05
Из: г. Сарапул
Пользователь №: 11 631



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

4) Сменить интерфейс загрузки - SPI на TWI или наоборот :-))
Go to the top of the page
 
+Quote Post
MaFIA
сообщение Oct 5 2006, 11:52
Сообщение #3


Участник
*

Группа: Свой
Сообщений: 30
Регистрация: 10-03-05
Из: Москва
Пользователь №: 3 213



Цитата(Миша @ Oct 4 2006, 17:23) *
1) После Reset обнуляются ВСЕ регистры, в том числе и регистр управления тактированием Clkmodeselect, который определяет использование внутреннего аппаратного умножителя тактовой и его значение (от 4 до 20) - очень похоже на причину отказа. Попробуйте не сбрасывать, а обходиться IO_Update и CS.
2) Проверьте настройки остальных регистров.
3) Желательно контролировать состояние пинов IO_Update и CS? (кстати, CS инверсный: для передачи данных нужно подавать 0) - логическим анализатором или осциллографом;

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


После долгого копания удалось добиться, что pll начала программироваться, могу управлять выдачей всех синкклоков и включать-выключать DAC. Причем при его выключении на его ноге появляется напряжение подтяжки. при включении - ноль. сигнала нет. сдается мне, что дело в регистре амплитуды, но никак не могу с ним разобраться.
Go to the top of the page
 
+Quote Post
Миша
сообщение Oct 5 2006, 14:18
Сообщение #4


Частый гость
**

Группа: Новичок
Сообщений: 90
Регистрация: 1-12-05
Из: г. Сарапул
Пользователь №: 11 631



Посмотрите настройки Control Function Register 1 (CFR1) - в нем есть 4-й бит "разрешение выхода синуса" (Enable Sine Output - должен быть установлен в 1) и 2-й бит "Очистка аккумулятора фазы" (Clear Phase Accum. - в 0) - проверьте их настройку.
Go to the top of the page
 
+Quote Post
MaFIA
сообщение Oct 5 2006, 14:41
Сообщение #5


Участник
*

Группа: Свой
Сообщений: 30
Регистрация: 10-03-05
Из: Москва
Пользователь №: 3 213



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

Вы ничего не путаете? В регистре CFR есть бит enable sinus output, но он нулевой(по номеру) и определет лишь выдачу либо синуса либо косинуса.
Еще вопрос - вы с этой или подобной микросхемой работали или читаете пдф? если работали не осталось ли у вас куска кода? заранее спасибо.
Go to the top of the page
 
+Quote Post
Миша
сообщение Oct 6 2006, 06:08
Сообщение #6


Частый гость
**

Группа: Новичок
Сообщений: 90
Регистрация: 1-12-05
Из: г. Сарапул
Пользователь №: 11 631



Путаю, видимо - у меня 9951. Код ещё не написал, в процессе. Вы уже пользовались девичей утилитой ADIsimDDS - если нет, посмотрите
http://designtools.analog.com/dtDDSWeb/dtD...spx?part=AD9958
Правда, готовый код для мк она не выдаст...(
Go to the top of the page
 
+Quote Post
khach
сообщение Oct 6 2006, 06:54
Сообщение #7


Гуру
******

Группа: Свой
Сообщений: 3 439
Регистрация: 29-12-04
Пользователь №: 1 741



Тут есть исходники на AD9954, но для PIChttp://www.kd7lmo.net/picobeacon.html
Go to the top of the page
 
+Quote Post
MaFIA
сообщение Oct 6 2006, 08:18
Сообщение #8


Участник
*

Группа: Свой
Сообщений: 30
Регистрация: 10-03-05
Из: Москва
Пользователь №: 3 213



2Миша - эта приблуда от analoga слов нет одни эмоции. когда я год назад делал проэкт на 9834 она была не в пример лучше. все прям по регистрам. красота.
2khach Спасибо. сижу разгребаю.
Go to the top of the page
 
+Quote Post
Camelot
сообщение Oct 6 2006, 13:27
Сообщение #9


Частый гость
**

Группа: Свой
Сообщений: 182
Регистрация: 10-01-05
Пользователь №: 1 872



Может поможет этот код, здесь описана последовательность как я инициализирую ДДСку и парочка значений. На 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;
}
Go to the top of the page
 
+Quote Post
MaFIA
сообщение Oct 6 2006, 14:46
Сообщение #10


Участник
*

Группа: Свой
Сообщений: 30
Регистрация: 10-03-05
Из: Москва
Пользователь №: 3 213



Я так понял, что это под 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 - Oct 6 2006, 14:48
Go to the top of the page
 
+Quote Post
Camelot
сообщение Oct 6 2006, 16:35
Сообщение #11


Частый гость
**

Группа: Свой
Сообщений: 182
Регистрация: 10-01-05
Пользователь №: 1 872



Забыл сказать еще одну вещь smile.gif сорри

после 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)

Успехов!!!
Go to the top of the page
 
+Quote Post
MaFIA
сообщение Oct 9 2006, 13:10
Сообщение #12


Участник
*

Группа: Свой
Сообщений: 30
Регистрация: 10-03-05
Из: Москва
Пользователь №: 3 213



из всех регистров читается то, что я туда пишу. Если не сложно структуру Td покажите. Спасибо.
Go to the top of the page
 
+Quote Post
Camelot
сообщение Oct 9 2006, 15:40
Сообщение #13


Частый гость
**

Группа: Свой
Сообщений: 182
Регистрация: 10-01-05
Пользователь №: 1 872



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

Код
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);
...........
Go to the top of the page
 
+Quote Post
MaFIA
сообщение Oct 11 2006, 15:35
Сообщение #14


Участник
*

Группа: Свой
Сообщений: 30
Регистрация: 10-03-05
Из: Москва
Пользователь №: 3 213



ВСЕ!!! победил. Дело было не в бобине smile.gif оказалось, что я вместо 50омных резисторов подтяжки выхода запаял 1.8к. вот и все. Огромное спасибо всем откликнувшимся!
Go to the top of the page
 
+Quote Post

Reply to this topicStart new topic
1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0

 


RSS Текстовая версия Сейчас: 22nd July 2025 - 00:31
Рейтинг@Mail.ru


Страница сгенерированна за 0.01503 секунд с 7
ELECTRONIX ©2004-2016