• 40 heures
  • Moyenne

Ce cours est visible gratuitement en ligne.

course.header.alt.is_video

course.header.alt.is_certifying

J'ai tout compris !

Mis à jour le 12/12/2019

Connectez un capteur numérique pour l’exploiter

Connectez-vous ou inscrivez-vous gratuitement pour bénéficier de toutes les fonctionnalités de ce cours !

Implémentez et interfacez un capteur en liaison I2C

Plongeons au cœur des années 80 et découvrons l’un des nombreux problèmes auxquels les concepteurs électroniciens d’alors étaient confrontés.

A cette époque, l'existence d'un marché de masse grand public pour les téléviseurs couleur cathodiques (CRT : Cathode Ray tube), les magnétoscopes et les chaînes Hifi stéréo a entraîné 
l'utilisation intensive des processeurs et des périphériques numériques (CAN, CNA, Horloge, Tuner, Péritel, Amplificateur...). D’un point de vue architecture électronique, l’absence de standard industriel pour dialoguer avec les périphériques engendrait des coûts de développement relativement excessifs.

Définir et utiliser un standard offre des avantages pour l’utilisateur, mais masque un processus de normalisation et une gestion de la propriété intellectuelle, avec des brevets et des conditions d’utilisation imposant des « royalties » à verser (Bluetooth®, Wifi®, Blu-Ray Disc ®...).

Focalisons-nous sur les deux types d’interfaçage matériel qui équipent la plupart des microcontrôleurs :

  • le bus I2C (pour Inter Integrated Circuit), développé par la société RTC Phillips dès 1982 et publié en 1992, qui définit un standard d’interfaçage matériel entre composants numériques au travers de deux  fils (Alimentations Vdd et GND non comptabilisées) ;

  • le bus SPI (pour Serial Peripheral Interface), développé par la société Motorola au milieu des années 1980, qui nécessite 4 fils de connexion (alimentation non comptabilisée).

Architecture matérielle du bus I2C

Le bus I2C s’appuie sur le principe d’une liaison série synchrone bidirectionnelle half-duplex entre un device maître (Master) et un ou plusieurs devices esclaves (Slave). Habituellement, le rôle du maître est confié à un microcontrôleur et les périphériques (Sensors, CAN, DAC, digital potentiometers, LCD display, Expender Port, Motor drivers, Battery charger, Memory EEPROM…) sont qualifiés d’esclaves.

En pratique, la connexion entre le maître et les esclaves nécessite :

  • deux lignes :

    • une ligne de signal pour les données échangées, SDA (pour Serial Data),

    • une ligne d’horloge pour la synchronisation des échanges, SCL (pour Serial CLock),

    • une résistance de tirage (Pull-up resistor) pour chaque ligne active (SDA, SCL), parce que la technologie d’interfaçage est de type collecteur/drain ouvert (Open Collector/Drain).

  • un référencement au même potentiel :

    • une alimentation unipolaire compatible CMOS et/ou TTL (3.3V, 5V),

    • une ligne de potentiel de référence pour le GND.

La figure ci-après présente un exemple d’interfaçage entre un circuit maître et ses périphériques esclaves.

Exemple
Exemple d'interface entre un circuit maître et ses périphériques esclaves

En termes de débits, le bus I2C permet d’échanger des données avec 5 vitesses de transmission distinctes, qui dépendent de son mode de fonctionnement :

  • mode standard (Sm), avec un débit jusqu'à 100 kbit/s,

  • mode rapide (Fm), avec un débit jusqu'à 400 kbit/s,

  • mode rapide Plus (Fm +), avec un débit jusqu'à 1 Mbit/s,

  • mode haute vitesse (mode Hs), avec un débit jusqu'à 3.4 Mbit/s,

  • mode ultra rapide (UFm), avec un débit jusqu'à 5 Mbit/s.

Structure interne de l’interface matérielle

Limitons-nous à une simple connexion entre un maître et un esclave pour analyser la structure interne d’une liaison I2C. Sur la figure ci-dessous, nous retrouvons les lignes SDA et SCL interconnectées avec leurs résistances de pull-up respectives. Chaque ligne est pilotée par un transistor Mosfet canal N (ou un transistor bipolaire NPN).

Cette particularité impose donc un niveau logique haut au repos des lignes (pas d’échange de données, pas d’horloge générée). Lorsqu’un des transistors est piloté, c’est la totalité de la ligne (SDA ou SCL) qui est forcée au niveau logique bas. Les informations transmises ou réceptionnées sont contenues dans le registre de données. La synchronisation des échanges est assurée par le générateur d’horloge interne. C’est l’unité de contrôle qui conditionne les états protocolaires (lecture ou écriture) des devices.

Synoptique de l’interface matérielle interne.
Synoptique de l’interface matérielle interne

