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é.
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 :
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).
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 :
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.
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);
}
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