Помощь - Поиск - Пользователи - Календарь
Полная версия этой страницы: Проблемы конфигурации AD9959 по SPI
Форум разработчиков электроники ELECTRONIX.ru > Аналоговая и цифровая техника, прикладная электроника > Rf & Microwave Design
ks007
Всем добрый день. У меня такая проблема не могу запустить AD99559. Питание в норме, тактую от внешнего генератора.
Проделываю следующие действия:

1. Включаю питание
2. Засылаю данные по SPI

Данные SPI
Код
//Данные инструкции
spi (0x00);
spi (0xF2);

spi (0x01);
spi (0xD0);
spi (0x00);
spi (0x00);

spi (0x02);
spi (0xA0);
spi (0x00);

spi (0x03);
spi (0x00);
spi (0x03);
spi (0x04);

//Данные настройки частоты
spi (0x04);
spi (0x02);
spi (0x8F);
spi (0x5C);
spi (0x29);

В ответ на каналах тишина.
Временная диаграмма записи в SPI показана на рисунке.

Что не так не пойму, может кто-то работал с данной микросхемой?

C пином RESET что делать?
Заранее благодарен
Ant_m
1) сбрасывать обязательно.
2) Читайте про FR2 внимательно.
IO_Update применяете?

Код
   /* Write CSR */
  DDS_SendByte(0x00);
  DDS_SendByte(0xF2); // channel 0-3 enable; single-bit serial (3-wire mode)
  DDS_Update(); // Need for switch in 3-wire mode
  //---------------------
  /* Write FR1 */
#ifdef Generator125M_clk
  DDS_SendByte(0x01); // CMD
  DDS_SendByte(0x90); /* FR1 = 0x900000: VCO = High, PLL = 4 */
  DDS_SendByte(0x00);
  DDS_SendByte(0x00);
#endif //Generator125M_clk
  /* Write FR2 */
  DDS_SendByte(0x02); // CMD
  DDS_SendByte(0x00);
  DDS_SendByte(0x00);

  DDS_SendByte(0x00); // CMD
  DDS_SendByte(0x32); // channel 0,1 enable; single-bit serial (3-wire mode)

  /* Write CFR */
  DDS_SendByte(0x03); // CMD
  DDS_SendByte(0x40); //40 amplitude modulation!!
  DDS_SendByte(0x03);
  DDS_SendByte(0x20);

  /* Write Amplitude control register (ASR) */
  DDS_SendByte(0x06); // CMD
  DDS_SendByte(0x00);
  DDS_SendByte(0x00); // set amplitude 0
  DDS_SendByte(0x00);

  /* Profile registers */
  DDS_SendByte(0x0A); // CMD
  DDS_SendByte(0xFF); // set amplitude 1023
  DDS_SendByte(0xFF);
  DDS_SendByte(0x00);
  DDS_SendByte(0x00);
  
  DDS_Update();
ks007
Цитата(Ant_m @ Jan 13 2014, 08:40) *
IO_Update применяете?

Спасибо за ответ.
IO_Update применяю. У меня есть вопросы.
1)Когда применять IO_Update? После загрузки данных если я правильно понимаю.
2)Reset когда применять?

Моя последовательность действий:
1)Включение питания.
2)Пином CS выбираю(подтягиваю к нулю) DDS AD9959.
3)Даю импульс RESET
4)Выставляю в регистр CSR необходимое значение (мой случай 0xF2).
5)Выставляю в регистр FR1 необходимое значение.
6)Выставляю в регистр FR2 необходимое значение.
7)Выставляю в регистр CFR необходимое значение.
8)Выставляю в регистр CFTW необходимое значение.
9)Даю импульс IO_Update.
10)CS подтягиваю к единице.
megajohn
Цитата(ks007 @ Jan 13 2014, 06:07) *
тактую от внешнего генератора.


Чему равна частота ? А то моежтся получится что попадаете в недопустимый диапазон 160-255 MHZ
ks007
Цитата(megajohn @ Jan 16 2014, 13:18) *
Чему равна частота ? А то моежтся получится что попадаете в недопустимый диапазон 160-255 MHZ

25 МГц.
Profile Register нужно ли их обязательно использовать?
megajohn
попробуйте прошивать только регистры FR1 и CFTW0. А остальные юзать по умолчанию
Ant_m
Profile Register нужны если вы собираетесь делать модуляцию.
Reset надо подавать после подачи опорной частоты, есстественно если есть питание sm.gif.
IO_Update можно применять после записи всех регистров.

Я убил кучу времени из-за Default Value CFR[7:0] = 0x02, пытаясь записать туда значение по умолчанию smile3046.gif
ks007
Цитата(Ant_m @ Jan 16 2014, 14:14) *
Я убил кучу времени из-за Default Value CFR[7:0] = 0x02, пытаясь записать туда значение по умолчанию smile3046.gif

Пока ничего не выходит. Может дело в железе. Если у вас есть точно работающая последовательность загрузки по SPI, не могли бы вы привести, чтобы увидеть хоть какой-то сигнал на выходе любого канала. Если не поможет проверю еще раз железо.
Благодарю за ответы.
Ant_m
Мой код, который выше, надо немного модифицировать. Замените блок:
Код
  /* Write FR1 */
#ifdef Generator125M_clk
  DDS_SendByte(0x01); // CMD
  DDS_SendByte(0x90); /* FR1 = 0x900000: VCO = High, PLL = 4 */
  DDS_SendByte(0x00);
  DDS_SendByte(0x00);
#endif //Generator125M_clk

на
Код
#ifdef Qartz25M_500clk
  DDS_SendByte(0x01); // CMD
  DDS_SendByte(0xD0); /* FR1 = 0xD00000: VCO = High, PLL = 20 */
  DDS_SendByte(0x00);
  DDS_SendByte(0x00);
#endif //Qartz25M_500clk


Добавьте где нибудь перед нижней строчкой DDS_Update() блок
Код
  /* Write Frequency Tuning Word (CFTW0) */
  DDS_SendByte(0x04); // CMD
  DDS_SendByte(0х33); // 100MHz
  DDS_SendByte(0х33);
  DDS_SendByte(0х33);
  DDS_SendByte(0х33);


Учтите у меня амплитудная модуляция с помощью выводов P0-P3, чтобы увидеть 100МГц на выходе надо на эти выводы подать "1". Либо правьте регистры CFR, ACR.
ks007
Цитата(Ant_m @ Jan 17 2014, 11:37) *
Мой код, который выше, надо немного модифицировать.

Еще раз огромное спасибо. На работе попробую. Как будет результат напишу.
Для просмотра полной версии этой страницы, пожалуйста, пройдите по ссылке.
Invision Power Board © 2001-2025 Invision Power Services, Inc.