Concernant le registre de données, la figure suivante présente les champs contenus dans l’octet généré en début des échanges. Le bit de poids faible (LSB) spécifie le mode de transfert (lecture ou écriture). Les 7 bits de poids fort (MSB), de A6 à A0, contiennent l’adresse de l’esclave.

Structure de l’octet d’en-tête généré.
Structure de l’octet d’en-tête généré

Le circuit intégré possédant une adresse unique codée sur 7 bits (ou 10 bits), on peut connecter un nombre théorique de 128 devices (ou 1024 devices avec un adressage étendu). En se référant au tableau ci-après, on constate qu’en pratique le nombre de devices est très inférieur à la théorie, puisque le bus I2C est limité par sa charge capacitive totale limitée à 400pF par ligne, avec une capacité d’entrée d’une ligne de 10pF, soit un nombre théorique maximum de 40 devices !

Propriétés temporelles des lignes SDA et SLC du bus I2C.
Propriétés temporelles des lignes SDA et SLC du bus I2C

Analysons les amplitudes de tensions associées aux niveaux logiques des circuits intégrés identifiés I2C. Dans le cas de la technologie CMOS, le tableau ci-dessous montre que VIL(max)  et VIH(min) représentent respectivement 30% et 70% de la tension d’alimentation Vdd . Lorsque le niveau logique est bas, on rappelle que le courant est absorbé par le circuit intégré et qu’il est limité par la valeur de résistance de pull-up. Pour assurer un fonctionnement nominal, le constructeur préconise un courant IOL , lequel conditionne un état logique bas maximum VOL(max) fonction du mode de fonctionnement.

tyty
Niveaux de tension et de courant associés aux états logiques d’un bus I2C

Dimensionnement des résistances de Pull-up

Pour dimensionner les résistances de Pull-up, le concepteur à deux possibilités : l’utilisation d’abaques et le calcul théorique. Les abaques suivants donnent les plages permises pour dimensionner les résistances maximales et minimales en fonction du débit (mode standard ou rapide), de la charge capacitive de charge du bus (Cbus) et de son alimentation Vdd .

tyty
Valeurs possibles pour choisir des résistances de Pull-up

Pour un premier dimensionnement, les abaques sont suffisants. Toutefois, si le concepteur souhaite affiner la valeur des résistances, une démarche analytique est nécessaire.

  •   Calcul de la résistance de Pull-up maximal : Rp(max)

Il faut remarquer que la résistance de Pull-up ( Rp ) , avec la capacité de charge du bus ( Cb ) , constitue une constante de temps qui limite la dynamique des signaux associés aux temps de montée (Rise time, tr ) et de descente (Fall time, tf ) des lignes SDA et SCL. En rappelant l’évolution de la tension aux bornes d’un condensateur, avec une charge initiale nulle, on modélise la charge du condensateur Cb en réponse à un échelon de tension Vdd assimilé aux créneaux de lignes SDA ou SCL :

                 VCb(t)=Vdd(1etRpCb)  

De l’équation précédente, on détermine les instants t=t30 à 30% de Vdd et t=t70 à 70% de Vdd , soit :

                t30=RpCbln(10.7)   et  t70=RpCbln(10.3) 

Comme le Rise time tr est calculé dans l’intervalle 30% et 70% de l’alimentation Vdd , il vient :

                 tr=t70t30=RpCbln(0.70.3)=RpCbln2.3333  

D’où l’équation de la résistance de Pull-up maximale notée Rp(max)  en fonction du Rise time tr et de la capacité de charge maximale  du bus I2C, que l’on écrira sous la forme :

                Rp(max)=trCbln2.3333tr0.84729×Cb  

Les calculs de Rp(max) sont donnés dans le tableau ci-après :

tyty
 
  • Calcul de la résistance de Pull-up minimale : Rp(min)

Dans ce cas d’étude, ce sont les courants de sortie IOL (3mA ou 6mA) et la tension d’alimentation qui permettent de déterminer la valeur de Rp(mmin) selon l’équation :

                 RP(min)=VddVOL(Max)IOL(Min) 

Les calculs de Rp(mmin) sont donnés dans le tableau ci-après en considérant Vdd=+5V :

tyty
 

Analyse des trames échangées avec un capteur I2C

La figure suivante présente l’interfaçage d’un capteur de température de référence MCP9804, fabriqué par le constructeur Microchip. L’adresse paramétrable est de la forme : 0011,A2,A1,A0.

Interfaçage du capteur MCP9804 sur le bus I2C.
Interfaçage du capteur MCP9804 sur le bus I2C

Dans la documentation technique présentée ci-après, il est mentionné que le registre TA contient la mesure de température. Il a pour adresse : ( TA )   0x05. On découvre que la température est délivrée sur un format de 12 bits. Pour cela, la lecture des données (Data image de la température surlignée en couleur rose clair) est accessible en lisant 2 octets (MSB Data et LSB Data). On notera que le bit 4 de MSB est un bit de signe qui discerne les températures supérieures ou inférieures à 0°C (SIGN=0 si TA >0°C ou SIGN=1 si TA <0°C).

Mesure de la température contenue dans le registre TA situé à l’adresse 0x05
Mesure de la température contenue dans le registre TA situé à l’adresse 0x05

Appuyons-nous sur le synoptique de l’interface matérielle et identifions les actions d’échanges entre le maître et l’esclave, pour bien cerner le fonctionnement du bus I2C. Deux cas sont possibles : le maître transmet des données en direction de l’esclave ou bien c’est l’inverse. Ces deux possibilités d’échanges sont présentées sur les figures suivantes.

  •  Le maître est émetteur de données et l’esclave réceptionne les données :

tyty
Échange de données du maître vers l'esclave
  • L’esclave est émetteur de données et le maître réceptionne les données :

Echange de données du maître vers l'esclave.
Échange de données de l'esclave vers le maître

Pour illustrer les trames échangées sur le bus I2C, utilisons les chronogrammes fonctionnels d’écriture et lecture du protocole de communication extraits du datasheet du capteur.

Étape 1 : écriture d’une donnée, le maître demande à l’esclave d’accéder au registre TA
tyty
Écriture d'une donnée sur le bus I2C
Étape 2 : lecture d’une donnée, le maître demande à l’esclave de lui renvoyer le contenu du registre  TA
tyty
Lecture d'une donnée sur le bus I2C
Étape 3 : Interprétation des données contenues dans le registre TA (0x05)

Pour lire le contenu du registre de température, deux méthodes sont possibles :

  • Méthode 1 : conversion base 2 vers base 10 (binaire vers décimal)

La lecture du registre TA en binaire (MSB et LSB) donne 00000001 10010100 , soit 0x0194 en hexadécimal. En s’appuyant sur l’assignation des bits du registre, on déduit que la température est supérieure à 0°C, le bit de signe SIGN=0. Vérifions la valeur de température TA mesurée par un calcul de conversion binaire en décimal :

                     TA=24+23+20+22=25.25C 

La température TA mesurée égale donc 25.25°C.

  • Méthode 2 : calcul donnée dans le datasheet

Dans l’encadré ci-dessous, le constructeur présente une méthode calcul complémentaire. Vérifions le calcul précédent.

tyty
Équations de conversion

Comme la température Ta>0°C, appliquons la première équation :

UpperByte représente les bits MSB du registre TA , soit : MSB=00000001=0x01=1

LowerByte représente les bits LSB du registre TA , soit LSB=10010100=0x94=148

Le calcul donne :

                   TA=(1×24+148×24)=25.25C 

Mise en pratique du capteur MCP9804

L’adresse du capteur est fixée à la valeur binaire 0011000 (0x18 en hexadécimal). Pour cela, les broches A2, A1 et A0 sont électriquement connectées au GND pour fixer un 0 logique.

  •  Analyse des trames et détermination de la température mesurée

Pour examiner les trames échangées, utilisons un oscilloscope équipé d’un analyseur de bus I2C. Naturellement, une opération d’écriture a été exécutée au préalable pour accéder au registre de température TA (0x05). L’oscillogramme ci-après présente le contenu d’une trame de lecture de température.

Oscillogramme présentant le contenu d’une trame de lecture de température
Oscillogramme présentant le contenu d’une trame de lecture de température

La valeur contenue dans le registre TA est 0xC1AF. Sachant que la température est codée sur 12 bits, il reste à réaliser une opération logique (opérateur ET logique bit à bit) de masquage, pour supprimer les 4 bits de poids fort non significatifs dans le présent exemple, soit :

               TA = 0xC1AF & 0x0FFF = 0x01AF

La conversion en décimal de la valeur 0x01AF obtenue après masquage s’écrit :

              TA=(1×24+175×24)=26.9375C 

La température mesurée par le capteur MCP9804 délivre une température de 26.9375 °C.

Implémentez et interfacez un capteur en liaison SPI

Baptisé SPI (Serial Peripheral Interface) au milieu des années 1980 par Motorola, ce bus de données série synchrone est full-duplex et se différencie par rapport au bus I2C, dont il reprend le concept « maître-esclave », par deux avantages principaux :

  • une vitesse plus élevée de fonctionnement, donc un transfert plus rapide des données (typiquement de l’ordre de 1 MHz à 20 MHz) ;

  • un caractère full-duplex, ce qui signifie qu’il peut recevoir des données pendant qu’il en émet.

