arduino
Communication SPI
Recherche…
Remarques
Signaux de sélection de puce
La plupart des esclaves ont une entrée de sélection de puce faible active. Le code approprié pour initialiser et utiliser une broche de sélection de puce est le suivant:
#define CSPIN 1 // or whatever else your CS pin is
// init:
pinMode(CSPIN, OUTPUT);
digitalWrite(CSPIN, 1); // deselect
// use:
digitalWrite(CSPIN, 0); // select
... perform data transfer ...
digitalWrite(CSPIN, 1); // deselect
La désélection d'un esclave est tout aussi importante que sa sélection, car un esclave peut piloter la ligne MISO pendant sa sélection. Il peut y avoir beaucoup d'esclaves, mais un seul peut conduire MISO. Si un esclave n'est pas désélectionné correctement, deux esclaves ou plus peuvent piloter le MISO, ce qui peut entraîner des courts-circuits entre leurs sorties et endommager les appareils.
Transactions
Les transactions ont deux objectifs:
- dire au SPI que nous voulons commencer et finir de l'utiliser dans un contexte particulier
- configurer le SPI pour une puce spécifique
La ligne d'horloge a différents états de veille dans les différents modes SPI. Le changement du mode SPI lorsqu'un esclave est sélectionné peut induire en erreur l'esclave. Réglez donc toujours le mode SPI avant de sélectionner un esclave. Le mode SPI peut être défini avec un objet SPISettings
transmis à SPI.beginTransaction
:
SPI.beginTransaction(SPISettings(1000000, MSBFIRST, SPI_MODE0));
digitalWrite(CSPIN, 0);
... perform data transfer ...
digitalWrite(CSPIN, 1);
SPI.endTransaction();
SPISettings
peuvent également être stockés ailleurs:
SPISettings mySettings(1000000, MSBFIRST, SPI_MODE0);
SPI.beginTransaction(mySettings);
Si une autre partie du code tente d'utiliser le SPI entre une paire d'appels à beginTransaction()
et endTransaction()
, une erreur peut survenir - la manière dont cela se produit dépend de l'implémentation.
Voir aussi la référence Arduino: SPISettings
Utilisation du SPI dans les routines du service d'interruption
Si le SPI doit être utilisé dans un ISR, aucune autre transaction ne peut avoir lieu en même temps. La bibliothèque SPI fournit usingInterrupt(interrupt_number)
pour faciliter cela. Cela fonctionne en désactivant l'interruption donnée chaque fois que beginTransaction()
est appelée, de sorte que l'interruption ne peut pas se déclencher entre cette paire d'appels à beginTransaction()
et endTransaction()
.
Voir aussi la référence Arduino: SPI: usingInterrupt
Notions de base: initialiser le SPI et une broche de sélection de puce, et effectuer un transfert d'un octet
#include <SPI.h>
#define CSPIN 1
void setup() {
pinMode(CSPIN, OUTPUT); // init chip select pin as an output
digitalWrite(CSPIN, 1); // most slaves interpret a high level on CS as "deasserted"
SPI.begin();
SPI.beginTransaction(SPISettings(1000000, MSBFIRST, SPI_MODE0));
digitalWrite(CSPIN, 0);
unsigned char sent = 0x01;
unsigned char received = SPI.transfer(sent);
// more data could be transferred here
digitalWrite(CSPIN, 1);
SPI.endTransaction();
SPI.end();
}
void loop() {
// we don't need loop code in this example.
}
Cet exemple:
- initialise correctement et utilise une broche de sélection de puce (voir remarques)
- utilise correctement une transaction SPI (voir remarques)
- utilise uniquement le SPI pour transférer un seul octet. Il existe également une méthode de transfert de tableaux, qui n’est pas utilisée ici.