Помощь - Поиск - Пользователи - Календарь
Полная версия этой страницы: AD9954 помоему Вообще не отвечает.
Форум разработчиков электроники ELECTRONIX.ru > Аналоговая и цифровая техника, прикладная электроника > Rf & Microwave Design
truebest
Добрый день уважаемые... Довелось мне помучаться с AD9954,
Но чтобы я не делал как бы не вертел ее нивкакую она не генерила, я пробовал и аппаратный SPI и програмный ничего. Осцилографом просматриваются идущие данные, клока, cs, резет, i/oupdate.

Для проверки заливаю в CFR2 байт 9 чтобы Crystal Out заработал...навыходе естественно получаю фиг...

Вообще цель делать бесконечный синус или косинус на 20мгц.

Схема ТУТ


DDS.C
Код
//IOSYNC
    #define IO_SYNC            _RB6
    #define TIOSYNC            _TRISB6
    //IOUPDATE
    #define IO_UPDATE            _RA8
    #define    TIOUPD            _TRISA8
    //DDS RESET
    #define RESET            _RB7
    #define TRESET            _TRISB7
    //CS
    #define IO_CS            _RC5
    #define TCSEE            _TRISC5
    //ОSK
    #define IO_OSK                _RA9
    #define TOSK            _TRISA9
    //PS0 PS1
    #define IO_PS0                _RA4
    #define TPS0            _TRISA4

    #define IO_PS1                _RB4
    #define TPS1            _TRISB4

#define DDS_AD9954_CFR1 0x00

#define DDS_AD9954_CFR2 0x01

#define DDS_AD9954_ASF 0x02

#define DDS_AD9954_ARR 0x03
#define DDS_AD9954_FTW0 0x04
#define DDS_AD9954_FTW1 0x06
#define DDS_AD9954_NLSCW 0x07
#define DDS_AD9954_PLSCW 0x08
#define DDS_AD9954_RWCW0 0x07
#define DDS_AD9954_RWCW1 0x08
#define DDS_RAM 0x0b
#define DDS_FREQ_TO_FTW_DIGITS 9


////PROTOTYPES
void initSPIM(void);
void InitDDS(void);
void delay(uint i);
void AD9954_RESET(void);
void spi_write(char data);
void ddsSetFTW (unsigned long ftw);
void ddsSetOutputScale (unsigned int scale);


//----------------------------------------------------------------------
void initSPIM(void)
{
IO_CS=1;
IO_PS1=0;
IO_PS0=0;
IO_OSK=0;
IO_UPDATE=0;
SPI1CON1=0x0120; /*13E;*/
SPI1STAT=0x8000;
IO_OSK=0;
}
///
void AD9954_RESET(void)
{
RESET=0;
RESET=1;
delay(2200);
RESET=0;
IO_CS=0;

}
///

void spi_write(char data)
{
SPI1BUF=data;
while(!SPI1STATbits.SPIRBF);
}
////

void ddsSetOutputScale (unsigned int scale)
{
     // Set ASF (Amplitude Scale Factor)
   IO_CS=0;
   spi_write (DDS_AD9954_ASF);

   spi_write ((scale >> 8) & 0xff);
   spi_write (scale & 0xff);

  IO_CS=1;
    
// Strobe the DDS to set the amplitude.
IO_UPDATE=1;
IO_UPDATE=0;
}
///
void ddsSetFTW (unsigned long ftw)
{

// Set FTW0 (Frequency Tuning Word 0)
IO_CS=0;;
spi_write (DDS_AD9954_FTW0);

spi_write ((ftw >> 24) & 0xff);
spi_write ((ftw >> 16) & 0xff);
spi_write ((ftw >> 8) & 0xff);
spi_write (ftw & 0xff);
IO_CS=1;
// Strobe the DDS to set the frequency.
IO_UPDATE=1;
IO_UPDATE=0;    

}


