Microcontrôleur – Chapitre 2 – Le processeur

Le processeur est un composant complexe et incontournable. Après son invention à la fin de la Seconde Guerre Mondiale, sa taille a fortement diminué (de plusieurs dizaines de mètres de large à quelque millimètres) pour donner naissance au microprocesseur dans les années 1970.

Depuis, la densité de transistors présente au sein d’un processeur n’a cessé de croitre au point de doubler tous les deux ans (selon la célèbre loi de Moore). Ainsi les processeurs actuels (en 2015) contiennent un million de fois plus de transistors que les premiers microprocesseurs mis sur le marché quarante ans auparavant.

Le processeur d’un microcontrôleur est caractérisé par :

  • son architecture qui lui fournira un jeu d’instructions ainsi qu’une taille de registre (8bit, 16bit, …)
  • ses registres internes
  • la cadence de son horloge, qui peut être configurée de quelque kHz à plusieurs dizaines de MHz.

Les instructions disponibles peuvent être en nombre très variable selon les architectures. Elles sont en générales très primaires ; il s’agit :

  • d’opérations arithmétiques et logiques qui peuvent être effectuées sur les registres internes du processeur ou sur les mémoires ou entre les deux
  • d’opérations sur des adresses pointant vers des secteurs de mémoire
  • des sauts d’exécution vers des endroits de la mémoire

L’horloge

Un microcontrôleur possède généralement un cristal interne (quartz), qui jouera le rôle d’horloge par effet piézoélectrique. Il est souvent possible d’exploiter à la place un cristal externe, notamment pour utiliser des fréquences plus élevées que le cristal interne.

L’horloge va cadencer le processeur ; un tic correspondra à une instruction élémentaire. Une fréquence basse ralentira forcement l’exécution d’un processus, et empêchera d’utiliser des protocoles nécessitant une fréquence plus élevée. Elle permettra néanmoins de consommer beaucoup moins d’énergie. Une fréquence élevée permettra d’être plus efficace mais consommera plus d’énergie, ce qui peut également dégager de la chaleur.

Certains microcontrôleurs permettent de modifier leur fréquence pendant l’exécution ; c’est une fonctionnalité très intéressante qui permet d’économiser énormément d’énergie en mettant le montage en veille, en attendant par exemple une interruption (appui sur un bouton, détection de lumière, …). La fréquence passera alors à quelques kilohertz, remontant à plusieurs MHz lors d’une utilisation active.

La fréquence peut également être amplifiée par un mécanisme appelé « boucle à verrouillage de phase » ( PLL ; Phase-locked loop en anglais). On peut attendre ainsi des fréquences très élevées (2 à 10 fois la fréquence maximale), au prix de la stabilité et de la fiabilité du microcontrôleur.

Les registres

Il faut bien différencier ici deux concepts :

– les registres internes du processeur

– les registres externes en mémoire

On parlera dans les deux cas de registres, mais on se réfèrera la plupart du temps a des registres externes.

les registres internes

Un registre (interne) est un emplacement de mémoire particulier au sein du processeur. La quantité de registres est très limitée (quelques dizaines tout au plus). Leur taille est une constante du processeur ; un processeur 16-bit aura des registres de 16 bits.

Il y a plusieurs registres internes significatifs :

  • le compteur ordinal : il s’agit du registre qui pointe vers l’instruction en cours
  • le registre d’instruction : il contient l’instruction en cours
  • les registres « données » : leur utilité est principalement de charger des données qui vont être manipulées dans les prochains cycles, afin de minimiser le temps de traitement
  • les registres « adresses » qui font office de pointeurs vers des zones de la mémoire
  • (il existe beaucoup d’autres types que je ne détaillerai pas ici)

Dans le cadre du développement sur microcontrôleur, leur utilisation est totalement transparente, sauf à vouloir utiliser des commandes assembleurs brutes.

les registres externes

Ces registres, stockés en mémoire, sont liés à l’état d’un composant ou d’un périphérique de façon directe. Ils peuvent être en accès libre, en lecture seule ou en écriture seule.

Dans le cadre d’un microcontrôleur, les registres commandent directement les principales fonctionnalités ; par exemple :

  • changer l’état d’une broche reviendra à changer un bit dans un registre
  • récupérer la valeur d’un compteur reviendra à lire un registre
  • écrire dans la mémoire reviendra à écrire dans un registre l’adresse dans laquelle on souhaite écrire, afin que le registre suivant dans lequel on écrira la valeur pointe vers ce secteur de la mémoire
  • lire une valeur analogique reviendra à écrire dans un registre pour déclencher l’évaluation d’un échantillon, attendre qu’un bit dans un autre registre atteigne une valeur particulière, et enfin lire un troisième registre (voire un quatrième registre selon la résolution) pour récupérer la valeur de l’échantillon
  • communiquer sur un port série reviendra à configurer une liaison dans plusieurs registres, puis à veiller un registre d’état de l’entrée de la liaison, pour enfin lire un registre de données jusqu’à ce que le registre d’état indique que la communication est terminée.

