Помощь - Поиск - Пользователи - Календарь
Полная версия этой страницы: Подключение AD7714 + Atmega128
Форум разработчиков электроники ELECTRONIX.ru > Микроконтроллеры (MCs) > AVR
inventor
Бьюсь уже неделю над такой проблемой-
На 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 приходят данные, хотя на осциле все в порядке-данные отправляются.
Но приема нет.
Помогите кто может!
AHTOXA
Не уверен насчёт меги-128, но помнится мне, что для нормальной работы SPI в режиме "мастер" нога SS либо должна быть сконфигурирована как выход, либо притянута к единице.


----

Да, посмотрел даташит:

Цитата
When the SPI is configured as a master (MSTR in SPCR is set), the user can determine
the direction of the SS pin.
If SS is configured as an output, the pin is a general output pin which does not affect the
SPI system. Typically, the pin will be driving the SS pin of the SPI slave.
If SS is configured as an input, it must be held high to ensure Master SPI operation. If
the SS pin is driven low by peripheral circuitry when the SPI is configured as a master
with the SS pin defined as an input, the SPI system interprets this as another master
selecting the SPI as a slave and starting to send data to it.
inventor
Цитата(AHTOXA @ Feb 18 2010, 21:18) *
Не уверен насчёт меги-128, но помнится мне, что для нормальной работы SPI в режиме "мастер" нога SS либо должна быть сконфигурирована как выход, либо притянута к единице.


----

Да, посмотрел даташит:

В общем у меня так и сделано
я сам выставляю CS
AHTOXA
Цитата(inventor @ Feb 19 2010, 10:56) *
В общем у меня так и сделано
я сам выставляю CS


Не CS, а SS!
inventor
Цитата(AHTOXA @ Feb 19 2010, 09:02) *
Не CS, а SS!


Этот сигнал (SS) выбирает макс CS
demiurg_spb
Цитата(inventor @ Feb 18 2010, 17:55) *
Бьюсь уже неделю над такой проблемой...
Помогите кто может!

Что мне не нравится как вы с SPI работаете...
Посмотрите мой модуль.
На полноту не претендую, но с его помощью работаю со всеми SPI чипами, что мне попадались.
Код
    uint8_t x;
    spi_on_clk_div2();
    cs_on();
    x = spi_read();
    cs_off();
GDI
Сдается мне что вы невнимательно читали даташит. Во-первых, на стр. 30 есть алгоритм работы с АЦП, во-вторых на стр. 33 есть пример программы, правда для мотороллы, судя по всему, но логику работы можно понять оттуда. Я тоже прочитал даташит по горизонтали, но мне понятно что читать записывая в АЦП три нуля не получится, надо записать первым байтом 0х58(для чтения нулевого канала, 0х59 - для первого и т.д.). Хотя, может вы так и делаете, только нам не показали всю вашу программу?
AHTOXA
Цитата(inventor @ Feb 19 2010, 12:20) *
Этот сигнал (SS) выбирает макс CS

Не вижу переключения SS на выход. Точно так же, как и ноги MOSI.
inventor
Цитата(GDI @ Feb 19 2010, 16:48) *
Сдается мне что вы невнимательно читали даташит. Во-первых, на стр. 30 есть алгоритм работы с АЦП, во-вторых на стр. 33 есть пример программы, правда для мотороллы, судя по всему, но логику работы можно понять оттуда. Я тоже прочитал даташит по горизонтали, но мне понятно что читать записывая в АЦП три нуля не получится, надо записать первым байтом 0х58(для чтения нулевого канала, 0х59 - для первого и т.д.). Хотя, может вы так и делаете, только нам не показали всю вашу программу?


Насколько я понимаю, для чтения одного байта из SPI я должен туда записать один байт.
Поэтому в цикле так и делаю.
Программу для моторолы я смотрел
и сделал так же.
Проблема в том, что я даже не могу прочитать содержимое регистра,
если я туда что-то записываю, я хочу получить из него записанное,
но читаю мусор.
Я даже написал SPI програмный.
И чтение делаю так - сунул БИТ, прочитал БИТ.
Но все то же самое.
И я вот думаю, может в плате какой-то косяк,
потому , что протокол очень простой, как гвоздь.
UART у меня работает, индикаторы работают, а аппаратный SPI нет :-(
Или в Атмеге нужно каким то образом как-то ДОПОЛНИТЕЛЬНО включить SPI.
inventor
Цитата(inventor @ Feb 24 2010, 12:11) *
Насколько я понимаю, для чтения одного байта из SPI я должен туда записать один байт.
Поэтому в цикле так и делаю.
Программу для моторолы я смотрел
и сделал так же.
Проблема в том, что я даже не могу прочитать содержимое регистра,
если я туда что-то записываю, я хочу получить из него записанное,
но читаю мусор.
Я даже написал SPI програмный.
И чтение делаю так - сунул БИТ, прочитал БИТ.
Но все то же самое.
И я вот думаю, может в плате какой-то косяк,
потому , что протокол очень простой, как гвоздь.
UART у меня работает, индикаторы работают, а аппаратный SPI нет :-(
Или в Атмеге нужно каким то образом как-то ДОПОЛНИТЕЛЬНО включить SPI.

разобрался-неправильно настроил порты
Burdin
Подниму тему.
А в чем именно была проблема?
У меня похожая ситуация с ad7714
ILYAUL
Цитата(Burdin @ Feb 2 2012, 15:01) *
Подниму тему.
А в чем именно была проблема?
У меня похожая ситуация с ad7714


Цитата(inventor @ Feb 25 2010, 10:46) *
разобрался-неправильно настроил порты
inventor
Цитата(Burdin @ Feb 2 2012, 14:01) *
Подниму тему.
А в чем именно была проблема?
У меня похожая ситуация с ad7714


старый проект-неправильно настроенные порты атмеги.
я там перепутал |= с &= или наоборот...
не помню
Для просмотра полной версии этой страницы, пожалуйста, пройдите по ссылке.
Invision Power Board © 2001-2025 Invision Power Services, Inc.