I2C vs SPI vs UART : différences et cas d'utilisation

Ce sont les trois interfaces série que l'on rencontre en premier dans les systèmes embarqués. L'UART est une liaison point à point simple, sans horloge partagée. Le SPI est un bus rapide à quatre fils où un maître sélectionne chaque composant par une ligne chip-select. L'I2C est un bus à deux fils où de nombreux composants partagent les mêmes lignes et sont sélectionnés par leur adresse. Le compromis se joue surtout entre la vitesse (SPI), le nombre de broches (I2C) et la simplicité (UART).

CritèreUARTSPII2C
FilsDeux fils de signal (TX et RX) plus la masseQuatre fils de signal (SCLK, MOSI, MISO) plus un chip-select (CS) par composantDeux fils partagés (SDA et SCL) plus la masse, avec des résistances de pull-up
HorlogeAsynchrone : pas de ligne d'horloge, les deux côtés doivent donc s'accorder sur le débit en baudsSynchrone : le maître génère une horlogeSynchrone : le maître génère une horloge
TopologiePoint à point entre deux composantsUn maître et plusieurs esclaves, chaque esclave nécessitant sa propre ligne CSPlusieurs maîtres et esclaves partagent un même bus
AdressageAucunLa ligne chip-select sélectionne le composantAdresse sur 7 bits (10 bits en option) envoyée au début de chaque transfert
Vitesse typiqueDe 9 600 à 115 200 bit/s jusqu'à quelques Mbit/sSouvent de 1 à 50 MHz, et davantage sur certains composants100 kHz (standard), 400 kHz (fast), 1 MHz (fast-mode plus), 3.4 MHz (high-speed)
Sens de transmissionFull duplexFull duplexHalf duplex
Contrôle d'erreursBit de parité optionnel et contrôle de trameAucun intégréAcquittement (ACK/NACK) après chaque octet
Broches quand le nombre de composants augmenteDeux broches de plus pour chaque liaison supplémentaireUne broche CS de plus pour chaque composant supplémentaireAucune broche supplémentaire
DistancePeut aller plus loin avec des drivers RS-232 ou RS-485Courte, sur la même carteCourte, sur la même carte
Usages typiquesConsole de débogage, modules GPS et Bluetooth, liaisons entre cartesMémoire flash, cartes SD, écrans, ADC et capteurs rapidesCapteurs lents, EEPROM, horloges temps réel, configuration de puces

Les valeurs indiquées sont des ordres de grandeur typiques et varient selon la génération de procédé et le produit.

Quand choisir l'un ou l'autre ?

UART
Lorsqu'il faut la liaison la plus simple possible entre deux composants, une console de débogage ou un module doté d'une interface série.
SPI
Lorsqu'il faut de la vitesse : mémoires, écrans, convertisseurs rapides. La contrepartie est un nombre de broches qui augmente avec les composants.
I2C
Lorsqu'on a beaucoup de composants lents et peu de broches : capteurs, petites mémoires, registres de configuration. La vitesse est limitée et des résistances de pull-up sont nécessaires.

Questions fréquentes

Lequel est le plus rapide, l'I2C ou le SPI ?

Le SPI. Il fonctionne souvent entre 1 et 50 MHz ou plus, tandis que l'I2C fonctionne de 100 kHz à 1 MHz dans les modes courants, et à 3.4 MHz en mode high-speed.

Pourquoi l'I2C a-t-il besoin de résistances de pull-up ?

Les composants I2C ne font que tirer les lignes vers le bas et les relâchent pour passer à l'état haut, ce sont donc des résistances qui tirent les lignes vers le haut. Cela permet à de nombreux composants de partager deux fils en toute sécurité.

Les composants UART ont-ils besoin d'une ligne d'horloge ?

Non. L'UART est asynchrone, les deux côtés doivent donc être réglés sur le même débit en bauds. Un léger écart de débit peut corrompre les caractères.

Combien de broches le SPI nécessite-t-il pour de nombreux composants ?

Le SPI nécessite des lignes SCLK, MOSI et MISO partagées plus une broche chip-select par composant : le nombre de broches augmente donc avec le nombre de composants. L'I2C ne nécessite que deux broches, quel que soit le nombre de composants.

Vérifier vos connaissances

Quelle caractéristique de la communication série par UART est correcte ?

  1. AL'émetteur fournit une ligne d'horloge, et le récepteur lit les données avec cette horloge
  2. BSans ligne d'horloge, émetteur et récepteur se calent sur la même vitesse (débit en bauds) et un bit de start signale le début
  3. CDe nombreux équipements partagent une ligne et sont sélectionnés par une adresse
Afficher la réponse et l'explication

Réponse : B. Sans ligne d'horloge, émetteur et récepteur se calent sur la même vitesse (débit en bauds) et un bit de start signale le début

L'UART est une communication série asynchrone utilisant deux lignes, émission et réception (plus la masse). Au repos, la ligne est à 1 ; un bit de start à 0 signale le début d'un caractère, suivi des bits de données puis d'un bit de stop à 1. L'horloge n'étant pas transmise, les deux côtés doivent être réglés sur la même vitesse, par exemple 115200 bps. Elle sert souvent pour les sorties de débogage et la connexion à des modules GPS ou radio.

Quelle caractéristique de la communication SPI est correcte ?

  1. AAsynchrone, sans horloge, elle relie les équipements par deux lignes seulement
  2. BSynchrone avec horloge fournie par le maître, elle permet l'émission et la réception simultanées, et une ligne de sélection de puce désigne l'interlocuteur
  3. CLa sélection par adresse permet de n'utiliser que deux lignes quel que soit le nombre d'équipements
Afficher la réponse et l'explication

Réponse : B. Synchrone avec horloge fournie par le maître, elle permet l'émission et la réception simultanées, et une ligne de sélection de puce désigne l'interlocuteur

La SPI est une communication synchrone où, au rythme de l'horloge fournie par le maître, les données circulent simultanément sur une ligne du maître vers l'esclave et une ligne de l'esclave vers le maître. Une ligne de sélection de puce (CS) est prévue pour chaque interlocuteur, et seul celui dont la ligne est à 0 communique. Simple et capable d'horloges de plusieurs dizaines de MHz, elle relie souvent des composants rapides comme les mémoires flash, les afficheurs ou les ADC.

Quelle caractéristique de la communication I2C est correcte ?

  1. AChaque équipement nécessite une ligne de sélection de puce dédiée
  2. BLes lignes d'émission et de réception sont séparées et permettent la transmission simultanée dans les deux sens
  3. CPlusieurs équipements partagent deux lignes, horloge (SCL) et données (SDA), et l'interlocuteur est sélectionné par une adresse
Afficher la réponse et l'explication

Réponse : C. Plusieurs équipements partagent deux lignes, horloge (SCL) et données (SDA), et l'interlocuteur est sélectionné par une adresse

L'I2C est une communication série synchrone reliant plusieurs équipements par deux lignes seulement, SCL et SDA. Le maître envoie d'abord l'adresse 7 bits de l'interlocuteur, et seul l'équipement à cette adresse répond. Les lignes sont à drain ouvert, tirées à 1 par des résistances de tirage, et tout équipement peut les forcer à 0. Elle convient aux composants pour lesquels la réduction du câblage importe plus que la vitesse, comme les capteurs de température, les accéléromètres ou les EEPROM.

  1. Pour un UART à 115200 bps au format 8 bits de données, sans parité, 1 bit de stop (8N1), quelle valeur est la plus proche du nombre d'octets transmissibles par seconde ?
  2. Quelle combinaison correspond aux quatre signaux couramment utilisés en SPI ?
  3. En I2C, comment le récepteur d'un octet signale-t-il qu'il l'a reçu ?

Questions d'entraînement sur Systèmes embarqués et firmware

Termes clés expliqués

UART
Circuit de communication série asynchrone, sans ligne d'horloge, où émetteur et récepteur se calent sur le même débit en bauds. Les caractères sont délimités par des bits de start et de stop.
SPI
Liaison série synchrone qui émet et reçoit simultanément au rythme de l'horloge fournie par le maître. Une ligne de sélection de puce (chip select) choisit l'interlocuteur ; utilisée pour connecter des composants rapides.
I2C
Communication série synchrone qui connecte plusieurs équipements sur deux lignes, horloge (SCL) et données (SDA), et sélectionne le correspondant par une adresse. Les lignes sont à drain ouvert avec résistances de rappel (pull-up).
GPIO
Broche d'entrée/sortie à usage général (General Purpose Input/Output). Configurable par logiciel en entrée ou en sortie, elle sert à lire des interrupteurs, allumer des LED, etc.

Comparatifs associés