Vous l’aurez compris, les registres sont indispensables pour piloter un microcontrôleur.

Si vous voulez vous en convaincre, je vous encourage à lire les sources fournies avec les principales bibliothèques de développement pour microcontrôleur. Vous remarquerez, par exemple, que la fonction C utilisée pour changer la valeur d’une sortie va pointer vers un alias qui se contentera de changer la valeur d’un registre en particulier, ledit alias n’étant rien d’autre qu’une adresse en mémoire qui changera selon le modèle de microcontrôleur choisi lors de la compilation.

les registres de configuration

On les trouve très souvent sous le nom de « fuses » (fusibles) dans les documentations, car, historiquement, il s’agissait de petits fusibles rassemblés au sein d’une grille. On appliquait une tension de 12V à ceux que l’on voulait faire « claquer ». Cela rendait leur écriture définitive. Ils ont depuis été remplacés par de simples cases en mémoire.

Les registres de configuration sont utilisés pour configurer le comportement du microcontrôleur dès la mise sous tension ; on y trouvera des paramètres comme :

  • la configuration de l’horloge (interne ou externe)
  • la protection en écriture et/ou lecture
  • le comportement du watchdog
  • l’activation du débogage
  • l’activation de la broche RESET

Ces registres doivent parfois être configuré à part. Il est important de prendre toutes les précautions en les manipulant ; car une erreur de configuration pourrait rendre le microcontrôleur inutilisable.

Les bus internes

Pour assurer la communication du processeur avec sa RAM, sa ROM et ses périphériques, trois bus sont reliés:

  • le bus d’adresses, où le processeur va indiquer l’adresse qu’il souhaite accéder (en écriture ou en lecture)
  • le bus de données transporte les données selon l’adresse demandée
  • le bus de contrôle, qui permet aux périphériques d’annoncer une interruption et au processeur d’indiquer la direction (écriture ou lecture) d’une opération

Ici aussi, tout est transparent, mais il est toujours intéressant de savoir qu’ils existent.

Les interruptions

Ce concept est important à saisir, car une fois correctement exploitées, les interruptions vont permettre d’effectuer des opérations en réaction à un évènement particulier :

  • un appui sur un bouton
  • l’expiration d’un délai
  • la réception de données sur un bus de communication
  • la fin d’activité d’un périphérique
  • le déclenchement explicite d’une interruption

Les opérations ainsi déclarées dans une interruption permettront d’économiser énormément de cycles au processeur ; car il n’aura pas besoin de gérer de façon logicielle l’éventualité de ces évènements. Ceci permettra également d’alléger considérablement le code source, et même souvent le programme envoyé au microcontrôleur.

Comme dit un peu plus haut, les interruptions transitent sur le bus de contrôle. Une fois arrivée au processeur, celui-ci interrompt son exécution en cours, et exécute une routine particulière déclarée explicitement (par le développeur) ou implicitement (par exemple un chien de garde ou watchdog chargé de redémarrer un microcontrôleur en cas d’état figé). Une fois sa routine terminée, il reprend l’exécution ou il s’était arrêté (ou non, selon ce que décide le développeur). Chaque processeur possède son catalogue d’interruptions disponibles, il est donc nécessaire de se référer à la documentation pour comprendre chaque cas d’utilisation.

Microcontrôleur – Chapitre 3 – Les périphériques

Les entrées/sorties

La plupart des broches d’un microcontrôleur (en général toutes, sauf GND, VCC et RESET) ont comme comportement par défaut la possibilité d’être utilisée comme entrée ou sortie numérique.

On parlera des I/O (ou GPIO pour General Purpose Input/Output) ou E/S en français. Ces broches sont rassemblées communément par port. Il y a souvent plusieurs ports par microcontrôleur, et leurs broches ne sont pas nécessairement côte-à-côte.

Ces I/O sont accessibles au travers de plusieurs registres ; rassemblés par port. On trouve principalement les registres suivants :

  • le registre de direction, où on indique dans quelle direction est utilisé la broche (entrée ou sortie)
  • le registre de sortie, où on peut écrire l’état souhaité d’une broche
  • le registre d’entrée, qui permettra de lire les états des broches d’un port

Il est possible de définir une interruption lors du changement d’état sur un port, ce qui permet au développeur de ne pas avoir à surveiller l’état des broches en permanence.

