Cos'è ElectroYou | Login Iscriviti

ElectroYou - la comunità dei professionisti del mondo elettrico

spi tra ATmega328p e Raspberry pi 2

Tipologie, strumenti di sviluppo, hardware e progetti

Moderatore: Foto UtentePaolino

1
voti

[21] Re: spi tra ATmega328p e Raspberry pi 2

Messaggioda Foto Utentescipiusbarbatus » 30 giu 2015, 23:52

Ok, grazie mille a tutti. Mi metto a studiare.
Ciao ciao
Avatar utente
Foto Utentescipiusbarbatus
35 3
 
Messaggi: 38
Iscritto il: 21 lug 2012, 18:12

0
voti

[22] Re: spi tra ATmega328p e Raspberry pi 2

Messaggioda Foto Utentesimo85 » 30 giu 2015, 23:54

A parte il microcontrollore, ti sei rassicurato che il codice sulla Ras\pi funzioni correttamente ?

O_/

scipiusbarbatus ha scritto:Mi metto a studiare.

Ottima scelta ! :ok:
Avatar utente
Foto Utentesimo85
30,9k 7 12 13
Disattivato su sua richiesta
 
Messaggi: 9927
Iscritto il: 30 ago 2010, 4:59

4
voti

[23] Re: spi tra ATmega328p e Raspberry pi 2

Messaggioda Foto Utentescipiusbarbatus » 2 lug 2015, 16:09

C'era un errore nell'inizializzazione dello slave. Riporto il codice corretto.

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

void spi_init_slave (void)
{
   DDRB=(1<<DDB4);                               //MISO as OUTPUT
   SPCR=((1<<SPE)|
   (0<<MSTR)|
   (0<<CPOL)|              // Clock Polarity (0:SCK low / 1:SCK hi when idle)
   (0<<CPHA));             // Clock Phase (0:leading / 1:trailing edge sampling);                     
   //Enable SPI
}

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

int main(void)
{
   spi_init_slave();
   unsigned char data, buffer[10];
   uint8_t x = 0;
   
   DDRB |= (1<<DDB1); //Set the 6th bit on PORTB (i.e. PB5) to 1 => output
   while(1)
   {
      data = spi_tranceiver(x++);
   }      
}


La correzione principale è stata:
Codice: Seleziona tutto
DDRB=(1<<DDB4);                               //MISO as OUTPUT


prima era

Codice: Seleziona tutto
DDRB=(1<<6);                               //MISO as OUTPUT

Studiare è sicuramente servito!
Purtroppo non riesco ad eseguire la comunicazione a più di 100kHz. In teoria non dovrebbe essere possibile arrivare a 244 kHz?
Avatar utente
Foto Utentescipiusbarbatus
35 3
 
Messaggi: 38
Iscritto il: 21 lug 2012, 18:12

1
voti

[24] Re: spi tra ATmega328p e Raspberry pi 2

Messaggioda Foto UtentePietroBaima » 2 lug 2015, 22:14

scipiusbarbatus ha scritto:Studiare è sicuramente servito!
Purtroppo non riesco ad eseguire la comunicazione a più di 100kHz. In teoria non dovrebbe essere possibile arrivare a 244 kHz?

Ottimo!
Sei uno dei pochi, anzi pochissimi, che si è messo a studiare il datasheet!
=D>

Sto pensando ad una cosa.
Se parli davvero di 100 kHz la comunicazione avviene a 200 kbps, che è vicino ai 250 kHz.
Non è che stai confondendo le due cose?
Altrimenti, se così non fosse, ci potrebbe essere il solito problema dell'errore dato dal resto dei divisori che fanno sì che una comunicazione non avvenga mai perfettamente alla velocità voluta.
Per esempio (sparo numeri a caso) se ti calcoli che il divisore dovrebbe essere 123.56 nel registro potrai mettere o 123 o 124, che ti fanno trasmettere a velocità un po' più alta o un po' più bassa del voluto.
Alle volte questo è accettabile, altre volte no.

Ciao,
Pietro.
Generatore codice per articoli:
nomi
Sul forum:
[pigreco]=π
[ohm]=Ω
[quadrato]=²
[cubo]=³
Avatar utente
Foto UtentePietroBaima
90,7k 7 12 13
G.Master EY
G.Master EY
 
Messaggi: 12206
Iscritto il: 12 ago 2012, 1:20
Località: Londra

Precedente

Torna a Realizzazioni, interfacciamento e nozioni generali.

Chi c’è in linea

Visitano il forum: Nessuno e 2 ospiti