logo elektroda
logo elektroda
X
logo elektroda
REKLAMA
REKLAMA
Adblock/uBlockOrigin/AdGuard mogą powodować znikanie niektórych postów z powodu nowej reguły.

Jak nawiązać komunikację SPI między ATmega8515 a ADE7763?

djlukas 20 Lut 2012 16:53 837 0
REKLAMA
  • #1 10572691
    djlukas
    Poziom 27  
    Witam

    Nie potrafię nawiązać komunikacji pomiędzy w/w układami.

    Mam taki kod ale na wyświetlaczu ciągle dostaje 'ff' zamiast wartości którą wpisuje '02'

    #include <avr/io.h>
    #include <util/delay.h>
    #include "hd44780.h"
    #include <stdio.h>

    //********************************************definicje SPI**********************************************
    #ifndef SPI_H
    #define SPI_H

    #ifdef __AVR_ATmega8515__
    #define SPI_PORT PORTB
    #define SPI_DDR DDRB

    //PINS
    #define SCK_POS PB7
    #define MISO_POS PB6
    #define MOSI_POS PB5
    #define SS_POS PB4
    #endif

    //SS : Slave Select
    //#define SS_PORT PORTB
    //#define SS_DDR DDRB
    //#define SS_POS PB4

    #define SS_HIGH() SPI_PORT|=(1<<SS_POS)
    #define SS_LOW() SPI_PORT&=(~(1<<SS_POS))

    void SPIInit(void);
    void spi_start(void);
    void spi_end(void);
    void spi_tx(unsigned char data);
    unsigned char spi_rx(void);
    void ade7763_write_to_reg( char adres, char wartosc );
    unsigned char ade7763_read_from_reg( char adres);

    #endif

    //*********************************************************************************************************************

    char str[32]="ADE7763 TEST";

    int main(void)
    {
    SPIInit();
    lcd_init();
    LCD_DISPLAY(LCDDISPLAY);
    LCD_CLEAR;

    LCD_LOCATE(1,0);
    lcd_puts(str);

    while(1)
    {

    unsigned char wynik;

    ade7763_write_to_reg(0x13,0x02); //wysyłam na adres 0x13 wartość 0x02
    wynik = ade7763_read_from_reg(0x13); //powinienem dostac wartosc 0x02 z adresu 0x13 ale mam na lcd FF
    itoa( wynik, str, 16);
    LCD_LOCATE(6,1);
    lcd_puts(str);
    }
    }



    void ade7763_write_to_reg( char adres, char wartosc )
    {

    spi_start();
    adres = (adres+0x80); // zapisuje najpierw adres pozniej wartosc
    spi_tx(adres); //adres do wpisania
    _delay_us(0.05);
    spi_tx(wartosc); //wartosc zapisywana do rejestru
    spi_end();
    }


    unsigned char ade7763_read_from_reg( char adres)
    {
    unsigned char wartoscrej;

    spi_start();
    adres = (adres+0x00); // zapisuje najpierw adres pozniej wartosc
    _delay_us(4) ; //t9=4czeka dopoki adres sie zaladuje
    wartoscrej= spi_rx();
    return wartoscrej;
    }


    void SPIInit()
    {
    //Set up SPI I/O Ports
    SPI_DDR|=((1<<MOSI_POS)|(1<<SCK_POS)| (1 << SS_POS));
    SPCR|=(1<<SPE)|(1<<MSTR)|(1<<CPHA)|(1<<SPR1)|(1<<SPR0); //f=f/128
    }



    void spi_tx(unsigned char data)
    {
    /* Start transmission */
    SPDR = data;
    /* Wait for transmission complete */
    while(!(SPSR & (1<<SPIF)));
    return;
    }



    unsigned int fikcja;
    unsigned char spi_rx(void)
    {

    //wysyla fikcyjna wartosc
    SPDR = fikcja;
    /* Wait for reception complete */
    while(!(SPSR & (1<<SPIF)));
    /* Return data register */
    return SPDR;
    }


    void spi_start(void)
    {
    spi_end(); //czeka na zakonczenie poprzedniej sesji
    SS_LOW(); //ustawia SS na niski poziom
    return;
    }


    void spi_end(void)
    {
    SS_HIGH(); //ustawia SS na wysoki poziom
    return;
    }
  • REKLAMA
REKLAMA