Pages: [1]   Go Down
Author Topic: SPI 16 bit  (Read 622 times)
0 Members and 1 Guest are viewing this topic.
Offline Offline
Newbie
*
Karma: 0
Posts: 24
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

Buongiorno a tutti,
come dice il titolo mi serve una mano riguardo la parte SPI. Devo comunicare con una board bosch che fa da slave tramite protocollo SPI; il fatto è che questa board risponde dopo che le arrivano 16 bit, e risponde con altri 16 bit. La funzione "transfer" di arduino uno invia solo 8bit e da quello che ho capito Arduino Uno non ha il controllo sullo slave select. Questo mi causa problemi, cioè se dopo aver inviato un byte, lo slave select si alza a me crea problemi nella comunicazione.

Domanda
Come faccio a mantenere lo slave select basso e inviare un altro byte??

Grazie
Logged

Ivrea
Offline Offline
God Member
*****
Karma: 5
Posts: 680
"La teoria è quando si sa tutto ma non funziona niente. La pratica è quando funziona tutto ma non si sa il perché. In ogni caso si finisce sempre con il coniugare la teoria con la pratica: non funziona niente e non si sa il perché." Albert Einstein
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

Non saprei aiutarti, bisognerebbe andare a leggere nel datasheet del micro come gestisce il pilotaggio del chip select...
Puoi aprirti i file SPI.h e SPI.cpp e leggendo cosa c'è scritto, confrontando quanto riportato sul datasheet, capisci come funziona ed eventualmente se e come modificare qualcosa...
Logged

Rome (Italy)
Offline Offline
Tesla Member
***
Karma: 120
Posts: 9168
"Il Vero Programmatore ha imparato il C sul K&R, qualunque altro testo è inutile e deviante."
View Profile
WWW
 Bigger Bigger  Smaller Smaller  Reset Reset

da quello che ho capito Arduino Uno non ha il controllo sullo slave select.

Lo slave select è un ingresso e non una uscita, serve quando usi la SPI di Arduino in modalità slave, però in questo caso devi scriverti il tuo codice perché questa modalità non è supportata dalla relativa libreria.

Code:
Note about Slave Select (SS) pin on AVR based boards
All AVR based boards have an SS pin that is useful when they act as a slave controlled by an external master.
Since this library supports only master mode, this pin should be set always as OUTPUT otherwise the SPI interface could be put automatically
into slave mode by hardware, rendering the library inoperative.
It is, however, possible to use any pin as the Slave Select (SS) for the devices.
For example, the Arduino Ethernet shield uses pin 4 to control the SPI connection to the on-board SD card,
and pin 10 to control the connection to the Ethernet controller.
Logged

Switzerland
Offline Offline
Faraday Member
**
Karma: 112
Posts: 5900
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

...
Domanda
Come faccio a mantenere lo slave select basso e inviare un altro byte??

Grazie

Coma ti ha segnalato astrobeed, il pin SS della board Arduino è un ingresso, nel caso si voglia usare la board come "slave" (... cosa non supportata dalla libreria). Nel tuo caso devi usare un pin digitale in output (... uno a tua scelta che hai libero) e gestirlo tu (... o la libreria che troverai fatta per il tuo device) per selezionare l'unità SPI con cui vuoi parlare.

Guglielmo
Logged

Search is Your friend ... or I am Your enemy !

Offline Offline
Newbie
*
Karma: 0
Posts: 24
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

Grazie per le risposte.
Allora fatemi capire, io quando usavo i Pic abbassavo il CS, mandavo 1 o 2 byte e rialzavo il CP. Facendo lo stesso con arduino succede invece che scrivo SPI.transfer, lui invia un byte e rialza il CS, cosa che per quello che devo fare non va bene.
Ora, da quello che ho capito dalle vostre risposte, io dovrei utilizzare un'uscita digitale, una qualunque, per farla funzionare da CS. Esempio il pin10, faccio un digitalWrite(10,Low), faccio due transfer, poi rialzo il CP.....giusto?
Logged

Offline Offline
Newbie
*
Karma: 0
Posts: 24
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

