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

 
 
> ATmega8 SPI ADS1242, Работа с SPI
URANst
сообщение Jan 21 2008, 13:04
Сообщение #1


Частый гость
**

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



Пытаюсь наладить связь ATmega8 (7.3728 MHz) с ADS1242 (2.4576 MHz) по SPI (WinAVR).
Вопрос : как узнать что пришли данные от ADS1242.
Инициализирую SPI ATmega8 как мастер:
void SPI_MasterInit(void) {
// MOSI,SCK,SS на выход, MISO на вход
DDRB=0x2E;
// Включение SPI, мастер, частота /32
SPCR = (1<<SPE)|(1<<MSTR)|(1<<SPR1);
SPSR = (1<<SPI2X);
PORTB|=(1<<2);
void SPI_Transmit(unsigned char cData) {
/* Запуск передачи данных */
SPDR = cData;
/* Ожидание завершения передачи данных */
while(!(SPSR & (1<<SPIF)));

В документации на ADS1242 написано, что для чтения данных из регистра нужно послать команду
Encoding: 0001 rrrr xxxx nnnn (rrrr - номер первого регистра для чтения, nnnn читать колличество регистров после первого )

Читаю так:
PORTB&=(~(1<<2));//выбор чипа SS=0;
SPI_Transmit(0x10);//читать регистр с номером 0x00
SPI_Transmit(0x01);// читать 2 регистра начиная с первого
_delay_us (25);// задержка по даташиту мин. 50 Tosc(2.4576)
USART_Transmit(SPDR);//пытаюсь прочитать присланные данные
PORTB|=(1<<2);//SS выставляю в 1 для сброса
читаються то 0x00 то 0xFF
Как понять что данные о первом регистре уже пришли их нада прочитать, ну а затем соответственно и данные от второго регистра
Подскажите что не так

Сообщение отредактировал URANst - Jan 21 2008, 13:22
Прикрепленные файлы
Прикрепленный файл  ADS1242.pdf ( 404.04 килобайт ) Кол-во скачиваний: 174
 
Go to the top of the page
 
+Quote Post
 
Start new topic
Ответов
URANst
сообщение Jan 23 2008, 09:18
Сообщение #2


Частый гость
**

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



Код
Написал вот такой код:
#include <avr/io.h>
#include <avr/interrupt.h>
#include <util/delay.h>

#define UBRRVAL 47

#define SPI_PORT PORTB
#define SPI_DDR DDRB

#define MOSI_P PB3
#define MISO_P PB4
#define SCK_P PB5
#define SS_P PB2

#define SELECT() SPI_PORT &= ~(1 << SS_P)
#define DESELECT() SPI_PORT |= (1 << SS_P)

unsigned char command,statbuf,buf;

void delay (unsigned int d,char s) {
    unsigned int i;
    if (s=='u') {
        for(i=0;i<d;i++) _delay_us(1);
    }
        if (s=='m') {
        for(i=0;i<d;i++) _delay_ms(1);
    }
}

void USART_init(void) {
    
    UBRRL=UBRRVAL;            
    UBRRH=(UBRRVAL>>8);    
    UCSRC=(1<<URSEL)|(0<<UMSEL)|(0<<UPM1)|(0<<UPM0)|(0<<USBS)|(0<<UCSZ2)|(1<<UCSZ1)|(1<<UCSZ0);    
    UCSRB=(1<<RXEN)|(1<<TXEN)|(1<<RXCIE);
}
void USART_Transmit(unsigned char data) {

    while ( !( UCSRA & (1<<UDRE)) ) {};
    UDR = data;
}

void SPI_init(void) {

    SPI_DDR = (1 << MOSI_P)|(1 << SCK_P)|(1 << SS_P);
    SPI_PORT = (1 << SS_P);
    SPCR = (1 << SPE)|(1 << MSTR)|(1 << SPR1)|(1 << SPR0); // F_CPU/128
    
}
/*
unsigned char spi_shift_byte(unsigned char data) {
    
    SPDR = data;
    while(!(SPSR & (1 << SPIF)));    
    return SPDR;
}

unsigned char RREG(unsigned char start_address) {
    unsigned char buffer;
    SELECT();
    spi_shift_byte(0x10 | (start_address)); // 0001 rrrr
    spi_shift_byte(0x01); // xxxx nnnn, почему "минус 1" - написано в документации
    _delay_loop_2(250);
    buffer = spi_shift_byte(0xAA); // Читаем count регистров в массив buffer
    DESELECT();
    return buffer;
}

void WREG(unsigned char address, unsigned char value) {
    SELECT();
    spi_shift_byte(0x50 | (address)); // 0101 rrrr
    spi_shift_byte(0x00); // xxxx nnn, почему "минус 1" - написано в документации
    spi_shift_byte(value); // Передаем count значений из массива buffer
    DESELECT();
}
*/
ISR (USART_RXC_vect) {
    
    while ( !(UCSRA & (1<<RXC)) );
    buf=UDR;
    statbuf=0x01;
}

void processing (void) {

    unsigned char SPI_buf,SPI_buf1;
    
    if ((statbuf==0x01) && (command==0x00)) {
            command=buf;
            buf=0x00;
            statbuf=0x00;
    }
    if  (command!=0x00) {
        switch (command) {
                case 0x31: {
                            USART_Transmit(0x01);
                            command=0x00;
                            break;    
                }
                case 0x32: {
                            
                                                
                                                
                                                /*
                                                SELECT();
                                                    SPDR = 0x50;
                                                    while(!(SPSR & (1 << SPIF)));
                                                    delay(5,'u');
                                                    SPDR = 0x01;
                                                    while(!(SPSR & (1 << SPIF)));
                                                    delay(5,'u');
                                                    SPDR = 0x03;
                                                    while(!(SPSR & (1 << SPIF)));
                                                    delay(5,'u');
                                                    SPDR = 0x03;
                                                    while(!(SPSR & (1 << SPIF)));
                                                    delay(5,'u');
                                                DESELECT();
                                                */
                                                
                                                
                                                SELECT();
                                                
                                                SPDR = 0x10;
                                                while(!(SPSR & (1 << SPIF)));
                                                delay(5,'u');
                                                SPDR = 0x01;
                                                while(!(SPSR & (1 << SPIF)));
                                                delay(250,'u');
                                                SPDR = 0xAB;
                                                while(!(SPSR & (1 << SPIF)));
                                                SPI_buf=SPDR;
                                                delay(5,'u');
                                                SPDR = 0xAB;
                                                while(!(SPSR & (1 << SPIF)));
                                                SPI_buf1=SPDR;
                                                delay(5,'u');
                                                
                                                
                                                DESELECT();
                                                
                                                
                                                USART_Transmit(SPI_buf);
                                                USART_Transmit(SPI_buf1);
                                                SPI_buf=0x00;    
                                                SPI_buf1=0x00;
                                                buf=0x00;
                                                statbuf=0x00;
                                                command=0x00;
                            break;                    
                }
                
                default: {
                           command=0x00;
                           break;
                          }
        }                  
    
    }
}


int main (void) {

    USART_init();
    SPI_init();
    sei();

    while (1) {
        processing ();

    }
}

Задержки работают
Читаю постоянно то 0x00 0x80 то 0x80 0x80
proba ! а какие вы делали настройки SPI контроллера ?
Go to the top of the page
 
+Quote Post
Aesthete Animus
сообщение Jan 23 2008, 09:34
Сообщение #3


Местный
***

Группа: Свой
Сообщений: 222
Регистрация: 9-06-07
Пользователь №: 28 317



Цитата(URANst @ Jan 23 2008, 12:18) *
Код
unsigned char RREG(unsigned char start_address) {
    unsigned char buffer;
    SELECT();
    spi_shift_byte(0x10 | (start_address)); // 0001 rrrr
    spi_shift_byte(0x01); // xxxx nnnn, почему "минус 1" - написано в документации
    _delay_loop_2(250);
    buffer = spi_shift_byte(0xAA); // Читаем count регистров в массив buffer
    DESELECT();
    return buffer;
}


Строчкой "spi_shift_byte(0x01)" вы даете команду чтения двух регистров, но потом строчкой "buffer = spi_shift_byte(0xAA)" читаете всего один.
Go to the top of the page
 
+Quote Post

Сообщений в этой теме
- URANst   ATmega8 SPI ADS1242   Jan 21 2008, 13:04
- - Master   Цитата(URANst @ Jan 21 2008, 16:04) ... P...   Jan 21 2008, 15:31
- - URANst   ЦитатаSPI_Transmit(0xAA); //На самом деле, неважно...   Jan 21 2008, 17:29
- - Aesthete Animus   2URANst Я полагаю, что должно быть так: Код#incl...   Jan 21 2008, 18:27
- - URANst   До чтения данных оцифровки я еще не дошел (комманд...   Jan 21 2008, 19:17
- - Aesthete Animus   2URANst Вот я попытался изобразить функции чтения/...   Jan 21 2008, 20:11
- - URANst   Люди подскажите что за ерунда ! #define SPI_PO...   Jan 22 2008, 08:36
|- - Master   Цитата(URANst @ Jan 22 2008, 11:36) ... П...   Jan 22 2008, 11:16
- - URANst   Выкладываю полный текст программы. После прихода к...   Jan 22 2008, 13:28
- - Aesthete Animus   Цитата(URANst @ Jan 22 2008, 16:28) Выкла...   Jan 22 2008, 15:03
|- - aesok   Цитата(Aesthete Animus @ Jan 22 2008, 18...   Jan 22 2008, 15:30
- - proba   исползую ADS1243 ( 2,43MHz) с Mega16 ( 4,0MHz ). ...   Jan 22 2008, 16:49
- - URANst   Уважаемый proba, что вы имели ввиду под Кодdelay ...   Jan 22 2008, 19:06
|- - aesok   Код#include <avr/delay.h> или #include ...   Jan 22 2008, 19:19
|- - Aesthete Animus   Отвечу выборочно: Цитата(URANst @ Jan 22 200...   Jan 22 2008, 19:30
- - proba   переписал в более пoнятныи формат. в даташите там...   Jan 22 2008, 19:19
|- - aesok   Цитата(proba @ Jan 22 2008, 22:19) { unsi...   Jan 22 2008, 19:23
- - proba   Цитата(aesok @ Jan 22 2008, 23:23) Этот к...   Jan 23 2008, 08:48
- - URANst   Извините не удалил это функции. Я их пока не испол...   Jan 23 2008, 10:15
- - proba   Цитата(URANst @ Jan 23 2008, 13:18) Задер...   Jan 23 2008, 10:33
- - URANst   ВЫ имеете ввиду DRDY ? Поправте меня если я не пра...   Jan 23 2008, 11:35
- - mdmitry   Иногда проблемы возникают из-за инициализации SPI ...   Jan 23 2008, 20:50
- - URANst   УРААААААААА !!!!! Да действите...   Jan 24 2008, 07:13
- - URANst   Возникло еще парочку вопросов. Когда выставляю оци...   Jan 31 2008, 10:02
- - kostik2   пытаюсь работать с ads1243ipwt квару ads 4.9152, к...   Apr 19 2009, 07:11


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

 


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


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