SPI - Kasimashi/Systemes-embarques GitHub Wiki
Serial Peripheral Interface (SPI) est une interface de communication synchrone série très couramment utilisé pour échanger des données entre un microprocesseur et un périphérique externe. Cette interface utilise 4 fils. Par exemple, une caméra utilise souvent un bus SPI pour contrôler la lentille ou bien pour sauvegarder les photos dans la MMC ou dans une carte SD.
SPI est simple, et nécéssite peu de puissance, et supporte de haut débits. Son désavantage réside dans le fait qu'il n'y peut y avoir qu'un seul maitre, et que les esclaves ne peuvent démarrer la communication ou contrôle la vitesse de transfert des données. Le maitre initie et contrôle toutes les communications.
Un bus SPI possède 4 files :
- Master In Slave Output (MISO)
- Master Out Slave Input (MOSI)
- A Serial CLKock line (SCLK)
- Slave Select (SS)
Le SPI supporte qu'une communication avec un esclave à la fois, pour communiquer avec un esclave le signal SS correspondant est mis à l'état bas. Dans ce cas le master génère un signal d'horloge pour coordonner la transmission des données sur les lignes MOSI et MISO.
Les données peuvent s'échanger dans les deux directions simultanément. Cette façon de communiquer est aussi appelée full duplex. A noter que le signal d'horloge lui ne vient que du maitre et que l'esclave ne peut contrôler ce signal d'horloge. Note : quand on a qu'un esclave on peut connecter le SS à la masse directement.
SPI est un protocole synchrone, et les esclave envoient et reçoivent les données grâce à une clock donnée par le maitre. Ce qui diffère d'un protocole asynchrone qui n'a pas d'horloge. Ainsi le SPI échange les données dans les deux sens à la même vitesse.
- Lorsqu'un bit est décalé sur la ligne MISO depuis le registre de données de l'esclave pendant une période d'horloge, un nouveau bit de données est décalé vers ce registre depuis la ligne MOSI dans la même période d'horloge.
-
Lorsqu'un device écrit un bit sur la data line sur front montant ou front descendant, l'autre device lit la donnée sur le front opposé sur la même période d'horloge.
-
Les données transférés sont souvent des bytes ou des halfword (16 bits)
La communication du maître vers l'esclave et la communication de l'esclave vers le maître s'effectuent toujours simultanément. Dans chaque lien de communication (MISO ou MOSI), chaque appareil envoie une donnée et reçoit en même temps une nouvelle donnée. Aucun appareil ne peut être simplement un émetteur ou un récepteur.
Par conséquent, lorsqu'un esclave souhaite envoyer des données au maître via la ligne MISO, l'esclave doit attendre le signal d'horloge. Dans le même temps, le maître doit envoyer des données factices via la ligne MOSI pour générer le signal d'horloge afin de lancer le transfert de données.
En général durant une communication le most significant bytes est envoyé en premier.
L'horloge détermine la vitesse de transfert des données. La vitesse de transmission peut varier entre 1 jusqu'à 20 megabits par secondes. Le maitre peux changer la fréquence d'horloge en programmant le registre prescaler de la clock. Pour les processeurs STM32L, le baud rate est stocké dans les bits BR[2:0] du registre CR1 du SPI. La fréquence de l'horloge est programmé en mettant une valeur appropriée.
Quatre modes sont possibles pour la configuration de l'horloge.
Quatre modes d'horloge possibles sont disponibles pour programmer le front d'horloge utilisé pour l'échantillonnage des données et le basculement des données. Les modes d'horloge dépendent de deux paramètres : la phase d'horloge (CPHA) et la polarité de l'horloge (CPOL). Lorsque CPOL est égal à 0, la ligne SCLK est abaissée pendant le temps d'inactivité. Lorsque CPOL est égal à 1, la ligne SCLK est tirée vers le haut pendant l'inactivité. Lorsque CPHA est égal à 0, la première transition d'horloge (montante ou descendante) est le premier front de capture de données. Lorsque CPHA vaut 1, la deuxième transition d'horloge est le premier front de capture. La combinaison de CPOL et CPHA sélectionne le front d'horloge pour la transmission et la capture des données. La capture du premier bit est retardée d'un demi-cycle en mode 0 et 2.