Доброго времени суток.
Уже долгое время не получается запустить ЦАП AD5620. Разрядность 12 бит, управление по SPI, данные считываются по спадающему фронту, первый MSB, нужно 16 бит для программирования.
Модели в Proteus'e нет, поэтому для моделирования использовал AD5621 (по управлению практически аналог - тоже 12 бит, SPI по спаду, первый MSB и 16 бит число). Причем даже структура числа для управления идентичная: 2 нуля(норм режим), 12 бит данные, 2 нуля(не важно).
софт написан на C в AVR Studio 5 + WinAVR. так вот, модель в протеусе работает, на плате нет.
скрин из протеус

схема платы

Проверьте, пожалуйста, схему, всё ли в порядке? В даташите нет примера схемы для AD5620, поэтому могут быть ошибки.
Код такой:
Код:
#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"
void SPI_WRITE_16(unsigned short data)
{
unsigned char MSdata = ((data >>8) & 0x00FF);
unsigned char LSdata = (data & 0x00FF);
SPDR = MSdata;
while(!(SPSR & (1<<SPIF)));
SPDR = LSdata;
while(!(SPSR & (1<<SPIF)));
}
int main(void)
{
//LED
DDRC = 0x02; //set C.1 as out - led
PORTC = 0x02;
//SPI
uint16_t data[5] = {0x0000, 0x0FA0, 0x1F40, 0x2EE0, 0x3FFC};
//uint16_t data[0] = 0x0000; //0 - min, 2 first 00...., 2 last ...00
//uint16_t data[1] = 0x0FA0; //1000, 2 first 00...., 2 last ...00
//uint16_t data[2] = 0x1F40; //2000, 2 first 00...., 2 last ...00
//uint16_t data[3] = 0x2EE0; //3000, 2 first 00...., 2 last ...00
//uint16_t data[4] = 0x3FFC; //4095 - max, 2 first 00...., 2 last ...00
DDRB = (1<<PORTB0)|(1<<PORTB5)|(1<<PORTB7);//SS, MOSI, SCK
SPCR = (1<<SPE)|(1<<MSTR)|(1<<CPOL);
//LCD
DDRD = 0xFF;
int i,j; 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 (5.0)
prints("LCD");
_delay_ms(500);
gotoXy(0,1); // goto (0.1)
prints("LCD_ATMEGA32");
_delay_ms(500);
while(1)
{
for (j = 0; j<=5; j++)
{
i = i+1;
sprintf(lcd_buffer,"_counter: %u",i);
lcdCmd(0x01); // clear lcd
gotoXy(0,0); // goto (0.0)
prints(lcd_buffer);
_delay_ms(100);
PORTB &= 0 << PORTB0;
SPI_WRITE_16(data[j]);
PORTB |= 1 << PORTB0;
PORTC |= (1<<PORTC1);
_delay_ms(2000);
}
}
}
Скачать проект в AVR Studio 5 и Proteus 7.10:
http://zalil.ru/34350292Даташиты:
AD5620
http://www.analog.com/static/imported-files/data_sheets/AD5620_5640_5660.pdfAD5621
http://www.analog.com/static/imported-files/data_sheets/AD5601_5611_5621.pdfОгромное спасибо всем откликнувшимся!