Il convient de réfléchir néanmoins au projet que l’on souhaite créer en utilisant les I/O, car presque toutes les broches ont des fonctions cumulées, c’est à dire qu’une broche en particulier peut servir d’I/O mais aussi faire partie d’un bus de communication, une autre peut être une entrée analogique, etc.

La réduction de la taille des microcontrôleurs poussent les constructeurs à faire des sacrifices ; et il existe des alternatives, que l’on verra surement plus tard, qui permettent d’étendre les ports.

Les compteurs

Pièce maitresse de nombreux mécanismes au sein d’un microcontrôleur, le compteur (parfois appelé timer) est un outil puissant qui se contente d’incrémenter un registre (ou plusieurs) et de déclencher une interruption à partir d’un certain seuil. Selon les microcontrôleurs, vous trouverez des compteurs de 8bit, 16bit ou autres, avec généralement les paramètres suivant :

  • le seuil ; c’est à dire le moment ou le microcontrôleur va déclencher l’interruption
  • la valeur de départ
  • le sens (descendant ou montant)
  • le diviseur ; qui permettra de définir des compteurs plus long en terme de cycle (par un exemple un incrément n’aura lieu que tous les 64 ou 1024 cycles). Ceci permet de ralentir un compteur pour permettre de passer du MHz au kHz voire en dessous pour de multiples applications (créer des sons, des effets visibles à l’œil donc inférieurs à 25Hz, …).
  • le mode (en montée, en montée puis descente, etc.)

Ainsi, avec un processeur cadencé à 1Mhz, si je configure un compteur 16bit pour déclencher une interruption dès qu’il atteint 976, lorsque son diviseur est à 1024, j’obtiendrai une interruption au bout d’une seconde.

Ces paramètres dépendent fortement du constructeur et du modèle de microcontrôleur utilisé, et comme beaucoup d’autres concepts, il est obligatoire de disposer de la documentation.

Les convertisseurs analogique vers numérique

Souvent abrégé CAN en France (à ne pas confondre avec le bus CAN), on parle d’Analog to Digital Converter en anglais (ADC). Il s’agit d’un montage dont le but est d’approximer une grandeur sur une échelle de taille déterminée.

Par exemple, un convertisseur de résolution 10bit pourra donner une valeur entre 0 et 1023. Si je cherche à mesurer une tension entre 0V et 5V, j’aurai une précision au mieux de 4,88mV. Aussi, si la valeur réelle est de 3,82V, j’obtiendrai un résultat de 782 ce qui équivaut en réalité à 3,818V.

La conversion est un processus qui demande beaucoup de cycles pour être précise. Il existe plusieurs méthodes de conversion (je ne vais pas les détailler) et chaque microcontrôleur va pouvoir réaliser un certain nombre de conversions en un temps donné, avec une résolution donnée. On parlera ici d’échantillon (sample en anglais). Par exemple, un convertisseur peut fournir 15ksps avec une résolution de 12bit, soit 15000 échantillons par seconde, chacun compris entre 0 et 4095. Mais dans le cas d’une conversion avec une résolution de 16bit, la vitesse peut être de 1ksps.

Dans la pratique, il s’agira de configurer la conversion, de la lancer, puis d’attendre une interruption (ou une valeur particulière dans un registre) pour ensuite lire la valeur obtenue.

Les convertisseurs numérique vers analogique

On parlera plus communément de PWM (Pulse Width Modulation, soit Modulation de largeur d’impulsion). Ce mécanisme va permettre d’obtenir une pseudo-valeur de tension analogique depuis une valeur numérique.

Pourquoi pseudo ? Parce qu’en réalité le microcontrôleur ne peut fournir que la masse GND (0V communément), ou la tension d’alimentation VCC (par exemple 5V). Donc quand on utilisera un PWM, pour obtenir 1V, on devra faire en sorte qu’une impulsion sur cinq soit à VCC tandis que les autres seront à GND.

Pour faciliter la configuration, les sorties PWM sont liées à des compteurs (parfois plusieurs sorties sur un même compteur), les paramètres sont donc similaires, mais on peut en ajouter quelques uns :

  • seuil de bascule ; le moment ou la sortie PWM passera de GND à VCC ou vice versa
  • le mode (à compteur triangulaire ou en dent de scie, …)

Il est important de garder en tête que le signal PWM tel qu’obtenu reste un signal numérique, et qu’il peut atteindre une tension égale à celle qui alimente le microcontrôleur. Afin d’éviter d’endommager des composants sensibles (par exemple un composant qui ne supporterait une tension que d’1.5V alors que le microcontrôleur est alimenté en 5V), il peut être nécessaire de filtrer la sortie (avec un montage R/C) pour passer d’une tension en créneaux à une courbe plus juste.