En pratique, la connexion entre le maître et les esclaves nécessite :

  • quatre lignes de signal :

    • une ligne pour les données échangées du maître vers l’esclave (MOSI pour Master Out, Slave In),

    • une ligne pour les données échangées de l’esclave vers le maître (MISO pour Master In, Slave Out),

    • une ligne d’horloge générée par le maître pour la synchronisation des échanges (SCLK pour Serial CLocK),

    • une ligne de commande générée par le maître pour sélectionner un esclave (SS pour Salve Select) — contrairement au bus I2C, qui nécessite l’utilisation d’une adresse pour établir une liaison avec un esclave, ici c’est la ligne SS qui active directement l’esclave.

  • un référencement au même potentiel :

    • une alimentation unipolaire compatible CMOS et/ou TTL (3.3V, 5V),

    • une ligne de potentiel de référence pour le GND.

 Remarques :

  1. On peut aussi avoir des configurations de bus SPI à 3 fils, lorsqu’un des signaux de données n’est pas nécessaire. Par exemple, le signal MISO peut ne pas être indispensable pour un composant amplificateur à gain programmable.

  2.  Le bus SPI ne réalise pas la mise à niveau des tensions comme le bus I2C, ce qui oblige à bien vérifier que les tensions sont compatibles entre le maître et l’esclave. Uniquement dans le cas où la tension du composant « périphérique esclave » est inférieure, on garantira la compatibilité des signaux par un pont diviseur. 

En pratique, lorsque le maître envoie des données vers l’esclave, on prendra soin de connecter la broche SDO du maître vers la broche SDI d’un ou plusieurs esclaves et réciproquement lorsque l’esclave transmet des données (SDO) à un maître (SDI).

La figure ci-après présente un exemple d’interfaçage entre un circuit maître et ses périphériques esclaves.

Exemple d’application du bus SPI
Exemple d’application du bus SPI

Structure interne de l’interface matérielle

Limitons-nous à une simple connexion entre un maître et un esclave pour analyser la structure interne d’une liaison SPI. Sur la figure ci-dessous, nous retrouvons les lignes MISO, MOSI, SCLK et SS, qui sont directement interconnectées entre le maître et l’esclave.

Les informations transmises (TX) ou réceptionnées (RX) sont contenues dans des registres de données. La synchronisation des échanges est assurée par le générateur d’horloge interne, qui présente la particularité de pouvoir paramétrer 4 modes de fonctionnements, selon l’état de repos de l’horloge (CPOL : Clock Polarity), ainsi que les moments (CPHA : Clock Phase) où les données sont échangées (1er ou 2nd front de l’horloge). C’est l’unité de contrôle logique qui conditionne les états protocolaires (lecture/écriture) des devices.

Synoptique de l’interface matérielle interne du bus SPI
Synoptique de l’interface matérielle interne du bus SPI

Le tableau ci-après résume les 4 modes (numéroté de 0 à 3), selon que l’état de repos de l’horloge est haut ou bas (CPOL =  0 ou 1) et selon le type front, montant ou descendant (CPHA 0 ou 1).

Modes de transmission (1 à 3)
Modes de transmission (0 à 3)

Analyse des trames échangées avec un capteur SPI

Illustrons sur l’exemple suivant l’interfaçage d’un capteur de température (Microchip référence TC72).

Interfaçage du capteur TC72 sur le bus SPI
Interfaçage du capteur TC72 sur le bus SPI

Analysons le chronogramme où le capteur fonctionne dans le mode 1 (CPOL=0 et CPHA=1).

Fonctionnement du capteur TC72 en mode 1
Fonctionnement du capteur TC72 en mode 1

Mise en pratique du capteur TC72 : analyse des trames et détermination de la température mesurée

On examine les trames échangées avec un oscilloscope équipé d’un analyseur de bus SPI. Au préalable, des opérations de configuration ont été exécutées pour accéder au registre de température. Le contenu d’une trame de lecture de température est présenté ci-après.

Contenu des trames échangées sur le bus SPI
Contenu des trames échangées sur le bus SPI

On retrouve dans la trame la valeur du registre de température en binaire (MSB et LSB), qui donne 00011011 01000000 soit 0x1B40. Calculons la valeur de température mesurée par un calcul de conversion binaire en décimal :

                            TA=24+23+21+20+22=27.25C          

La température mesurée par le capteur TC72 égale donc 27.25°C.

Utiliser un capteur I2C ou SPI n’a plus aucun secret pour le concepteur que vous êtes. Pull-up, MISO, MOSI, SDI, SDO, SCLK, configuration de l’adresse d’un device, débit, translateur de niveau logique lecture d’un registre, font désormais partie de votre vocabulaire avec les concepts associés.

Dans le chapitre suivant, nous allons apprendre à interfacer des capteurs numériques avec un microcontrôleur.

Exemple de certificat de réussite
Exemple de certificat de réussite