Работаю с ad9833.
Подключил к atmega 8535, по SPI отправляю настроечные слова.
К ad9833 подключен генератор 16 Mhz. Данные, тики и уровни идут правильно - согласно datasheet.
Генерирует sin и меандр.
Треугольник так и не получилось настроить - в теории все работает при задании control_bit[1] = 1
Откопал чудо application note - взял из него пример, поигрался с частотами, но работает все через раз и максимально возможной частоты не показывает, все в пределе 1-10 кГц.
Кто сталкивался с данной микросхемой, какие могут быть идеи насчет правильной настройки?
привожу настроечное слово и код отправки по SPI
Код
// // app note
Write16SPI(0x2100);
Write16SPI(0x50C7);
Write16SPI(0x40F0);
Write16SPI(0xC000);
Write16SPI(0x2000);
Код
// синус
Write16SPI(0x2128);
Write16SPI(0x6E14);
Write16SPI(0x451E);
Write16SPI(0x8000);
Write16SPI(0x8000);
Write16SPI(0xC000);
Write16SPI(0xE000);
Write16SPI(0x0002);
Код
#define CLOCK PORTB.1
// защелка
#define FSYNC PORTB.2
// данные
#define DATA_OUT PORTB.0
Код
//------------------функция записи по SPI-------------------
void Write16SPI(unsigned int data){
// счетчик цикла
int K=16;
int J=0;
//
unsigned char low_part;
unsigned char hi_part;
bit pin_data;
// сохраняем младшую часть
low_part = (unsigned char)(data & 0x00FF);
// сохраняем старшую часть
hi_part = (unsigned char)(data >> 8);
// начало передачи данных
FSYNC = 0;
// выставляем данные
Write8Bit(hi_part);
// если старшие 8 бит -
Write8Bit(low_part);
// окончание передачи данных
FSYNC = 1;
}
Код
//------------------функция записи по SPI-------------------
void Write8Bit(unsigned char data){
// счетчик цикла
int K=8;
int J=0;
bit pin_data;
K = 8;
J = 0;
// передаем 16 бит по одному
while (K){
pin_data = (data & 128);
DATA_OUT = pin_data;
data <<= 1;
// sprintf(buf, "%x", pin_data);
// lcd_gotoxy(J,1);
// lcd_puts(buf);
// delay_ms(100);
//
// активный уровень clock
CLOCK = 1;
delay_us(10);
//delay_ms(1);
// декремент счетчика
K--;
J++;
CLOCK = 0;
delay_us(10);
}
}