void InitDDS(void)
{
asm volatile ( "MOV #OSCCON, w1 \n"
        "MOV #0x46, w2 \n"
        "MOV #0x57, w3 \n"
        "MOV.b w2, [w1] \n"
        "MOV.b w3, [w1] \n"
        "BCLR OSCCON,#6"

RPINR20bits.SDI1R = 5;            // Assign SDI1 To Pin RP5
    //*************************************************************************
    // Configure Output Functions (Table 9-2)
    //*************************************************************************
    // SPI1
RPOR9bits.RP19R = 7;            // Assign SDO1 To Pin RP19
RPOR10bits.RP20R = 8;             // Assign SCK1OUT To Pin RP20
    //*************************************************************************

//Запрещаем изменение настроек переферии пин селект
    asm volatile ( "MOV #OSCCON, w1 \n"
        "MOV #0x46, w2 \n"
        "MOV #0x57, w3 \n"
        "MOV.b w2, [w1] \n"
        "MOV.b w3, [w1] \n"
        "BSET OSCCON, #6"
    );







AD9954_RESET();
    initSPIM();

// CFR1 (Control Function Register No. 1)
IO_CS=0;
spi_write (DDS_AD9954_CFR1);
spi_write (0x00);
spi_write (0x00);
spi_write (0x00);
spi_write (0x02);  // Power down all subsystems.
IO_CS=1;
//////////////////////

ddsSetOutputScale (0x3fff);
IO_CS=0;
spi_write (DDS_AD9954_ARR);
spi_write (181);
IO_CS=1;

///CFR2///////////
IO_CS=0;
spi_write (DDS_AD9954_CFR2);
spi_write (0x00);
spi_write (0x02);
spi_write (0xA7);
IO_CS=1;
IO_UPDATE=1;
IO_UPDATE=0;
//////////////////

while(1)
{ddsSetFTW(0x0CCCCCCD);
}

}
////

void delay(uint i)
{
while(i--);
}
////
Vlad27
А не заменить ли в функции spi_write(char data) SPI1STATbits.SPIRBF на SPI1STATbits.SPITBF ?
truebest
!SPI1STATbits.SPIRBF или SPI1STATbits.SPIRBF, зависит от того что у меня будет в регистре контроллера SPI1CON2 там бит SPI1CON2bits.SPIBEN отвечает за буфер, если его делаешь включенным(SPI1CON2bits.SPIBEN = ON;) то while(SPI1STATbits.SPITBF); если как у меня SPI1CON2bits.SPIBEN=0 то проверку надо делать как while(!SPI1STATbits.SPITBF);

Да наверное я тут ошибся проверяя Ресив вместо Трансмит буферы.


Также игрался с этим битом тоже фиг....

Используемая мной конструкция проверки буфера SPI описанна на примере в книге Программирование на С микроконтроллеров PIC24: Лусио Ди Джасио....


Вот подскажите Нога SYNС_IN должна быть замкнута на землю? в одной их схем только для AD98 она висела в воздухе...Сегодня не успел протестировать, пришлось отпаивать ДДС чтобы срезать подвод массы к этой ноге.

Также подскажите обязательно ли должен SPI работать на скорости 1/4 от Fcy или от FOSC?????
Vlad27
Цитата(truebest @ Sep 29 2010, 23:39) *
Вот подскажите Нога SYNС_IN должна быть замкнута на землю? в одной их схем только для AD98 она висела в воздухе...Сегодня не успел протестировать, пришлось отпаивать ДДС чтобы срезать подвод массы к этой ноге.

Также подскажите обязательно ли должен SPI работать на скорости 1/4 от Fcy или от FOSC?????


В дэйтшите на AD9954 требования по подключению неиспользуемого вывода SYNC_IN на "землю" не видел.
Скорость SPI лимитируется не более 25Mbps.
Не вижу в вашем коде применения IO_SYNC. У меня в схеме он объединен с IO_UPDATE.
Удачи.
truebest
Щас попробую програмно объединить.

Опишите пожалуйста что я должен записать в регистры чтобы получать на выходе ддс несущую на определенной частоте...
truebest
Всем спасибо за советы, проблема была в этой ножке, а также ддс отказывался работать на медленной клоке, не менее 1/4 ему надо чтобы работать...также немного код переписал.

Код
void InitDDS(void)
{
IO_SYNC=OFF;
AD9954_RESET();
    initSPIM();
IO_SYNC=OFF;
// CFR1 (Control Function Register No. 1)


LED=ON;
//while(1)
//{

IO_CS=0;
spi_write (DDS_AD9954_CFR1);
spi_write (0x00);
spi_write (0x00);
spi_write (0x32);
spi_write (0x0A);  // Power down all subsystems.
IO_CS=1;
//////////////////////
//delay(100);
//ddsSetOutputScale (0x3fff);
//IO_CS=0;
//spi_write (DDS_AD9954_ARR);
//spi_write (181);
//IO_CS=1;

///CFR2///////////
IO_CS=0;
spi_write (DDS_AD9954_CFR2);
//spi_write (0x01);
spi_write (0x00);
spi_write (0x00);
spi_write (0xA5);
IO_CS=1;
IO_UPDATE=1;
IO_UPDATE=0;


ddsSetFTW(0x00A3D70A);     

/*while(1)
{
    delay(65530);
ddsSetFTW(0x60000000);
delay(60000);
ddsSetFTW(0x5CCCCCCD);
delay(60000);
ddsSetFTW(0x5E147AE1);
delay(60000);
ddsSetFTW(0x5D70A3D7);
delay(60000);
ddsSetFTW(0x5EB851EC);
delay(60000);
ddsSetFTW(0x5F5C28F6);
delay(60000);
}
Для просмотра полной версии этой страницы, пожалуйста, пройдите по ссылке.
Invision Power Board © 2001-2025 Invision Power Services, Inc.