P.S: questa foto fa intendere che lo SS è un'uscita


EDIT: scusate, ora ho capito il disegno, intende che il CS naturalmente deve essere in uscita dal master, però voi mi state dicendo che il pin SS sull'arduino Uno è un ingresso, quindi per avere un CS in uscita devo usare un altro pin digitale......Sorry


* sspiss2.jpg (17.9 KB, 520x361 - viewed 21 times.)
« Last Edit: March 16, 2013, 08:55:46 am by luigirocco86 » Logged

Rome (Italy)
Offline Offline
Tesla Member
***
Karma: 120
Posts: 9168
"Il Vero Programmatore ha imparato il C sul K&R, qualunque altro testo è inutile e deviante."
View Profile
WWW
 Bigger Bigger  Smaller Smaller  Reset Reset

P.S: questa foto fa intendere che lo SS è un'uscita

Il pin SS è collegato a PB2 del 328.

Dal data sheet del 328 sezione SPI:
Code:
•SS/OC1B/PCINT2 – Port B, Bit 2
SS: Slave Select input. When the SPI is enabled as a Slave, this pin is configured as an input regardless of the setting of DDB2.
As a Slave, the SPI is activated when this pin is driven low.
When the SPI is enabled as a Master, the data direction of this pin is controlled by DDB2.
When the pin is forced by the SPI to be an input, the pull-up can still be controlled by the PORTB2 bit.

Mi pare che non ci siano dubbi sul fatto che SS (PB2) è usato dalla SPI solo quando questa è settata come slave ed è esclusivamente un input, quando la SPI è in modo master SS è un normale I/O digitale che si controlla tramite gli specifici registri della porta.
Va da se che nulla vieta di usare SS come controllo del enable sul device SLAVE, ma è una cosa che decidi tu ne hai il completo controllo, ovvero non è la SPI, in modo master, a variare lo stato del pin SS.
« Last Edit: March 16, 2013, 12:40:36 pm by astrobeed » Logged

BZ (I)
Offline Offline
Brattain Member
*****
Karma: 251
Posts: 21266
+39 349 2158303
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

Se devi mandare 16 Bit ( 2 Byte) basta che non cambi lo stato del SS-Pin prima che non hai spedito i 2 Byte. esempio:

Code:
#include "SPI.h"
void setup()
  {
  pinMode(SS-pin, OUTPUT);
  SPI.begin();
  SPI.setBitOrder(MSBFIRST); //oppure SPI.setBitOrder(LSBFIRST);
  }

void setup()
  {
  ...
  digitalWrite(SS-pin, LOW);
  SPI.transfer(Byte1);
  SPI.transfer(Byte2);
  digitalWrite(SS-pin, HIGH);
  ...

Ciao Uwe
« Last Edit: March 16, 2013, 03:02:42 pm by uwefed » Logged

Switzerland
Offline Offline
Faraday Member
**
Karma: 112
Posts: 5900
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

Per inciso, la cosa non è vera per Arduino DUE, la cui libreria SPI è in grado di gestire ... sembrerebbe 3 pin come CS : "On the Arduino Due, the SAM3X has advanced SPI capabilities. It is possible to use these extended methods, or the AVR-based ones. The extended API can use pins 4, 10, and 52 for CS.".

La cosa si riflette su alcune chiamate. Esempio, la SPI.begin() diventa SPI.begin(slaveSelectPin).

Sarebbe interessante capire :

1. Perché hanno implementato questa cosa solo sulla DUE
2. Perché solo limitatamente a 3 pin

... ma probabilmente sono cose che emergono se si fa un'attenta lettura del Datasheet del SAM3X smiley

Guglielmo

Edit : Si, appunto, è descritto nelle prima pagine del DataSheet del SAM3X dove sono presentate le varie configurazioni possibili delle porte smiley-wink
« Last Edit: March 16, 2013, 11:02:23 am by gpb01 » Logged

Search is Your friend ... or I am Your enemy !

Offline Offline
Newbie
*
Karma: 0
Posts: 24
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

Grazie a tutti  smiley smiley
Logged

Pages: [1]   Go Up
Jump to: