Protocole SPI
Introduction
Le mode SPI permet la transmission et la réception simultanée (full duplex) de 8 bits de données de manière
synchrone. Selon le protocole SPI, l’interconnexion du microcontrôleur avec un autre périphérique nécessite
généralement, trois broches :
• Master Out Slave In (MOSI)
• Master In slave Out (MISO)
• Serial Clock (SCK)
En outre, une quatrième broche peut être utilisée en mode esclave :
���).
• Slave Select (𝑆𝑆𝑆𝑆
La figure suivante illustre le schéma bloc simplifié d’une liaison entre le maître et l’esclave.
Maître Esclave
MOSI MOSI
MISO MISO
Registre à décalage Registre à décalage
MSB LSB MSB LSB
SCK SCK
Les communications sont initiées par le maître. A chaque cycle d’horloge, l’envoi d’un bit par le maître,
s’accompagne d’envoi d’un bit par l’esclave.
Modes de fonctionnement
Il existe quatre combinaisons de phase et de polarité d’horloge SCK par rapport aux données série, qui sont
déterminées par les bits de contrôle CPHA et CPOL. Le tableau suivant résume les valeurs associées aux bits CPOL
et CPHA pour chaque mode de fonctionnement.
Mode SPI Conditions Front d’envoi Front de lecture
0 CPOL=0, CPHA=0 Descendant Montant
1 CPOL=0, CPHA=1 Montant Descendant
2 CPOL=1, CPHA=0 Montant Descendant
3 CPOL=1, CPHA=1 Descendant Montant
Les formats de transfert de données SPI sont illustrés dans les figures suivantes Les bits de données sont décalés et
verrouillés sur les fronts opposés du signal SCK, ce qui garantit un temps suffisant pour que les signaux de données
se stabilisent.
[Link]
2
Librairie arduino
La librairie SPI (spi.h) comporte les fonctions suivantes :
[Link](dataOrder) : définie le sens de transfert, c-à-d, le bit à transférer en premier MSB ou LSB.
Ce paramètre peut être : MSBFIRST ou LSBFIRST.
[Link]() : l’horloge de bus SPI est dérivée de la fréquence système. La fréquence du système
peut être divisée par : 2, 4, 8, 16, 32, 64 ou 128. Le paramètres speedMaximun peut être : SPI_CLOCK_DIV2,
SPI_CLOCK_DIV4, SPI_CLOCK_DIV8, SPI_CLOCK_DIV16, SPI_CLOCK_DIV32, SPI_CLOCK_DIV64 ou
SPI_CLOCK_DIV128.
[Link](dataMode) : définie le mode SPI. Ce paramètre peut être : SPI_MODE0, SPI_MODE1,
SPI_MODE2, ou SPI_MODE3.
[Link]() : Initialise le bus SPI :
- SCK, MOSI et SS en sortie,
- SCK et MOSI au niveau bas,
- SS au niveau haut.
[Link]() : Désactive le bus SPI (en laissant les modes de broche inchangés).
[Link](), SPI.transfer16() : Le transfert SPI est basé sur un envoi et une réception simultanée : les
données reçues sont renvoyées dans receiveVal (ou receiveVal16). En cas de transfert de tampon, les données reçues
sont stockées dans la mémoire tampon en place (les anciennes données sont remplacées par les données reçues).
receivedVal = [Link](val) ;
receivedVal16 = SPI.transfer16(val16) ;
[Link](buffer, size) ;
Ali Hmidene
3
Exemple 1
L’AD5621 est un convertisseur numérique-analogique de 12 bits à sortie tension. Ce circuit utilise une interface série
à trois fils compatible SPI.
La tension de sorte est régie par l’équation suivante :
(𝐷𝐷)
𝑉𝑉𝑜𝑜𝑜𝑜𝑜𝑜 = 𝑉𝑉𝐷𝐷𝐷𝐷
212
Avec 𝑽𝑽𝑫𝑫𝑫𝑫 tension d’alimentation 5V et 𝑫𝑫, la valeur numérique codée sur 12bits.
L’AD5621 contient une fonction de mise hors tension pour réduire sa consommation. Il fournit également des charges
de sortie sélectionnables pour la mise hors tension.
Ecrire un programme qui permet de générer à la sortie du DAC une tension de 3,3V.
Corrigé
𝑉𝑉𝑜𝑜𝑜𝑜𝑜𝑜 = 3,3𝑉𝑉 → 𝐷𝐷 = 2703
#include "SPI.h" // library
const int SYNC=10; // la broche 10 pour la sélection de l'esclave
void setup()
{ [Link](9600);
[Link]();
pinMode(SYNC, OUTPUT); // SYNC en sortie
digitalWrite(SYNC, HIGH); // intialiser SYNC à 0
[Link](MSBFIRST);
[Link](SPI_CLOCK_DIV8);
[Link]
4
[Link](SPI_MODE2);
SetDACValue(2703);
}
void SetDACValue(int value)
{ byte dataL, dataH;
unsigned int data;
data = value << 2; // ajuster la valeur
dataH = data >> 8; // decomposer la valeur en deux octets
dataL = data & 0xFF;
digitalWrite(SYNC, LOW); // Sélectionner le circuit
[Link](dataH); // envoyer la valeur
[Link](dataL);
digitalWrite(SYNC,HIGH); // désactiver le circuit
}
void loop(){
}
Ali Hmidene