Aller au contenu

SPI

Dans les chapitres précédents, nous avons vu l’UART avec lequel des appareils peuvent communiquer sur des longues distances, puis le bus I2C qui permet à de nombreux appareils de communiquer sur des distances plus courtes. Maintenant nous nous intéressons à l’interface SPI (Serial Peripheral Interface) dont le principal atout est de permettre des communications “full-duplex” plus rapides.

UART

SPI

Pour permettre une communication “full-duplex”, le SPI utilise deux signaux : SDO1 (Serial Data Output) et SDI2 (Serial Data Input). Avec le signal d’horloge SCK (Serial Clock), ces signaux forment un bus sur lequel se connectent tous les appareils.

Pour identifier un périphérique, le contrôleur “active” signal CS (Chip Select) correspondant. Il n’y a donc pas d’adresse qui est envoyée sur le bus (comme c’est le cas pour l’I2C), mais bien un fil dédié pour chaque périphérique. Cette construction rend le câblage plus compliqué, mais elle est plus performante, car il n’est plus nécessaire d’envoyer une adresse sur le bus. Le bus SPI est conçu pour rester sur la même carte électronique, il n’y a donc pas de câblage à proprement parler, mais il faut quand même dédier une broche du microcontrôleur à chaque périphérique.

Le SPI est un bus synchrone plutôt rapide. La fréquence de l’horloge est souvent entre 1MHz et 50MHz. Comme chaque périphérique est adressé par son signal CS, il est possible d’utiliser des fréquences différentes pour différents périphériques. On maximise ainsi les performances.

Grâce à ces performances, le SPI est utilisé par les systèmes embarqués pour lire et écrire les cartes SD3.

Carte SD

Carte SD (source : www.electroniccircuitsdesign.com)

Grâce à ces bonnes performances, le bus SPI est aussi utilisé pour :

Certains fabricants de périphériques offrent les deux types de communication (SPI ou I2C) et laissent le choix à l’utilisateur final. C’est le cas par exemple de ce gyroscope 6 axes avec accéléromètre :

Gyroscope

MPU6500 : gyroscope 6 axes avec accéléromètre

Pour plus d’information, consultez la page Wikipedia.

Pour utiliser le SPI avec Mbed OS consultez la documentation de l’API correspondante.

Exercice

Exercice SPI/1

Avec un SPI rapide (50MHz), combien de temps faut-il pour lire complètement une carte SD de 16GiB ?

Solution

\(16\,\mathsf{GiB} = 16 \cdot 8 \cdot 2^{30}\,\mathsf{bit}\). Il faut donc \((128 \cdot 2^{30}) \div (50 \cdot 10^{6}) = 2748\,\mathsf{secondes})\) ou environ \(45\,\mathsf{minutes}\).

Si vous n’avez pas de calculatrice, vous pouvez utiliser l’approximation \(2^{30} \approx 10^{9}\) et ça donne donc \((128 \cdot 10^{9}) \div (50 \cdot 10^{6}) = 2560\,\mathsf{secondes} \approx 42\,\mathsf{minutes}\).


  1. Le signal SDO était aussi appelé MOSI pour “Master Out Slave In”, mais cette expression n’est plus utilisée à cause des références à un système raciste d’oppression violente (https://www.washingtonpost.com/opinions/2020/06/12/tech-industry-has-an-ugly-master-slave-problem/). 

  2. Le signal SDI était aussi appelé MISO

  3. En plus du SPI, les cartes SD permettent d’autres modes de transfert qui permettent des vitesses plus élevées.