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

 
 
> Подключение AD7714 + Atmega128, Не хочет работать АЦП, Do Help me please!!!
inventor
сообщение Feb 18 2010, 14:55
Сообщение #1


Знающий
****

Группа: Свой
Сообщений: 524
Регистрация: 25-12-08
Из: Москва
Пользователь №: 42 748



Бьюсь уже неделю над такой проблемой-
На AVR128 подцеплены 3 АЦП AD7714
соеденены по SPI.
Пытаюсь прочитать что-то из АЦП-
результат-0 или какой-то мусор.

Может у меня косяк какой-то программный и я неправильно по SPI принимаю,
но я уже перепробывал все варианты и полярности и фазы менял.
Даже програмно SPI сделал, все бестолку-не хочет АЦП работать.

Вот так соеденено :

ad7714----->AVR128


CS1<---------PB0
SCLK<-------PB1
MOSI<-------PB2
MISO------->PB3
MCLK<-------PB4

MCLK запускается от таймера с частотой 2.45 МГц

Програмно сделано так:
CODE

/* Чипселекты для 3-х АЦП */
#define CS_PORT PORTB
#define CS1_ON() (CS_PORT &= 0b11111110)
#define CS1_OFF() (CS_PORT |= 0b00000001)


/* Выход "SCLK" на порте PB1 */
#define SCLK_PORT PORTB
#define SCLK_BIT 0x02
#define NO_SCLK_BIT 0xFD
#define SCLK_0() (SCLK_PORT &= NO_SCLK_BIT)
#define SCLK_1() (SCLK_PORT |= SCLK_BIT)

/* Выход данных MOSI */
#define MOSI_PORT PORTB
#define MOSI_BIT 0x04
#define NO_MOSI_BIT 0xfb

#define MOSI_0() (MOSI_PORT &= NO_MOSI_BIT)
#define MOSI_1() (MOSI_PORT |= MOSI_BIT)


/* Вход данных MISO */
#define MISO_PORT PINB

/* Прерывания */
#define DRDY1 (PINE & 0x20)


//Запускаю SPI так:

/* Запустить SPI, мастер полярность=0 и фаза = 0, скорость 1/128 Fclk , pol=0!!! нога полярности у микросхемы на 0 */
SPCR = (1 << MSTR) | (1 << SPR1) | (1 << SPR0);
SPCR |= (1 << SPE) /*| (1 << CPOL) | (1 << CPHA)*/;




/* Запись byte в регистр */
void AD7714_writeToReg(u8 byte)
{
char i;

/* Очистим флаги */
i = SPSR;
i = SPDR;

/* чипселект */
CS1_ON();

/* Поместим данные в регистр */
SPDR = byte;
while (!(SPSR & (1 << SPIF)));

///SCLK_0();
/* Защелкнем данные */
CS1_OFF();
}


/* Прочитать 3 байта из АЦП */
void AD7714_readData(void)
{
int i;

/* wait for /DRDY*/
while (DRDY1);

/* /CS is low */
CS1_ON();


for (i = 0; i < 3; i++)
{
SPDR = 0;
while (!(SPSR & (1 << SPIF)));
pointer->c[i] = SPDR;
}

SCLK_0();
CS1_OFF();
}



Уже неделю сижу все вхолостую, перепробывал все варианты, в чем проблема непонятно.
Поставил на SPI индикаторы (в Proteus)-все заработалона ура.
Может этот SPI нужно еще как-то включить еще каким-то образом (фузиками или чем-то еще)-
в отладчике например не видно, что в регистр SPDR приходят данные, хотя на осциле все в порядке-данные отправляются.
Но приема нет.
Помогите кто может!

Сообщение отредактировал IgorKossak - Feb 2 2012, 15:05
Причина редактирования: [codebox]!!!
Go to the top of the page
 
+Quote Post



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

 


RSS Текстовая версия Сейчас: 21st June 2025 - 05:31
Рейтинг@Mail.ru


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