On peut également isoler galvaniquement les circuits (c’est à dire qu’il n’y a aucun contact électrique entre alimentation et pilotage) ; il faudra cependant ajouter une alimentation indépendante du microcontrôleur, mais ceci permettra d’obtenir des tensions bien différentes (piloter du 12V depuis un circuit 5V).

Les comparateurs

Il n’y a pas de démystification à faire ici, puisqu’un comparateur se contente de comparer deux entrées analogiques, sans nécessairement les mesurer.

Il suffit de lier un circuit analogique avec une masse commune à chaque du comparateur (variateur, photorésistance, capteur analogique, …), il sera alors possible de lire directement dans un registre quel circuit délivre la plus grande tension.

Il est également possible de déclencher une interruption sur un changement d’état.

L’interruption RESET

La plupart des microcontrôleurs (et beaucoup de circuits intégrés) dispose d’une broche RESET. Celle-ci, comme son nom l’indique, permet de réinitialiser l’appareil.

Si on applique la masse à cette broche, alors on déclenche la réinitialisation ou un état particulier (écoute de la programmation en SPI par exemple).

Le chien de garde

Ce mécanisme, appelé Watchdog en anglais, permet de s’assurer qu’un microcontrôleur n’est pas figé. Le concept est simple ; lorsque le chien de garde « surveille » l’exécution, un registre doit être mis à jour avant un certain délai continuellement. Si une période trop longue s’écoule sans mise à jour, le watchdog va lever une interruption.

La plupart du temps, il va s’agir de redémarrer le microcontrôleur comme un RESET. Il est possible de changer ce comportement (par exemple forcer l’arrêt d’un moteur en cas de défaut du programme avant le redémarrage, ou allumer une diode d’erreur), et de faire varier le délai d’alerte (par exemple 60ms, 250ms ou 8s).

Les autres périphériques

Si on monte en gamme, on peut trouver au sein du microcontrôleur des fonctionnalités plus pointues comme :

  • un superviseur d’alimentation
  • un thermomètre
  • une horloge temps-réel (RTC)
  • un générateur de fréquences
  • une unité de chiffrement
  • une unité de signature

Microcontrôleur – Chapitre 4 – Les mémoires

Afin de stocker un programme, des données temporaires ou des données persistantes, le microcontrôleur dispose de plusieurs types de mémoires, ayant chacune des caractéristiques particulières.

La mémoire vive (ou RAM)

Il s’agit d’un espace de stockage où va se dérouler l’exécution d’un programme. Elle doit être rapide en lecture et écriture. Elle est généralement volatile, c’est à dire qu’elle est remise à zéro lorsqu’elle n’est plus sous tension.

Ses caractéristiques la rendent chère, c’est pourquoi elle est en disponible de façon très limitée au sein d’un microcontrôleur (de quelques dizaines d’octets à plusieurs kilo-octets pour l’entrée de gamme). Cette limitation encourage particulièrement l’optimisation du code afin de l’utiliser et la nettoyer efficacement.

En utilisant un compilateur, le developpeur n’a pas à s’occuper de la RAM, il doit seulement veiller à ne pas la gaspiller. En revanche, si on souhaite écrire un programme en assembleur, il devient necessaire de se familiariser avec les instructions d’ecriture et lecture en RAM, ainsi qu’avec l’adressage de ses secteurs.

La mémoire morte (ou ROM)

Cette mémoire est beaucoup plus lente mais permet de rester persistante même hors-tension. Un microcontrôleur va utiliser deux types de mémoire morte :

  • la mémoire « programme », qui va contenir le code assembleur à executer sur le processeur lors de la mise sous tension
  • la mémoire « données », où le programme pourra stocker des données de façon persistante. Elle est souvent appelée EEPROM pour Electrically-Erasable Programmable Read-Only Memory (mémoire effaçable électriquement, programmable en lecture seule).

Les mémoires peuvent être stockées sur un même composant ; on distingue ensuite deux architectures :

  • Harvard, qui va séparer l’accès (par les instructions) à la mémoire programme de la mémoire données, au point que les bus utilisés soient séparés. On peut ainsi transférer simultanément des instructions depuis la mémoire programme et des données vers la mémoire données
  • Von Neumann, où une unité de contrôle gère les entrées et sorties vers une mémoire unifiée. Les instructions y sont donc des données manipulables comme celles-ci.
    (il y a bien entendu d’autres subtilités, mais on restera sur celles-ci)

    Bien que ROM signifie à l’origine « Read-Only Memory » (soit mémoire en lecture seule), il est possible d’y écrire et y réécrire, même depuis le programme lui-même. Sa taille varie beaucoup en fonction de la gamme, et peut aller de quelques centaines d’octets à plusieurs millions.

    Il est possible d’utiliser également des mémoires externes, au travers des bus de communication. Celle-ci sont  très lentes comparées à la ROM interne, mais permettent d’étendre la mémoire disponible pour des programmes très gourmands. Il faudra par contre gérer au niveau du logiciel l’écriture et la lecture depuis ces composants.

