Микроконтроллеры, АЦП, память и т.д Темы касающиеся микроконтроллеров разных производителей, памяти, АЦП/ЦАП, периферийных модулей... |
02.03.2013, 14:54
|
|
Прописка
Регистрация: 25.10.2012
Сообщений: 112
Сказал спасибо: 50
Сказали Спасибо 1 раз в 1 сообщении
|
Не получается запустить генератор AD9834 с ЦАП AD5620
Доброго времени суток.
Не получается запустить генератор AD9834 с ЦАП AD5620.
Схемку и печатную плату прикрепил, делал по даташитам, проверьте пожалуйста!
Сигналы с ножек MOSI, SCK и CS МК проверял на осциллографе, все ок. А вот чипы не воспринимают, программа в МК "виснет" на ожидании окончания передачи по SPI. Что интересно - если передача до цикла while(1) то не виcнет, если же пробую в цикле - на первой же отправке стоп. В даташитах на AD9834 и AD5620 указано, что данные принимаются на спадающем фронте SCK, поэтому инициализировал SPI как
SPCR = (1‹‹SPE)|(1‹‹MSTR)|(1‹‹CPHA)|(1‹‹SPR0);
или
SPCR = (1‹‹SPE)|(1‹‹MSTR)|(1‹‹CPOL)|(1‹‹SPR0);
,т.е. пробовал по спад. фронту и с отрицательными сигналами SPI, не работает.
Проверял напряжение на ножках REF - как и должно быть, 1.2V. Значит ли это, что чип рабочий? Просто боюсь, что мог перегреть при паянии. Как еще можно проверить?
Микроконтроллер Atmega32 с кварцем 16 МГц, фьюзы изменял только для кварца.
Схема
Печатная плата
Даташит AD9834
Даташит AD5620
CN0156_Ampl_control_AD9834
AN-1070_programming_9834
Вот мой код в AVR Studio 5.
Код:
|
/*
* ad9834_123.c
*
* Created: 3/1/2013 10:56:28 AM
* Author: Administrator
*/
#include ‹avr/io.h›
#include ‹stdio.h›
#define F_CPU 16000000UL // 16 MHz
#ifndef ALIBC_OLD
#include ‹util/delay.h›
#else
#include ‹avr/delay.h›
#endif
#include "lcd16.h"
#define AD9834_CONTROL_PORT PORTB
#define AD9834_CONTROL_DDR DDRB
#define AD9834_CONTROL_MISO PORTB6
#define AD9834_CONTROL_MOSI PORTB5
#define AD9834_CONTROL_SCK PORTB7
#define AD9834_CONTROL_CS_PORT PORTB
#define AD9834_CONTROL_CS_DDR DDRB
#define AD9834_CONTROL_CS PORTB0
#define AD9834_CONTROL_RESET_PORT PORTB
#define AD9834_CONTROL_RESET_DDR DDRB
#define AD9834_CONTROL_RESET PORTB1
// set CS to 0 = active
#define CSACTIVEAD9834 AD9834_CONTROL_CS_PORT &= ~(1‹‹AD9834_CONTROL_CS)
// set CS to 1 = passive
#define CSPASSIVEAD9834 AD9834_CONTROL_CS_PORT |= (1‹‹AD9834_CONTROL_CS)
///////////////////////////////////////////////////
#define AD5620_CONTROL_PORT PORTB
#define AD5620_CONTROL_DDR DDRB
#define AD5620_CONTROL_MISO PORTB6
#define AD5620_CONTROL_MOSI PORTB5
#define AD5620_CONTROL_SCK PORTB7
#define AD5620_CONTROL_CS_PORT PORTB
#define AD5620_CONTROL_CS_DDR DDRB
#define AD5620_CONTROL_CS PORTB2
// set CS to 0 = active
#define CSACTIVEAD5620 AD5620_CONTROL_CS_PORT &= ~(1‹‹AD5620_CONTROL_CS)
// set CS to 1 = passive
#define CSPASSIVEAD5620 AD5620_CONTROL_CS_PORT |= (1‹‹AD5620_CONTROL_CS)
#define waitspi() while(!(SPSR & (1‹‹SPIF)))
void SPI_write16_AD9834 (unsigned short data) // send a 16bit word and use fsync
{
unsigned char MSdata = ((data››8) & 0x00FF); //filter out MS
unsigned char LSdata = (data & 0x00FF); //filter out LS
CSACTIVEAD9834; // Fsync Low --› begin frame
SPDR = MSdata; // send First 8 MS of data
waitspi(); // while busy
SPDR = LSdata; // send Last 8 LS of data
waitspi(); // while busy
CSPASSIVEAD9834; // Fsync High --› End of frame
}
void SPI_write16_AD5620 (unsigned short data) // send a 16bit word and use fsync
{
CSACTIVEAD5620; // Fsync Low --› begin frame
write data
SPDR = data;
waitspi();
CSPASSIVEAD5620; // Fsync High --› End of frame
}
int main(void)
{
//LED
DDRC = 0x02; //set C.1 as out - led
PORTC = 0x02;
CSPASSIVEAD9834;
CSPASSIVEAD5620;
AD5620_CONTROL_DDR = (1‹‹AD5620_CONTROL_MOSI)|(1‹‹AD5620_CONTROL_SCK);
AD5620_CONTROL_CS_DDR = (1‹‹AD5620_CONTROL_CS);
AD9834_CONTROL_CS_DDR = (1‹‹AD9834_CONTROL_CS);
AD9834_CONTROL_RESET_DDR = (1‹‹AD9834_CONTROL_RESET);
// SPI Clock Phase: falling edge
// SPI Data Order: MSB First
// set clock rate fck/16
SPCR = (1‹‹SPE)|(1‹‹MSTR)|(1‹‹CPOL)|(1‹‹SPR0);
//AD9834_init
SPI_write16_AD9834(0x2100); // control word, set output to mid value voltage
SPI_write16_AD9834(0x429F); // Freq0 registerdata LSB = approx. 50 hz
SPI_write16_AD9834(0x4000); // Freq0 registerdata MSB = approx. 50 hz
//Freq_write (50,0);
SPI_write16_AD9834(0x82C7); // Freq1 registerdata LSB = approx. 53 hz
SPI_write16_AD9834(0x8000); // Freq1 registerdata MSB = approx. 53 hz
//Freq_write (53,1);
SPI_write16_AD9834(0xC000); // Phase offset of Phase0 = 0
//Phase_write(0,0);
SPI_write16_AD9834(0xE155); // Phase offset of Phase1 = 30_grad
//Phase_write(30,1);
SPI_write16_AD9834(0x2000); // control word, set output = sine
SPI_write16_AD5620 (0x0000);
//LCD
DDRD = 0xFF;
int i; i = 0;
char lcd_buffer[33];
lcdInit(); // init the LCD screen
_delay_ms(50);
lcdCmd(0x01); // clear lcd
_delay_ms(50);
gotoXy(5,0); // goto (0.0)
prints("LCD");
CSACTIVEAD9834;
_delay_ms(2000);
CSPASSIVEAD9834;
CSACTIVEAD5620;
_delay_ms(2000);
CSPASSIVEAD5620;
_delay_ms(2000);
gotoXy(0,1); // goto (0.1)
prints("LCD_ATMEGA32");
_delay_ms(2000);
while(1)
{
i = i+1;
//TODO:: Please write your application code
sprintf(lcd_buffer,"counter: %u",i);
lcdCmd(0x01); // clear lcd
gotoXy(0,0); // goto (0.0)
prints(lcd_buffer);
_delay_ms(100);
//SPI_write16_AD9834(0x2000);
_delay_ms(100);
//SPI_write16_AD5620(0x03E8);
PORTC |= (1‹‹PORTC1);
//SPI_write16_AD5620 (0x0000);
_delay_ms(1000);
sprintf(lcd_buffer,"counter: %u",i);
lcdCmd(0x01); // clear lcd
gotoXy(0,0); // goto (0.0)
prints(lcd_buffer);
_delay_ms(100);
//SPI_write16_AD9834(0x2800);
_delay_ms(100);
//SPI_write16_AD5620(0x0001);
PORTC &= ~(1‹‹PORTC1);
//SPI_write16_AD5620 (0x03E8);
_delay_ms(1000);
}
} |
|
|
|
|
02.03.2013, 16:51
|
|
Почётный гражданин KAZUS.RU
Регистрация: 08.06.2008
Сообщений: 1,394
Сказал спасибо: 4
Сказали Спасибо 183 раз(а) в 167 сообщении(ях)
|
Re: Не получается запустить генератор AD9834 с ЦАП AD5620.
Вот такая инициализация не смущает ?
PHP код:
|
AD5620_CONTROL_DDR = (1‹‹AD5620_CONTROL_MOSI)|(1‹‹AD5620_CONTROL_SCK); AD5620_CONTROL_CS_DDR = (1‹‹AD5620_CONTROL_CS); AD9834_CONTROL_CS_DDR = (1‹‹AD9834_CONTROL_CS); AD9834_CONTROL_RESET_DDR = (1‹‹AD9834_CONTROL_RESET);
|
Реально только последняя строка работает - ибо реальный DDR везде ddrb
|
|
|
|
02.03.2013, 17:04
|
|
Прописка
Регистрация: 25.10.2012
Сообщений: 112
Сказал спасибо: 50
Сказали Спасибо 1 раз в 1 сообщении
|
Re: Не получается запустить генератор AD9834 с ЦАП AD5620.
Сообщение от Boba_spb
|
Вот такая инициализация не смущает ?
Реально только последняя строка работает - ибо реальный DDR везде ddrb
|
эм...
А разве предыдущие биты стираются с каждой новой строкой?
|
|
|
|
02.03.2013, 17:46
|
|
Почётный гражданин KAZUS.RU
Регистрация: 08.06.2008
Сообщений: 1,394
Сказал спасибо: 4
Сказали Спасибо 183 раз(а) в 167 сообщении(ях)
|
Re: Не получается запустить генератор AD9834 с ЦАП AD5620
А что Вы хотите от "=". Иль оно должно отгадывать где "равно", а где "или", а может быть "и".
Вроде эт не С++ где можно переопределить оператор
|
|
|
|
02.03.2013, 19:17
|
|
Прописка
Регистрация: 25.10.2012
Сообщений: 112
Сказал спасибо: 50
Сказали Спасибо 1 раз в 1 сообщении
|
Re: Не получается запустить генератор AD9834 с ЦАП AD5620
Сообщение от Boba_spb
|
А что Вы хотите от "=". Иль оно должно отгадывать где "равно", а где "или", а может быть "и".
Вроде эт не С++ где можно переопределить оператор
|
Изменил на
Код:
|
AD5620_CONTROL_DDR |= (1‹‹AD5620_CONTROL_MOSI)|(1‹‹AD5620_CONTROL_SCK);
AD5620_CONTROL_CS_DDR |= (1‹‹AD5620_CONTROL_CS);
AD9834_CONTROL_CS_DDR |= (1‹‹AD9834_CONTROL_CS);
AD9834_CONTROL_RESET_DDR |= (1‹‹AD9834_CONTROL_RESET); |
всё равно в бесконечном цикле не выполняет отправку
может в схеме ошибка?
|
|
|
|
02.03.2013, 19:25
|
|
Почётный гражданин KAZUS.RU
Регистрация: 20.06.2006
Адрес: Украина, Запорожье
Сообщений: 8,003
Сказал спасибо: 0
Сказали Спасибо 4,946 раз(а) в 2,374 сообщении(ях)
|
Re: Не получается запустить генератор AD9834 с ЦАП AD5620
|
|
|
|
02.03.2013, 20:03
|
|
Почётный гражданин KAZUS.RU
Регистрация: 08.06.2008
Сообщений: 1,394
Сказал спасибо: 4
Сказали Спасибо 183 раз(а) в 167 сообщении(ях)
|
Re: Не получается запустить генератор AD9834 с ЦАП AD5620
В LCDini() случаем DDRB - не трогается?
|
|
|
|
02.03.2013, 20:14
|
|
Почётный гражданин KAZUS.RU
Регистрация: 08.06.2008
Сообщений: 1,394
Сказал спасибо: 4
Сказали Спасибо 183 раз(а) в 167 сообщении(ях)
|
Re: Не получается запустить генератор AD9834 с ЦАП AD5620
AD5620 вроде как 16 битный, а Вы ему токо 8 бит посылаете, иль ему хвататет?
|
|
|
|
02.03.2013, 20:17
|
|
Почётный гражданин KAZUS.RU
Регистрация: 08.06.2008
Сообщений: 1,394
Сказал спасибо: 4
Сказали Спасибо 183 раз(а) в 167 сообщении(ях)
|
Re: Не получается запустить генератор AD9834 с ЦАП AD5620
А внутри while(1) все посылки по spi закоментированы - это не влияетни на что?
|
|
|
|
02.03.2013, 20:22
|
|
Прописка
Регистрация: 25.10.2012
Сообщений: 112
Сказал спасибо: 50
Сказали Спасибо 1 раз в 1 сообщении
|
Re: Не получается запустить генератор AD9834 с ЦАП AD5620
Сообщение от Boba_spb
|
В LCDini() случаем DDRB - не трогается?
|
LCD настроен на порт D, кроме него в lcd16.c ничего не трогается
Сообщение от Boba_spb
|
AD5620 вроде как 16 битный, а Вы ему токо 8 бит посылаете, иль ему хвататет?
|
Ему нужно 16 конечно.
Вы имеете ввиду, что такая отправка
Код:
|
SPDR = data;
waitspi(); |
берет только 8 бит? То есть нужно сделать как в функции записи для AD9834?
Сообщение от Boba_spb
|
А внутри while(1) все посылки по spi закоментированы - это не влияетни на что?
|
Закоментированы потому, что на них программа стопорится, это пока на время отладки, а так конечно должны быть без комментариев.
|
|
|
|
Ваши права в разделе
|
Вы не можете создавать новые темы
Вы не можете отвечать в темах
Вы не можете прикреплять вложения
Вы не можете редактировать свои сообщения
HTML код Выкл.
|
|
|
Часовой пояс GMT +4, время: 02:50.
|
|