Pagina 1 di 3

spi tra ATmega328p e Raspberry pi 2

MessaggioInviato: 30 giu 2015, 7:06
da scipiusbarbatus
Saluti a tutti,
creo un nuovo post perché l'argomento mi sembra diverso.
Sto cercando di interfacciare tramite spi il micro ATmega328p (quello di arduino) e un raspberry pi 2 (40 pin).
Purtroppo non riesco ad ottenere nessuna comunicazione tra i due. Vi posto i dettagli del progetto.

Ho collegato i seguenti pin:
ATmega------->Raspberry PI
17------------->19 (MOSI)
18------------->21 (MISO)
19------------->23 (SCLK)
22------------->20 (GND)

Codice: Seleziona tutto
    #define F_CPU 20000000UL
    #include <avr/io.h>
    #include <util/delay.h>

    void spi_init_slave (void)
    {
       DDRB=(1<<6);                                  //MISO as OUTPUT
       SPCR=(1<<SPE);                                //Enable SPI
    }

    unsigned char spi_tranceiver (unsigned char data)
    {
       SPDR = data;                                  //Load data into buffer
       while(!(SPSR & (1<<SPIF) ));                  //Wait until transmission complete
       return(SPDR);                                 //Return received data
    }

    int main(void)
    {
       spi_init_slave();
       unsigned char data, buffer[10];
       uint8_t x = 0;
       
       while(1)
       {
          data = spi_tranceiver(++x);
           _delay_ms(1000);   
       }     
    }



Raspberry pi 2:
Codice: Seleziona tutto
    import spidev
    import time

    spi=spidev.SpiDev()

    spi.open(0,0)
    try:
        while True:
            resp = spi.xfer2([0xAA])
            print "receiving:", resp[0]
            time.sleep(1.0)
    except KeyboardInterrupt:
        spi.close()



Cosa c'è che non va? Mi potete aiutare?

Re: spi tra ATmega328p e Raspberry pi 2

MessaggioInviato: 30 giu 2015, 13:36
da TardoFreak
Ad una prima occhiata,
Non vedo il collegamento sul pin SS. Quello ci vuole altrimenti come fa AVR a capire quando stanno trasmettendo a lui?
Codice: Seleziona tutto
data = spi_tranceiver(++x);

semmai
Codice: Seleziona tutto
data = spi_tranceiver(x++);

Anche solo per usare anche l'elemento 0.

Il delay(1000) non ha ragione di esistere.

Re: spi tra ATmega328p e Raspberry pi 2

MessaggioInviato: 30 giu 2015, 20:31
da scipiusbarbatus
Saluti,
ho collegato il pin 22 di raspberry con il pin 17 dell'Atmega. Corretto l'incremento su x, commentato il delay, ma il risultato è sempre "receiving: 0"...
Aiuto!!!!
Dato che il raspberry con spidev_test.c funziona, penserei a qualcosa su ATmege, ma il programma mi sembra così semplice da essere corretto.
Avete dei suggerimenti?

Re: spi tra ATmega328p e Raspberry pi 2

MessaggioInviato: 30 giu 2015, 20:38
da PietroBaima
E' tutto a 3.3 V, vero?

Re: spi tra ATmega328p e Raspberry pi 2

MessaggioInviato: 30 giu 2015, 21:21
da scipiusbarbatus
Si, certo, per sicurezza derivo l'alimentazione dal raspberry.
Ho riprovato con spidev_test, collegato all'atmega e ottengo solo 0, mentre se collego MISO con MOSI di raspberry ottengo i valori esadecimali corretti...
sul pin 16 di atmega leggo circa 3 volt.
Può essere un problema FCPU di atmega a 20MHz?

Re: spi tra ATmega328p e Raspberry pi 2

MessaggioInviato: 30 giu 2015, 21:51
da PietroBaima
dal raspberry partono 2 fili, +3.3V e GND e vanno all'alimentazione dell'AVR, poi c'è MISO MOSI SCK SS ?

Re: spi tra ATmega328p e Raspberry pi 2

MessaggioInviato: 30 giu 2015, 21:55
da scipiusbarbatus
Esatto. I 20MHz del Atmega centrano qualcosa?

Re: spi tra ATmega328p e Raspberry pi 2

MessaggioInviato: 30 giu 2015, 21:59
da PietroBaima
Come glieli dai i 20 MHz? Quarzo+2 C? su cosa l'hai montato?

Re: spi tra ATmega328p e Raspberry pi 2

MessaggioInviato: 30 giu 2015, 22:03
da PietroBaima
AHA! GOTCHA!

Ho aperto il data-sheet di quel micro e ho trovato questo:

Speed Grade:0 - 4MHz@1.8 - 5.5V, 0 - 10MHz@2.7 - 5.5.V, 0 - 20MHz @ 4.5 - 5.5V


Non puoi farlo andare a 20 MHz e anche a 3.3V, gli tiri il collo!

Re: spi tra ATmega328p e Raspberry pi 2

MessaggioInviato: 30 giu 2015, 22:10
da scipiusbarbatus
Si, ho un quarzo da 20Mhz e due condesatori. Tutto su breadboard.
Cosa potrei fare? Togliere il quarzo? Resetto i fuses e lavoro a 8Mhz?