Go Down

Topic: SPI Slave (Read 1 time) previous topic - next topic

zuzzuz

Salve ho bisogno di scrivere il codice per far funzionare arduino da slave SPI, e inviare al monitor seriale i dati che riceve dal master in modo da visualizzarli.
Qualcuno sa darmi una mano?
Grazie

uwefed

perché SPI? Con I2C ti servono solo 2 cavetti.
Ciao Uwe

PaoloP

Forse perché il Master non è un Arduino (lui non l'ha detto) è ha solo l'interfaccia SPI.  :smiley-roll:
Code fast. Code easy. Codebender --> http://codebender.cc/?referrer=PaoloP

zuzzuz

salve nonostante debba comunicare con una stm32 (master) provvista di i2c ho cmq bisogno di usare l'interfaccia spi.
Mi serve solo che arduino legga i dati arrivati dal master e li visualizzi sul monitor seriale.

PaoloP

#4
Aug 01, 2012, 12:11 pm Last Edit: Aug 01, 2012, 12:23 pm by PaoloP Reason: 1
Prova a vedere qui --> http://www.arduino.cc/cgi-bin/yabb2/YaBB.pl?num=1294596127
e qui --> http://www.arduino.cc/cgi-bin/yabb2/YaBB.pl?num=1264732746

Nel datasheet del 328P, da pag. 168 trovi tutte le info --> http://www.atmel.com/Images/doc8271.pdf
Code fast. Code easy. Codebender --> http://codebender.cc/?referrer=PaoloP

zuzzuz


e qui --> http://www.arduino.cc/cgi-bin/yabb2/YaBB.pl?num=1264732746

Questo esempio è proprio quello che voglio realizzare, ho però alcuni problemi,se provo a compilare lo sketch slave ho degli errori di funzioni non dichiarate, che da quanto credo di aver capito dipendono dal fatto che invece di utilizzare la libreria standard spi identificata come <spi.h> sto provando a caricare una modificata.
All'inizio infatti vengono postati 2 codici che non ho ben capito come devo chiamarli per inserirli nel codice.
Io ho provato a chiamare il primo Spi.h e il secondo WProgram.h ma non riesco a compilare poichè il secondo file da una miriade di errori.
Qualche consiglio?

PaoloP

Se ti da errore in "Wprogram.h" vuol dire che stai usando una recente versione dell'IDE: la 1.0 o la 1.0.1.
Per risolvere puoi: o scaricarti la versione 0023 che usava il "Wprogram.h" o sostituire l'include con #include "Arduino.h"
Questo perchè con le versioni 1.0 e 1.0.1 il file Wprogram.h è stato rinominato.
Code fast. Code easy. Codebender --> http://codebender.cc/?referrer=PaoloP

zuzzuz

Per riuscire a compilare ho dovuto sostituire i 2 file spi.cpp e spi.h nella cartella di installazione di arduino, adesso provo a fare dei test per vedere se effettivamente la board fa quello che le viene richiesto, però vorrei sapere se sono molte le modifiche nelle librerie spi, visto che con le nuove librerie lo sketch non compila.
Grazie

zuzzuz

questo è ciò che mando dal master
Code: [Select]
uint8_t SPIy_Buffer_Tx[BufferSize] = {0x01, 0x02, 0x03, 0x04, 0x05, 0x06, 0x07,
                                      0x08, 0x09, 0x0A, 0x0B, 0x0C, 0x0D, 0x0E,
                                      0x0F, 0x10, 0x11, 0x12, 0x13, 0x14, 0x15,
                                      0x16, 0x17, 0x18, 0x19, 0x1A, 0x1B, 0x1C,
                                      0x1D, 0x1E, 0x1F, 0x20};

questo è quello che ricevo

Code: [Select]
FFFFFFC0
rx
40
rx
FFFFFF88
rx
18
rx
FFFFFFF0
rx
FFFFFFF0
rx
30
rx
10
rx
20
rx
4
rx
FFFFFF88
rx
50
rx
60
rx
40
rx
78
rx
58
rx
68
rx
48
rx
70
rx
50
rx
60
rx
40
rx
FFFFFFF8
rx
4
rx

Dove sbaglio?

zuzzuz

Ho provato a modificare lo sketch, con le nuove librerie

Code: [Select]
#include <SPI.h>


#define SCK_PIN   13
#define MISO_PIN  12
#define MOSI_PIN  11
#define SS_PIN    10

void SlaveInit(void) {
 // Set MISO output, all others input
 pinMode(SCK_PIN, INPUT);
 pinMode(MOSI_PIN, INPUT);
 pinMode(MISO_PIN, OUTPUT);
 pinMode(SS_PIN, INPUT);

 // Enable SPI
 SPCR = B00000000;
 SPCR = (1<<SPE);
}

uint8_t ReadByte(void) {
 while(!(SPSR & (1<<SPIF))) ;
 return SPDR;
}

void WriteByte(uint8_t value) {
 SPDR = value;
 while (!(SPSR & (1<<SPIF))) ;
 return;
}




void setup()
{
 Serial.begin(9600);
 SlaveInit();
}

void loop()
{
uint8_t RX_Data;
 RX_Data = ReadByte();
 WriteByte(0x01);
 Serial.println(RX_Data);
//  Serial.println(RX_Data, HEX);
 Serial.println("rx");
}

compila, ma continua a non visualizzarmi il giusto risultato, vi posto il tipo di configurazione del master magari qualcuno riesce ad aiutarmi a sistemare

Code: [Select]
 SPI_InitStructure.SPI_Direction = SPI_Direction_2Lines_FullDuplex;
 SPI_InitStructure.SPI_Mode = SPI_Mode_Master;
 SPI_InitStructure.SPI_DataSize = SPI_DataSize_8b;
 SPI_InitStructure.SPI_CPOL = SPI_CPOL_Low;
 SPI_InitStructure.SPI_CPHA = SPI_CPHA_2Edge;
 SPI_InitStructure.SPI_NSS = SPI_NSS_Hard;
 SPI_InitStructure.SPI_BaudRatePrescaler = SPI_BaudRatePrescaler_4;
 SPI_InitStructure.SPI_FirstBit = SPI_FirstBit_LSB;
 SPI_InitStructure.SPI_CRCPolynomial = 7;
 SPI_Init(SPIy, &SPI_InitStructure);

zuzzuz

Sono ancora bloccato su questo problema, ho anche provato a invertire le schede facendo master con arduino e slave con l'altra scheda ma i dati continuano ad arrivare sbagliati.
Potrebbe essere un problema di clock delle 2 schede non compatibili? qualcuno ha qualche idea?

Go Up