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

 
 
> AD9954 помоему Вообще не отвечает.
truebest
сообщение Sep 29 2010, 13:59
Сообщение #1


Участник
*

Группа: Участник
Сообщений: 71
Регистрация: 12-05-10
Пользователь №: 57 214



Добрый день уважаемые... Довелось мне помучаться с 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--);
}
////


Сообщение отредактировал truebest - Sep 29 2010, 14:02
Go to the top of the page
 
+Quote Post



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

 


RSS Текстовая версия Сейчас: 24th July 2025 - 12:38
Рейтинг@Mail.ru


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