Microcontrôleur – Chapitre 1 – Introduction aux microcontrôleurs

Un microcontrôleur est un circuit intégré qui réunit :

  • un processeur,
  • des mémoires,
  • des interfaces,
  • et des périphériques.

Depuis l’avènement de l’informatique embarquée, on le retrouve partout (industrie, téléphonie, automatisation, automobile, …). Ses applications sont infinies.

Nous allons approcher quelques concepts qui permettront de nous lancer dans le développement d’applications utilisant un maximum de fonctionnalités.

Caractéristiques

Il existe une immense variété de microcontrôleurs ; chaque modèle est décrit par :

  • l’architecture de son processeur (PIC, AVR, ARM, MSP430, …) voire sa sous-architecture
  • sa taille de registre (8bit, 16bit, 32bit, 64bit, …)
  • son nombre de broches (8, 12, 32, 48, 64, 100, …)
  • son format (DIP, SMD, VQFN, …)
  • la plage de fréquence de son processeur (par exemple, de 32768Hz à 16MHz)
  • sa plage de tension de fonctionnement (par exemple, 1.8V à 6V)
  • la taille (128o, 2ko, 256ko) et le type de ses mémoires (RAM, SRAM, FRAM, ROM, EEPROM, Flash, …)
  • ses périphériques internes :
    • des canaux convertisseurs (analogique vers numérique), décrits par leur précision (10bit, 12bit, 16bit, …) et leur vitesse
    • des compteurs (aussi appelé timers) de 8bit, 16bit, …
    • des sorties PWM
    • des comparateurs
    • divers outils (débogueur, chien de garde, RESET, …)
  • ses bus de communication (SPI, I2C, CAN, UART, USB, …)

D’autres caractéristiques sont implicitement liées aux composants intégrés :

  • sa plage de température de fonctionnement (par exemple -40°C à 85°C)
  • sa consommation (par exemple 2microA au repos, 30mA en activité maximale)
  • son prix (de quelques centimes d’euros à plusieurs centaines)
  • la fiabilité de ses mémoires (par exemple 10000 cycles d’écriture pour de la mémoire Flash)

Utilisation

De par sa faible consommation et son volume réduit, le microcontrôleur est un élément clef dans l’industrie de l’informatique embarquée. Le support de différents bus de communication lui permet d’être connecté à presque tout ce qui peut contenir un courant électrique :

  • périphériques de sortie (écran, diode, moteur, haut-parleur, …)
  • interfaces d’entrée (clavier, souris, micro, écran tactile, boutons, …)
  • appareils de mesure (thermomètre, tachymètre, voltmètre, horloge, …)
  • interfaces de communication (GSM/GPRS/HSDPA, GPS, liaison radio, Bluetooth, WiFi, Ethernet, …)
  • extensions (mémoires, entrées/sorties, bus de communication, …)
  • d’autres microcontrôleurs

Il n’est donc pas étonnant de le retrouver partout, par exemple :

  • dans l’industrie pour piloter des machines
  • dans l’automatisation, dans des télécommandes
  • dans l’automobile pour diagnostiquer un véhicule en temps réel
  • dans le monde du spectacle pour piloter l’éclairage
  • dans l’aéronautique pour exploiter des données de vol

Rien que chez vous, vous disposez et utilisez des dizaines de microcontrôleurs sans le savoir :

  • dans une télécommande
  • dans un réveil
  • dans un lave-vaisselle
  • dans un interphone
  • dans un four
  • dans une cafetière
  • dans une voiture
  • dans un baladeur

Bien que l’interface avec un microcontrôleur parait technique, il est en réalité assez facile d’appréhender la programmation sur ces machines.

Le faible coût des modèles d’entrée de gamme ainsi que la possibilité de disposer de kit de développement à prix cassé chez certains constructeurs (TI et son Launchpad MSP430 à moins de 20€, Atmel avec ses ATTiny et ATMega présents dans les Arduino, leurs dérivés et leurs clones de 1€ à 100€, Microchip et ses PIC minimalistes et éprouvés) donnent une magnifique occasion pour se lancer dans ce monde !

Microcontrôleur – Chapitre 5 – Les bus de communication

