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.


Modified text is an extract of the original Stack Overflow Documentation
Sous licence CC BY-SA 3.0
Non affilié à Stack Overflow