Помощь - Поиск - Пользователи - Календарь
Полная версия этой страницы: ADS1256evm и atmega88
Форум разработчиков электроники ELECTRONIX.ru > Микроконтроллеры (MCs) > AVR
Filov
Соединяю оценочную плату ads1256evm c atmega88 по spi.

Сразу непонятность: Когда включаю питание аналоговой части +5В ads1256evm - не могу даже залить прошивку в МК с помощью 5-проводкового программатора.

Цель кода- прочитать первые регистры АЦП и записать их в eeprom. Проблема - оставляет 0xFF в eeprom.
Код
#include <avr/io.h>
#include <avr/interrupt.h>
#include <avr/eeprom.h>
#define F_CPU 12500000UL  // 12.5 MHz
#include <util/delay.h>
#include <inttypes.h>
#include <stdlib.h> // atoi
#include <string.h>
#include "timeout.h"
#include "avr_compat.h"

//SPI port define
#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)

//ADS1256 define
#define F_ADS1256 7680000UL
#define      WAKEUP   0x00
#define      RDATA   0x01
#define      RDATAC   0x03
#define      SDATAC   0x0F
#define      RREG   0x10
#define      WREG   0x50
#define      SELFCAL   0xF0
#define      SYNC   0xFC
#define      STDBY   0xFD
#define      RESET   0xFE

void SPI_init(void) {

    SPI_DDR = (1 << MOSI_P)|(1 << SCK_P)|(1 << SS_P);
    SPI_PORT = (1 << SS_P);
    //Enable SPI, Master, set clock rate fck/128,SPI mode 1 (CPOL=0, CPHA=1)
    SPCR = (1 << SPE)|(1 << MSTR)|(1 << SPR1)|(1 << SPR0)|(0 << CPOL)|(1 << CPHA);
}

void init_all(void){

        SPI_init();
        /***enable interrupt***/
        sei();
}

int main(void){

        uint8_t SPI_buf[3];
        SPI_buf[0]=0x00;
        SPI_buf[1]=0x00;
        SPI_buf[2]=0x00;
        uint8_t j=0;
        init_all();
        while(1){
                if (j < 5){

                        SELECT();

                        SPDR = (RREG | 0x00);           //(RREG | 0x00) Read from register with starting at address 0x00
                        while(!(SPSR & (1 << SPIF)));
                        _delay_us(5);

                        SPDR = 0x02;                    //Read 3 register
                        while(!(SPSR & (1 << SPIF)));
                        _delay_us(250);                 //*ADS1256 t6 VERY IMPORTANT* min_us=t6/F_ADS1256=50/7.68MHz=7us

                        SPDR = 0xAB;
                        while(!(SPSR & (1 << SPIF)));
                        SPI_buf[0]=SPDR;
                        _delay_us(5);

                        SPDR = 0xAB;
                        while(!(SPSR & (1 << SPIF)));
                        SPI_buf[1]=SPDR;
                        _delay_us(5);

                        SPDR = 0xAB;
                        while(!(SPSR & (1 << SPIF)));
                        SPI_buf[2]=SPDR;
                        _delay_us(5);

                        DESELECT();

                        eeprom_write_byte (10*j,0xAA);
                        eeprom_write_byte (10*j+1,SPI_buf[0]);
                        eeprom_write_byte (10*j+2,SPI_buf[1]);
                        eeprom_write_byte (10*j+3,SPI_buf[2]);
                        eeprom_write_byte (10*j+5,0xCC);
                        j++;
                }
              ;
        }                       //end while(1)
        return (0);
}                               //end main


Подскажите, пожалуйста, в чем может быть проблема - пишет между 0xAA и 0xCC только 0xFF.
Filov
Подскажите, пожалуйста... Опять весь вечер промучался ...Ж)
GDI
Код
void SPI_init(void) {

    SPI_DDR = (1 << MOSI_P)|(1 << SCK_P)|(1 << SS_P);
    SPI_PORT = (1 << SS_P);
    //Enable SPI, Master, set clock rate fck/128,SPI mode 1 (CPOL=0, CPHA=1)
    SPCR = (1 << SPE)|(1 << MSTR)|(1 << SPR1)|(1 << SPR0)|(0 << CPOL)|(1 << CPHA);
}
Лучше записать так
Код
void SPI_init(void) {

    SPI_DDR |= (1 << MOSI_P)|(1 << SCK_P)|(1 << SS_P);
    SPI_PORT |= (1 << SS_P);
    //Enable SPI, Master, set clock rate fck/128,SPI mode 1 (CPOL=0, CPHA=1)
    SPCR |= (1 << SPE)|(1 << MSTR)|(1 << SPR1)|(1 << SPR0)|(1 << CPHA);
SPCR &= ~(1 << CPOL);
}
И посмотрите осциллографом, есть ли у вас вообще что то на линии MISO
Mik174
Я бы поставил в разрыв линий MOSI MISO SCK по резистору 200-680 Ом, так, чтобы АЦП был отделен ими от МК.
Разъем программирования подключается к МК напрямую.
Раз питание АЦП влияет на возможность запрограммировать МК - значит, его линии шунтируют линии SPI, а ведь с их помощью Вы шьете МК.
С резисторами программатор легко пересилит потенциал на выводах АЦП, при этом не причиняя ему и себе вреда.
Кроме того, эти резисторы совместно с емкостью монтажа образуют ФНЧ, меньше сбоев при работе будет.
Filov
Цитата(GDI @ Mar 12 2008, 13:07) *
И посмотрите осциллографом, есть ли у вас вообще что то на линии MISO


Ясно! Ж) Спасибо за поправки к коду!

Цитата(Mik174 @ Mar 12 2008, 13:33) *
Я бы поставил в разрыв линий MOSI MISO SCK по резистору 200-680 Ом, так, чтобы АЦП был отделен ими от МК.
Разъем программирования подключается к МК напрямую.
Раз питание АЦП влияет на возможность запрограммировать МК - значит, его линии шунтируют линии SPI, а ведь с их помощью Вы шьете МК.
С резисторами программатор легко пересилит потенциал на выводах АЦП, при этом не причиняя ему и себе вреда.
Кроме того, эти резисторы совместно с емкостью монтажа образуют ФНЧ, меньше сбоев при работе будет.


Сделаю!

Спасибо, господа! Главное, чтобы был свет в конце туннеля!
Для просмотра полной версии этой страницы, пожалуйста, пройдите по ссылке.
Invision Power Board © 2001-2025 Invision Power Services, Inc.