Introduction

Le Serial Peripheral Interface (SPI) est un protocole de communication série synchrone couramment utilisé dans les microcontrôleurs et les systèmes embarqués. Sur les cartes Arduino, le SPI permet une communication rapide et efficace avec divers périphériques externes tels que les capteurs, les mémoires, et les modules de communication sans fil. Ce protocole est apprécié pour sa simplicité, sa vitesse et sa flexibilité.

Fonctionnement de la liaison

La liaison SPI est synchrone, ce qui signifie que la transmission nécessite l’horloge donné avant la transmission.

C’est une liaison full duplex, ce qui signifie que l’on peut écouter ce que l’on émet tout émettant des bits.

Ce n’est pas une liaison exclusive, les circuits communiquent selon un schéma maître-esclaves, où le maître s’occupe totalement de la communication. Plusieurs esclaves peuvent coexister sur un même bus, dans ce cas, la sélection du destinataire se fait par une ligne dédiée entre le maître et l’esclave appelée chip select comme on peut le voir sur le schéma ci-dessous :

liaison spi

SPI a des lignes labellisés «MOSI » : Master Output Slave Input, généré par le maître, des lignes labellisées « MISO » : Master Input Slave Output, généré par l’esclave et une ligne d’horloge (SCK : SPI Serial Clock).

Ces trois lignes sont connectées à leurs lignes respectives sur un ou plusieurs esclaves. Les esclaves sont identifiées grâce au signal de leur ligne CS (Chip Select).

Broche SPI sur la carte Arduino

Sur les cartes Arduino, les broches dédiées au SPI varient en fonction du modèle de la carte. Par exemple, sur une Arduino Uno, les broches SPI sont :

  • MISO : Broche 12
  • MOSI : Broche 11
  • SCK : Broche 13
  • SS : Broche 10 (ou toute autre broche configurée par l’utilisateur)

Ecriture sur le SPI

Arduino simplifie l’utilisation du SPI grâce à sa bibliothèque SPI.h. Voici un exemple de base de l’utilisation de cette bibliothèque pour communiquer avec un périphérique SPI :

#include <SPI.h>

void setup() {
  // Initialisation de la communication SPI
  SPI.begin();
  // Configuration de la broche SS comme sortie
  pinMode(10, OUTPUT);
}

void loop() {
  // Activation de l'esclave en mettant SS à LOW
  digitalWrite(10, LOW);
  
  // Envoi d'un octet de données au périphérique SPI
  byte dataSent = 0x42;
  byte dataReceived = SPI.transfer(dataSent);
  
  // Désactivation de l'esclave en mettant SS à HIGH
  digitalWrite(10, HIGH);
  
  // Attendre avant de refaire une transmission
  delay(1000);
}

Le programme suivant envoie l’octet 42 par la liaison SPI.

 

Lecture sur le SPI

Si vous souhaitez lire les valeurs sur le SPI de la carte Arduino :

#include <SPI.h>

// Définir la broche SS (Slave Select)
const int slaveSelectPin = 10;

void setup() {
  // Initialiser la communication série pour afficher les résultats
  Serial.begin(9600);

  // Configurer la broche SS comme sortie
  pinMode(slaveSelectPin, OUTPUT);

  // Initialiser la communication SPI
  SPI.begin();

  // Optionnel : Configurer les paramètres SPI
  SPI.setClockDivider(SPI_CLOCK_DIV16); // Diviser l'horloge par 16 (1 MHz pour une horloge à 16 MHz)
  SPI.setDataMode(SPI_MODE0);           // Mode SPI 0
  SPI.setBitOrder(MSBFIRST);            // Ordre des bits : MSB en premier
}

void loop() {
  // Activer l'esclave en mettant SS à LOW
  digitalWrite(slaveSelectPin, LOW);

  // Envoyer une requête de lecture au périphérique SPI
  byte requestByte = 0x00; // Exemple de requête (peut varier selon le périphérique)
  byte receivedValue = SPI.transfer(requestByte);

  // Désactiver l'esclave en mettant SS à HIGH
  digitalWrite(slaveSelectPin, HIGH);

  // Afficher la valeur reçue dans le moniteur série
  Serial.print("Valeur reçue : ");
  Serial.println(receivedValue);

  // Attendre avant de refaire une lecture
  delay(1000);
}

Conclusion

Si vous souhaitez avoir plus d’informations sur les bus de communications disponible sur Arduino, nous avons écrit des cours sur l’UART et l’I2C.

Si vous souhaitez mettre en application ce qui a été vue dans ce cours vous pouvez lire notre cours sur le RFID qui utilise la liaison SPI pour fonctionner