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

 
 
 
Reply to this topicStart new topic
> Подключение 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
AHTOXA
сообщение Feb 18 2010, 18:18
Сообщение #2


фанат дивана
******

Группа: Свой
Сообщений: 3 387
Регистрация: 9-08-07
Из: Уфа
Пользователь №: 29 684



Не уверен насчёт меги-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.


--------------------
Если бы я знал, что такое электричество...
Go to the top of the page
 
+Quote Post
inventor
сообщение Feb 19 2010, 05:56
Сообщение #3


Знающий
****

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



Цитата(AHTOXA @ Feb 18 2010, 21:18) *
Не уверен насчёт меги-128, но помнится мне, что для нормальной работы SPI в режиме "мастер" нога SS либо должна быть сконфигурирована как выход, либо притянута к единице.


----

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

В общем у меня так и сделано
я сам выставляю CS
Go to the top of the page
 
+Quote Post
AHTOXA
сообщение Feb 19 2010, 06:02
Сообщение #4


фанат дивана
******

Группа: Свой
Сообщений: 3 387
Регистрация: 9-08-07
Из: Уфа
Пользователь №: 29 684



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


Не CS, а SS!


--------------------
Если бы я знал, что такое электричество...
Go to the top of the page
 
+Quote Post
inventor
сообщение Feb 19 2010, 07:20
Сообщение #5


Знающий
****

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



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


Этот сигнал (SS) выбирает макс CS
Go to the top of the page
 
+Quote Post
demiurg_spb
сообщение Feb 19 2010, 08:11
Сообщение #6


неотягощённый злом
******

Группа: Свой
Сообщений: 2 746
Регистрация: 31-01-08
Из: Санкт-Петербург
Пользователь №: 34 643



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

Что мне не нравится как вы с SPI работаете...
Посмотрите мой модуль.
На полноту не претендую, но с его помощью работаю со всеми SPI чипами, что мне попадались.
Код
    uint8_t x;
    spi_on_clk_div2();
    cs_on();
    x = spi_read();
    cs_off();

Прикрепленные файлы
Прикрепленный файл  spi.rar ( 1.12 килобайт ) Кол-во скачиваний: 56
 


--------------------
“Будьте внимательны к своим мыслям - они начало поступков” (Лао-Цзы)
Go to the top of the page
 
+Quote Post
GDI
сообщение Feb 19 2010, 13:48
Сообщение #7


Профессионал
*****

Группа: Свой
Сообщений: 1 235
Регистрация: 14-05-05
Из: Санкт-Петербург
Пользователь №: 5 008



Сдается мне что вы невнимательно читали даташит. Во-первых, на стр. 30 есть алгоритм работы с АЦП, во-вторых на стр. 33 есть пример программы, правда для мотороллы, судя по всему, но логику работы можно понять оттуда. Я тоже прочитал даташит по горизонтали, но мне понятно что читать записывая в АЦП три нуля не получится, надо записать первым байтом 0х58(для чтения нулевого канала, 0х59 - для первого и т.д.). Хотя, может вы так и делаете, только нам не показали всю вашу программу?


--------------------
http://www.embedders.org Блоги разработчиков электроники.
Go to the top of the page
 
+Quote Post
AHTOXA
сообщение Feb 19 2010, 16:35
Сообщение #8


фанат дивана
******

Группа: Свой
Сообщений: 3 387
Регистрация: 9-08-07
Из: Уфа
Пользователь №: 29 684



Цитата(inventor @ Feb 19 2010, 12:20) *
Этот сигнал (SS) выбирает макс CS

Не вижу переключения SS на выход. Точно так же, как и ноги MOSI.


--------------------
Если бы я знал, что такое электричество...
Go to the top of the page
 
+Quote Post
inventor
сообщение Feb 24 2010, 09:11
Сообщение #9


Знающий
****

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



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


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

Сообщение отредактировал inventor - Feb 24 2010, 09:37
Прикрепленные файлы
Прикрепленный файл  ad7714.rar ( 1.8 килобайт ) Кол-во скачиваний: 69
 
Go to the top of the page
 
+Quote Post
inventor
сообщение Feb 25 2010, 06:46
Сообщение #10


Знающий
****

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



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

разобрался-неправильно настроил порты
Go to the top of the page
 
+Quote Post
Burdin
сообщение Feb 2 2012, 11:01
Сообщение #11





Группа: Новичок
Сообщений: 1
Регистрация: 2-02-12
Пользователь №: 70 044



Подниму тему.
А в чем именно была проблема?
У меня похожая ситуация с ad7714
Go to the top of the page
 
+Quote Post
ILYAUL
сообщение Feb 2 2012, 11:05
Сообщение #12


Профессионал
*****

Группа: Свой
Сообщений: 1 940
Регистрация: 16-12-07
Из: Москва
Пользователь №: 33 339



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


Цитата(inventor @ Feb 25 2010, 10:46) *
разобрался-неправильно настроил порты


--------------------
Закон Мерфи:

Чем тщательнее составлен проект, тем больше неразбериха, если что-то пошло не так
Go to the top of the page
 
+Quote Post
inventor
сообщение May 11 2012, 12:41
Сообщение #13


Знающий
****

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



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


старый проект-неправильно настроенные порты атмеги.
я там перепутал |= с &= или наоборот...
не помню
Go to the top of the page
 
+Quote Post

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

 


RSS Текстовая версия Сейчас: 18th June 2025 - 23:09
Рейтинг@Mail.ru


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