Beaucoup d’applications nécessitent de pouvoir communiquer avec d’autres périphériques ou systèmes. Selon la gamme du microcontrôleur, on peut trouver un ou plusieurs bus de communication. Nous allons parler des principaux bus et de leurs protocoles respectifs.

Qu’est ce qu’un bus ?

Un bus est une topologie de réseau où tous les nœuds sont reliés à un seul lien, appelée le bus. Ce bus peut contenir plusieurs lignes, toutes communes à chaque nœud du réseau.

Ainsi, toute donnée émise sur un bus est reçue par tous les nœuds en même temps (tant que le bus est constitué d’un lien physiquement court).

Série ou parallèle ?

Une liaison série est une liaison où les données se suivent. On l’oppose à la liaison parallèle, ou chaque bit est envoyé sur une broche, ce qui permet un débit plus important mais augmente le risque de parasites à cause d’un nombre de lignes plus élevé.

Une analogie ? Une liaison série serait une conversation avec une personne, qui épèle chaque mot lettre par lettre, tandis qu’une liaison parallèle serait une conversation avec huit personnes épelant chacune une lettre en même temps (les lettres arrivent donc 8 par 8). La première conversation serait assez limpide, par contre la seconde pourrait poser problème si :

  • une personne parle plus fort que les autres (i.e. parasite leur signal)
  • une personne est en retard sur le reste du groupe (i.e. souffre d’une latence due à la ligne).

Les principaux bus

Il existe énormément de bus, et certains ont émergés suite à de véritables guerres de standards entre les constructeurs. La plupart des composants

I²C

I²C (ou I2C) est un bus série de bas niveau développé par Philips Semiconductor en 1982. I²C signifie Inter-Integrated Circuit. Puisqu’il s’agit d’une marque déposée, beaucoup de constructeurs parlent de TWI (Two-wire interface) lorsqu’ils se réfèrent à ce bus. Il est de courte portée (quelque mètres) et fonctionne généralement à 100kb/s (des versions plus récentes fonctionnent toutefois à plus de 3Mb/s).

On utilise ici deux lignes (en plus d’une masse commune) pour communiquer sur ce bus :

  1. une ligne d’horloge, appelée SCL (Serial Clock Line, parfois abrégée SCK ou CLK)
  2. une ligne de données, appelée SDL (Serial Data Line, qu’on écrit aussi SDA ou DATA)

Le protocole utilisé par I2C est dit :

  • maitre-esclaves, car seul un nœud maitre peut communiquer avec les esclaves du réseau (1 ou tous)
  • multi-maitres, car plusieurs maitres peuvent être présents sur le réseau
  • synchrone, car on utilise un mécanisme de requête/réponse
  • half-duplex, car on peut communiquer dans les deux sens, mais pas simultanément

On utilise un adressage sur 7 bits pour identifier les nœuds, ce qui permet (en théorie) jusqu’à 128 nœuds sur le réseau. Certaines adresses sont réservées pour le broadcast (communiquer vers tous les nœuds en même temps). En pratique, les constructeurs on tendance à fixer l’adresse de certains nœuds, ce qui peut causer des collisions.

Ce protocole de communication a de nombreuses applications ; écrans, mémoires, horloges temps-réel, …

SPI

Une liaison SPI (Serial Peripheral Interface) est un bus un peu particulier car si 3 lignes sont bien communes à chaque nœud du réseau (en plus de la masse), il faut ajouter une ligne entre chaque esclave et le maitre. Par exemple un réseau entre un maitre et trois esclaves aura besoin de 6 lignes (plus la masse).

Les lignes communes sont :

  1. une ligne d’horloge, appelée SCLK (Serial Clock, ou SCK, CLK)
  2. une ligne de données maitre vers esclave : MOSI (Master Output, Slave Input ; SIMO/MDO/SDI/DO/DOUT/SI/MTSR)
  3. une ligne de données esclave vers maitre : MISO (Master Input, Slave Output ; SOMI/SDO/MDI/DI/DIN/SO/MRST)

À chaque nœud esclave est ajoutée une ligne SS : Slave Select (choix de l’esclave, souvent abrégé CS ou SYNC). On ajoute généralement une barre au dessus du sigle pour préciser qu’il s’agit d’une entrée active à l’état bas ; en effet, l’esclave n’acceptera de répondre que si sa ligne SS est mise à la masse.

Cette particularité du bus SPI rend l’adressage inutile, il est cependant envisageable d’utiliser un registre à décalage pour piloter un grand nombre d’esclave avec un nombre limité de broches sur un microcontrôleur.

Le bus SPI est :

  • à maitre unique, il n’est pas possible d’avoir plusieurs maitres sur le réseau
  • synchrone
  • full-duplex, car maitre et esclave peuvent transmettre simultanément

