3.21. Bases du SPI¶
Le SPI (Serial Peripheral Interface) est un bus série synchrone conçu pour les liaisons à courte portée et haut débit entre un contrôleur et un ou plusieurs périphériques situés sur la même carte. C’est l’interface standard des cartes SD, des écrans, de la mémoire flash, des ADC et DAC, ainsi que d’une large gamme de capteurs.
Là où l’UART n’avait pas d’horloge partagée et reconstruisait la cadence à partir de la ligne de données elle-même, le SPI fait courir un fil d’horloge le long des fils de données. Le contrôleur pilote l’horloge à la vitesse qu’il souhaite, et tous les autres composants du bus échantillonnent les données en synchronisation avec cette horloge. Il n’y a ni estimation du débit en bauds ni surcoût de tramage – seulement des fronts d’horloge et des bits.
3.21.1. Les quatre fils¶
Un bus SPI en duplex intégral comporte quatre fils :
SCK (horloge série). Piloté par le contrôleur. Chaque bit est cadencé en entrée ou en sortie sur un front de ce signal.
MOSI (sortie contrôleur, entrée périphérique). La ligne de sortie du contrôleur ; le périphérique y échantillonne les bits.
MISO (entrée contrôleur, sortie périphérique). La ligne de sortie du périphérique ; le contrôleur y échantillonne les bits.
CS (chip select, sélection de puce), parfois appelée SS (sélection de périphérique). Une ligne distincte par périphérique. Le contrôleur met CS à l’état bas pour démarrer une transaction et de nouveau à l’état haut pour la terminer ; tout périphérique dont la ligne CS est désactivée ignore entièrement le bus et cesse de piloter sa sortie MISO.
Un octet SPI : CS passe à l’état bas pour sélectionner le périphérique, SCK cadence huit bits, et MOSI et MISO transfèrent chacun un octet dans des directions opposées.¶
Chaque front d’horloge déplace un bit dans chaque direction simultanément. Une seule impulsion SCK envoie un bit sur MOSI et reçoit en même temps un bit sur MISO – le SPI est full-duplex au niveau du fil. Le logiciel n’est pas obligé d’utiliser les deux directions : les transactions en écriture seule et en lecture seule sont courantes, la ligne inutilisée étant soit ignorée, soit maintenue à l’état haut.
3.21.2. Polarité et phase de l’horloge¶
Deux bits de configuration déterminent exactement quel front d’horloge déplace les données :
Polarité de l’horloge (
polarity, parfoisCPOL) – l’état de repos de SCK.0signifie que l’horloge est au repos à l’état bas et pulse à l’état haut ;1signifie que l’horloge est au repos à l’état haut et pulse à l’état bas.Phase de l’horloge (
phase, parfoisCPHA) – le front sur lequel les données sont échantillonnées.0échantillonne sur le premier front de chaque impulsion d’horloge (front montant) ;1échantillonne sur le second front (front descendant).
Ensemble, ces deux bits donnent quatre modes, classiquement appelés Mode 0 à Mode 3. Le Mode 0 (polarity=0, phase=0) est le plus courant et constitue une valeur par défaut sûre pour les composants inconnus.
La règle essentielle est que les deux extrémités doivent s’accorder sur le mode. Des modes incompatibles produisent des données erronées même si les lignes d’horloge et de données sont correctement câblées ; si un composant renvoie n’importe quoi dès la première transaction, le mode est la première chose à vérifier.
3.21.3. Plusieurs périphériques¶
Plusieurs périphériques peuvent partager les mêmes lignes SCK, MOSI et MISO du moment que chacun dispose de sa propre ligne CS pilotée par le contrôleur :
Tous les périphériques voient la même horloge et les mêmes données, mais chacun surveille sa propre ligne CS. Lorsque CS est désactivée (état haut), un périphérique ignore entièrement SCK et MOSI et laisse MISO en haute impédance afin de ne pas se disputer la ligne avec les autres composants.
Le contrôleur active exactement une ligne CS à la fois, exécute la transaction, puis désactive CS pour libérer le bus.
Un microcontrôleur doté d’un seul bloc SPI matériel peut communiquer avec autant de périphériques qu’il a de broches GPIO libres à consacrer aux lignes CS – il n’y a aucun adressage sur le bus lui-même.
3.21.4. Forces et faiblesses¶
Les forces comme les faiblesses du SPI découlent toutes de sa conception :
Rapide. Des dizaines de mégahertz sont atteignables sur des tracés courts avec une simple adaptation de niveau. Les lecteurs de cartes SD et les écrans SPI exploitent cette caractéristique.
Simple au niveau du fil. Pas d’adressage, pas d’acquittements, pas de conditions de start/stop particulières – juste des bits sur les fils synchronisés sur une horloge.
Gourmand en broches. Trois lignes partagées plus une ligne CS par périphérique. Une carte comportant cinq composants SPI utilise huit broches (trois + cinq).
Courte portée. Le SPI suppose des fronts propres et rapides, ce qui implique des tracés courts sur la même carte. Pour des liaisons plus longues, l’I2C ou l’un des bus tramés convient mieux.