Но чтобы я не делал как бы не вертел ее нивкакую она не генерила, я пробовал и аппаратный 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--);
}
////
#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--);
}
////