Sa portée est de quelques mètres également, par contre son débit est bien plus élevé ; il est possible d’atteindre 100Mbit/s en SPI. Dans notre cas, des débits de 1 à 10Mbit/s seront suffisants.

RS-232

Le RS-232 est un bus de périphériques conçu en 1962. Contrairement aux liaisons SPI et I2C, il est possible de l’utiliser sur plusieurs dizaines de mètres, au détriment du débit (de 2400 à 115200b/s et même au delà dans certaines conditions).

Si vous avez disposé d’un ordinateur avant l’avènement de l’USB, vous avez forcément branché une souris ou un modem sur un port RS-232. On l’appelait à l’époque « port série » ou « port COM ». On l’appelle parfois UART voire USART, du nom d’un composant, souvent présent dans les microcontrôleurs, qui permet de transmettre et recevoir des données sur une liaison série.

Le bus fonctionne sur au moins deux lignes (plus la ligne de masse) :

  1. une ligne d’émission TxD ou TX
  2. une ligne de réception RxD ou RX

(D’autres lignes sont disponibles pour améliorer la fiabilité de la liaison, mais ne sont pas obligatoire)

Cette topologie ne permet de lier que deux périphériques entre eux en mode duplex, car les lignes d’émission et de réception sont croisées (chaque broche d’un périphérique est connectée à l’autre broche sur le périphérique distant).

De plus, l’absence d’horloge partagée peut provoquer des erreurs ; leur probabilité augmente avec le débit souhaité.

Une liaison RS-232 fonctionne :

  • de pair-à-pair ; il n’y a ni esclave ni maitre défini au niveau du protocole
  • de façon synchrone ou asynchrone ; c’est au logiciel de gérer comment se déroule la communication
  • en full-duplex ; les deux pairs peuvent communiquer en même temps.

Du fait de sa simplicité à mettre en œuvre tant au niveau matériel (trois fils suffisent), que logiciel, et de sa disponibilité quasi immédiate sur PC, c’est un bus de choix pour des petits projets.

De plus, de nombreux périphériques se pilotent également par liaison série : GPS, lien Bluetooth, modem, …

1-Wire

Mis au point par Dallas Semiconductor Corp, le bus 1-Wire, comme son nom l’indique, fonctionne avec une seule ligne (plus une masse).

Cette caractéristique lui procure une immense portée (jusqu’à plusieurs centaines de mètres), mais ne lui permet de fonctionner qu’avec un débit réduit (16,3kbit/s). Ce bus peut supporter plusieurs dizaines de noeuds.

1-Wire fonctionne :

  • d’un maitre vers plusieurs esclaves
  • de façon synchrone
  • en half-duplex

Les nœuds sont adressés sur 64 bits (ce qui donne plus de 18 milliards de milliards d’adresses possibles). Une commande d’énumération permet de faire l’appel pour ainsi détecter tous les nœuds d’un réseau très rapidement.

1-Wire est basé sur un protocole propriétaire ; les implémentations de nœuds maitres sont libres, par contre les nœuds esclaves sont prohibés ; ceci permet à la société de décider quels sont les périphériques utilisables sur son bus. Dans la théorie, rien n’empêche d’implémenter un nœud esclave avec un microcontrôleur.

Malgré cela, il s’agit d’un bus très simple à mettre en œuvre, car une seule broche suffit, et elle peut être gérée de façon logicielle sans grand impact sur la mémoire du programme.

Plusieurs types composants sont disponibles en tant qu’esclave 1-Wire :

  • des horloges temps-réel
  • des mémoires dont certaines peuvent être chiffrées
  • des thermomètres
  • des bascules
  • des convertisseurs

USB

Hérité du port série, l’Universal Serial Bus est apparu en 1996. Contrairement à la plupart des autres bus, où il est possible de choisir une tension au sein d’une plage, l’USB ne fonctionne qu’avec une tension de 5V.

Son rayon d’action est court (quelques mètres, rarement plus de 5) et ses évolutions lui on permis d’atteindre des débits de plusieurs gigabits par seconde.

Ces performances sont atteintes par l’USB 3, et sont totalement hors de portée des microcontrôleurs d’entrée de gamme. Néanmoins, il est possible de communiquer jusqu’à quelques mégabits par seconde avec un microcontrôleur approprié.

Un port USB standard est composé de quatre lignes :

  1. la masse GND
  2. la ligne D-
  3. la ligne D+
  4. et l’alimentation VCC, à 5V

On n’abordera pas ici le cas de l’USB 3, avec ses lignes supplémentaires.

L’USB permet des communications :

  • entre pairs
  • synchrones et asynchrones
  • en half-duplex

Sa mise en œuvre est plus complexe car il est nécessaire de déclarer plusieurs champs afin de pouvoir communiquer :

  • un identifiant fournisseur
  • un identifiant produit
  • un identifiant texte
  • un descripteur

L’implémentation d’une liaison USB nécessite un article plus approfondi.

Les autres

Bien sûr, il existe beaucoup d’autres type de liaisons, mais vous ne les retrouverez pas forcement au sein d’un microcontrôleur.

En voici quelques uns :

  • Ethernet : très connu en informatique, il est dédié au réseau, principalement pour les protocoles Internet (dont IP).
  • CAN : ce bus de terrain se retrouve notamment dans l’industrie et surtout dans l’automobile. Il équipe tous les véhicules automobiles depuis les années 1990, en tant que bus de pilotage et de diagnostic. L’accès au bus CAN permet de manipuler tous les composants d’un véhicule, les phares, l’injection, les serrures, les airbags,…
  • Bluetooth : liaison sans fil entre deux périphériques appairés, il peut être facile à mettre en œuvre au travers d’une liaison série. Présent dans tous les téléphones, ordinateurs portables et tablettes depuis le milieu des années 2000, il permet de connecter très facilement et sans-fil des projets avec un appareil faisant office d’interface.
  • ISM, Z-Wave, LIN, …

Limitations physiques

On a pu voir rapidement que les bus ont un champ d’action et un débit limité. Ces limitations sont généralement liées aux caractéristiques physiques des câbles ainsi qu’a leur blindage et leur agencement au sein de la ligne.

La limite électronique

La particularité d’un bus de communication est que l’ensemble d’une ligne (comprendre un câble) ne peut être qu’à un seul état électrique à un moment donné : VCC ou GND. Or, les électrons ne circulent pas instantanément dans les câbles ; par exemple on estime leur vitesse à environ 273 000 km/s dans le cuivre.

Ce qui veut dire que pour un câble de 273 000 km, un signal aura besoin d’une seconde pour être propagé de bout en bout. Si les données sont envoyées « par paquet », la latence aura peu d’impact. Mais dans le cadre de protocoles synchrones (SPI, I2C, …), la longueur du câble peut avoir une incidence sur le fonctionnement.

Bien entendu, on utilisera plus souvent des lignes beaucoup plus courtes, mais les limitations existent également en fonction des types de bus. Ainsi, un bus I2C ou SPI ne fonctionnera pas correctement au-delà de quelque mètres.

L’atténuation du signal

Lors de la circulation des électrons au sein du câble, de l’énergie est perdue sous forme de chaleur à cause de la résistance du câble ; on appelle cela l’effet Joule. S’il est négligeable en dessous d’un mètre il est important de le prendre en compte pour de plus grande distance.

L’induction et la permittivité jouent également un rôle dans l’atténuation.

On exprimera cette atténuation en décibel, et on peut la mesurer entre les tensions en entrée et en sortie du bus.

Les interférences internes

L’induction est un phénomène électromagnétique qui peut provoquer l’apparition d’un courant dans un conducteur à proximité d’un autre conducteur alimenté. Il est ainsi possible que des lignes interférent entre elles. Dans le cas de l’altération d’un signal, on parle de diaphonie. Pour éviter cela, on utilise des blindages et des paires torsadées.

Les interférences externes

Les faibles tensions utilisées en électronique sont d’autant plus sensibles lorsqu’elles sont utilisées dans des milieux assez hostiles, ou en mouvement (électrostatique).

Les hautes tensions ou les champs magnétiques à proximité peuvent fortement altérer le fonctionnement de tout dispositif électrique, dont les bus de communication.

Solutions techniques

Le blindage

Indispensable sur de longues distances, le blindage est présent principalement dans les câbles USB et dans certaines catégories de câbles Ethernet. Il s’agit le plus souvent d’un matériau métallique tressé.

Les paires torsadées

Comme son nom l’indique, une paire torsadée est constituée de deux lignes enroulées l’une autour de l’autre. Cette configuration permet de réduire de manière sensible les interférences entre les lignes.

la transmission différentielle

Au lieu de comparer la différence de potentielle entre une masse et une tension, on va comparer la différence de potentielle entre une tension et sa valeur opposée. Ce concept est très souvent utilisé notamment avec les paires torsadées : on considère en effet que les lignes sont si proches, qu’une interférence extérieure affecterait les deux lignes exactement de la même façon.

Ainsi, si au lieu de recevoir -5V et 5V, je reçois 2V et 12V, en faisant la différence des deux tensions, on obtient 10V à chaque fois.