Changes between Version 2 and Version 3 of MicroTmeI2c


Ignore:
Timestamp:
Mar 25, 2007, 4:28:18 PM (18 years ago)
Author:
Franck Wajsburt
Comment:

--

Legend:

Unmodified
Added
Removed
Modified
  • MicroTmeI2c

    v2 v3  
    99}}}
    1010||||[wiki:MicroTmeBase Les outils]||||[wiki:MicroTmeFonction Organisation Mémoire]||||[wiki:MicroTmeInter Bouton poussoir]||||[wiki:MicroTmeAnapwm Entrées analogiques et PWM]||||[wiki:MicroTmeTimers Usage des Timers]||||[wiki:MicroTmeRs232 Module RS232]||||__Module I2C__||||[wiki:MicroTmeTaches Applications Multitâches]||||[wiki:MicroTmeSloop Sloop]||||
    11 [[PageOutline]]
    12 
     11[[PageOutline(1-2)]]
     12
     13{{{
     14#!html
     15<h1><u>Gestion du port I2C (mode maître)</u></h1><br>
     16}}}
     17
     18= Objectif =
     19
     20Nous avons vu lors de la dernière séance les échanges rs232. Ce mode de communication est très utile pour l'échange de données
     21avec un terminal (un PC ou un palm). Il est aussi parfois utilisé pour accéder à des périphériques intelligents comme un
     22afficheur LCD ou même une caméra. Mais ce n'est pas idéal car le rs232 est un protocole point-à-point et il faut multiplier
     23les ports et les cables si on veux connecter plusieurs capteurs.
     24
     25Aujourd'hui nous allons expérimenter l'I2C, un bus d'entrée-sortie qui permet de faire des échanges de données entre plusieurs
     26interlocuteurs (on parle d'abonnés). Ce document contient une présentation succinte du protocole I2C limitée (ou peu s'en
     27faut) aux seules spécifications offertes par le PIC réduites encore à ce dont nous avons besoin pour ce TME. De plus, sur
     28l'I2C on distingue les abonnés maîtres et les abonnés esclaves, on ne programmera le PIC qu'en mode maître. Les étudiants
     29intéressés pourront se reporter à la spécification officielle du protocole I2C présente sur le site du module microcontrôleur.
     30
     31Au niveau des expériences, nous allons tenter de communiquer avec deux composants I2C : un télémètre à ultra-sons et un
     32convertisseur numérique-analogique à 8 sorties. Nous allons aussi en profiter pour voir une méthode de programmation très utile
     33en assembleur: les automates d'états finis.
     34
     35= Protocole I2C =
     36
     37Cette présentation de l'I2C reprend des dessins et du texte glanés sur le web (en particulier le site
     38[http://www.atmicroprog.com/cours/I2C/i2c.htm atmicroprog]), et dans le livre de Dominique Paret «Le bus I2C» chez Dunod,
     39merci à eux.
     40
     41== caractéristiques principales du bus I2C ==
     42
     43Ce protocole a été défini dans les années 80 par Philips. C'est un protocole simple à mettre en oeuvre, tant d'un point de vue
     44matériel que logiciel. Il est très diffusé et il existe un très grand nombre de composants proposant directement une interface I2C.   
     45
     46I2C ou plutôt IIC signifie Inter-Integrated-Circuit. Comme son nom l'indique, il est destiné à faire communiquer des circuits intégrés
     47sur des distances courtes (50 cm) jusqu'à 3.4 Mbits/s. Il est toutefois possible grâce à des répéteurs, qui regénèrent les
     48signaux et pas mal de précautions, d'atteindre des distances de 100 mètres avec un débit de 100 kbits/s.
     49
     50La version de base permet à 128\footnote{Ce nombre de 128 est théorique, car la charge maximale de chaque ligne
     51(SCL ou SDA) ne peut dépasser 400 pF (picoFarad), et les changements d'états des signaux SDA et SCL
     52ne peuvent dépasser 1  µs.} abonnés de communiquer sur 2 fils: un fil pour l'horloge (SCL), un fil pour les données
     53(SDA). En pratique, les cables sont composés de 4 fils: SCL, SDA, GND, VDD. Les deux supplémentaires sont respectivement la
     54masse (GND) et la tension d'alimentation (VDD). Cette dernière n'est pas indispensable mais elle permet généralement d'alimenter
     55le périphérique distant (un peu comme pour l'USB).
     56
     57=== Glossaire I2C ===
     58
     59 '''abonné'''::
     60   tout élément connecté sur le bus se nomme un abonné.
     61
     62 '''maître'''::
     63   tout abonné qui démarre et termine un échange. Le maître place l'horloge sur SCL.
     64
     65 '''esclave'''::
     66   tout abonné adressé par un maître. Un esclave à la possibilité d'arrêter temporairement l'horloge du maitre.
     67
     68 '''émetteur'''::
     69   tout abonné, qu'il soit maître ou esclave, qui envoie des données sur SDA.
     70
     71 '''récepteur'''::
     72   tout abonné, qu'il soit maître ou esclave, qui reçoit des données de SDA.
     73
     74 '''adresse'''::
     75   numéro attribué à un esclave.  Sur le bus tous les esclaves ont une adresse unique. Les adresses petites sont prioritaires vis-à-vis des adresses grandes.
     76
     77 '''échange'''::
     78   dialogue entre un maitre et un esclave.  Un échange commence par une adresse émise par le maitre, suivie d'une
     79   ou plusieurs données émises par le maitre ou l'esclave.  Un maitre peut chainer plusieurs échanges d'affilée.
     80   La fin normale d'un échange est décidée par le maître. L'esclave peut cependant demander l'abandon de
     81   l'échange par le maître si l'esclave est récepteur.
     82
     83 '''arbitrage'''::
     84   résolution d'un conflit d'accès simultané par 2 maitres.
     85 
     86=== Principaux avantages de l'I2C ===
     87
     88Le protocole du bus I2C est particulièrement rusé, au sens où il offre beaucoup d'avantages tout en restant simple à mettre en
     89oeuvre, c'est dans ses avantages que réside la raison de son succès.  Parmi les principaux avantages:
     90
     91 * Un abonné peut se connecter au bus sans perturber le fonctionnement du bus. Il faut quand même respecter un protocole et
     92   veiller à ne pas dépasser la charge maximale du bus (400 pF). Ce branchement à chaud permet par exemple de faire de la
     93   maintenance sans stopper le système.
     94 * C'est un bus multi-maitres, tout abonné peut devenir maître du bus\footnote{Le module I2C intégré au pic16f877 gère les
     95   deux modes mais pas en même temps.}.
     96 * L'arbitrage entre les maîtres est décentralisé. C'est un point important car c'est ce qui permet d'aller loin.  Il existe
     97   un ordre total des esclaves du point de vue de la priorité. Cette priorité est statique.  À un instant donné, la priorité
     98   entre deux maîtres dépend des esclaves accédés.
     99 * Le protocole gère les collisions d'accès. Les échanges prioritaires passent sans être perturbés ni même retardés par les
     100   échanges non prioritaires. Un échange est priortaire par rapport à un autre s'il est fait avec un esclave plus prioritaire.
     101 * Un maître peut garder la possession du bus entre deux échanges avec un ou plusieurs esclaves.
     102 * Le débit du bus va de 100 kbauds à 3.4 Mbauds dans la version étendue du protocole (HighSpeed). Le pic16f877 peut aller
     103   jusqu'à 400 kbauds. Il offre aussi une version non standard à 1Mbauds.
     104 * Un maître peut adapter son débit en fonction de l'esclave accédé.
     105 * On peut communiquer entre des circuits de différentes technologies (5V et 3.3V) moyennant des adaptateurs très simples.
     106 
     107== Cablage I2C et comportement électrique ==
     108
     109Le bus I2C est un vrai bus au sens où les fils électriques sont physiquement partagés par tous les abonnés présents.  Sur la
     110figure ci-après, on voit que les différents abonnés se branchent directement sur les 3 fils (4 si compte VDD). Il n'y a pas de
     111différences électriques entre un maître et un esclave. Les résistances de rappel (une par ligne) ne sont pas dupliquées.
     112La ligne VDD est en pointillés pour signifier qu'elle est optionnelle. Il existe d'autres connexions plus complexes
     113utilisées s'il y a beaucoup d'abonnés, si on veut aller loin ou si VDD n'est pas 5V. Cette connectique convient sur quelques
     114mètres et pour 10 à 20 abonnés.
     115
     116[[Image(i2c_elec1.png,nolink)]]
     117
     118Pour permettre le partage des lignes, le bus I2C réalise un ET-cablé entre tous les abonnés. En d'autres termes:
     119
     120 * Les lignes SCL et SDA sont à VDD si personne ne parle grâce aux résistances de rappel à VDD (pullup).
     121 * Pour mettre 1 sur SCL ou SDA, un abonné programme le port en entrée, la résitance Rp se charge de tirer la ligne à 1.
     122 * Pour mettre 0 sur SCL ou SDA, un abonné doit écrire un 0, c.-à-d. relier la ligne à la masse.
     123 * Il ne peut jamais y avoir de conflit électrique (court-circuit VDD-GND).
     124
     125[[Image(i2c_elec2.png,nolink)]]
     126
     127=== __Résumé des caractéristiques électriques standards__ ===
     128
     129 * '''Tension de fonctionnement''' :  5 Volts (fonctionne aussi en 3.3 V).
     130 * '''Fréquence de fonctionnement''' :  jusqu'à 100 kiloHertz en mode standard et 400kHz en mode Fast.
     131 * '''Etat logique haut''' :  de 3 à 5 Volts.
     132 * '''Etat logique bas''' :  de 0 à 1.5 Volts.
     133 * '''Capacité maximum du bus''' :  400 picoFarad au total. c'est-à-dire 10 pF par abonné auquels s'ajoute la capacité de la ligne elle-même.
     134 * '''Temps de montée maximal''' :  1 µs à à 100 kHz, 0.3 µs à 400 kHz.
     135 * '''Temps de descente maximal''' :  0.3 µs à 100 et 400 kHz.
     136 * '''Courrant maximal entrant par un abonné''' :  3 milliAmpères.
     137 * '''Résistance de rappel''' :  de 1.5 à 3.5 kiloOhms (dépend de la charge du bus).
     138 * '''Durée de l'état haut d'un pulse d'horloge''' :  4 µs minimum à 100 kHz, de 0.6 µs minimum à 400 kHz.
     139
     140= Le protocole d'échange =
     141
     142Le bus ne dispose que de deux lignes SCL et SDA. Les différents états que vont pouvoir prendre ces lignes vont permettre
     143d'exprimer les étapes d'un échange. On parle de conditions car il s'agit en fait de changements d'état. Pour prendre un exemple,
     144un maître veut faire un échange avec un esclave.
     145
     146 1. Le bus étant libre ('''free time'''), le maitre prend le bus en imposant une condition de démarrage ('''start condition''').
     147 1. Le maitre envoie l''''adresse de l'abonné''' esclave visé et le sens du transfert '''read/write'''.
     148    Pour cela, il génère le signal d'horloge SCL périodique et transmet l'adresse bit après bits ('''bit transfer''') sur SDA.
     149 1. L'esclave qui se reconnait renvoie un acquitement ('''acknowledge''' ou '''ACK''') sur SDA.
     150 1. Le transfert se poursuit par l'envoi de donnée, nous allons voir comment, et après chaque envoi par l'émetteur, le récepteur
     151    envoie un acquitement.
     152 1. L'échange se termine normalement à l'initiative du maître (sauf exception) et s'achève par une condition d'arrêt ('''stop condition''').
     153 1. Éventuellement, le maître peut remplacer la condition d'arrêt par une condition de redémarrage ('''restart condition''') dans le
     154    cas où il veut changer d'abonné ou de sens d'échange.
     155 1. Les bits sont transférés par paquet de 8, bit de poids fort en premier (à l'inverse du rs232), qu'il s'agissse des données ou
     156    des adresses. Le recepteur envoie un acquitement après chaque envoi de 8 bits par l'émetteur. l'acquitement est le 9ième bit.
     157
     158== les différentes conditions ==
     159
     160Les 4 figures ci-dessous illustrent les 4 conditions du bus. Il ne manque que l'acquitement, mais en fait l'acquitement est un bit
     161comme les autres si on se contente de regarder l'état des lignes. Ce qui change c'est celui qui parle sur SDA, en l'occurence c'est
     162celui qui a reçu le mot qui l'acquite en imposant SDA à 0. S'il laisse SDA à 1 c'est un non-acquitement ('''NACK''').
     163
     164[[Image(conditions.png,nolink)]]
     165
     166== L'adressage ==
     167
     168Pour pouvoir communiquer avec les différents composants raccordés au bus, nous allons détailler le protocole de communication
     169qui permet d'orchestrer les échanges.  Dans un premier temps, et après avoir émis une condition de départ, le maitre indique
     170avec quel esclave il souhaite se connecter, pour cela il envoie sur le bus l'adresse de l'esclave composé de 7 bits (donc
     171128 adresses différentes), puis un dernier bit indiquant le sens du transfert : Lecture (1) ou Écriture (0).  Tous les esclaves
     172scrutent le bus et voient la condition de départ, celui qui reconnait son adresse envoie un acquitement (SDA à 0).
     173
     174[[Image(i2c_adresse.png,nolink)]]
     175 
     176== Ecriture d'un octet ==
     177
     178[[Image(i2c_trame_w.png,nolink)]]
     179
     180La figure ci-dessus montre l'écriture d'octet. Le maître décide d'arrêter l'échange en faisant une condition d'arrêt. L'esclave se
     181contente d'envoyer des acquitements après chaque réception.
     182
     183== Lecture d'un octet ==
     184
     185[[Image(i2c_trame_r.png,nolink)]]
     186
     187La figure ci-avant montre la lecture d'un octet. Il faut noter deux choses. La première est qu'après avoir envoyé l'adresse, le
     188maître lâche SDA pour lire l'octet de donnée émit par l'esclave. La seconde est que pour signifier à l'esclave que la transaction
     189s'achève il envoie un NACK (Not ACKnowledge) à l'esclave, puis il place une condition d'arrêt. Ce NACK ne signifie pas que la
     190donnée n'a pas été correctement reçue mais que le maître veut stopper l'échange et que donc l'esclave doit lâcher SDA. Vous
     191pouvez vous demander comment ferait le maître pour indiquer qu'il n'a pas bien reçu la donnée, et bien il ferait pareil, il
     192imposerait un NACK. La différence est qu'il recommencerait la transaction, tout de suite ou plus tard en reprenant là ou il faut.
     193
     194== Espaces d'adressage ==
     195
     196La version standard du protocole utilise des adresses sur 7 bits. L'usage de ces adresses est réglementé. Les esclaves doivent se
     197reconnaitre et il n'est pas possible d'avoir deux esclaves à la même adresse. C'est pour cette raison que certains composants
     198permettent de choisir en partie ou totalement l'adresse. Le bus I2C permet le branchement à chaud (hotplug) mais pas
     199l'autoconfiguration (plug-n-play).
     200
     201=== __Adresses réservées par le protocole I2C__ ===
     202
     203 * `0000000` General Call, adresse reconnue par tous les esclaves
     204 * `0000001` réservé aux composant CBUS (ancètre)
     205 * `0000010` réservé aux autres systèmes
     206 * `0000011` réservé au futur
     207 * `00001--` réservé aux composants haute vitesse (3.4Mbauds)
     208 * `11111--` réservé au futur
     209 * `11110xy` adressage 10 bits
     210
     211=== __112 Adresses réservées par les fournisseurs ou réquisitionables__ ===
     212 * `0100xyz` sextuble CNA
     213 * `1010xyz` 1024 x 8 bits eeprom
     214 * `1110000` Télémetre à ultra-sons
     215 * `.......` toutes les autres
     216
     217En plus de ces adresses I2C, il y a souvent un second système d'adressage propre au composant accédé.
     218Par exemple si le composant accédé est une ram. Ce composant ram a une adresse I2C et des adresses de cases internes.
     219Du point de vue I2C, ces adresses de cases sont des données. Il y a donc en général un protocole spécifique propre à chaque
     220composant.
     221
     222Nous allons pouvoir expérimenter ces deux niveaux de protocole dans les expériences de ce TME. Nous verrons en effet que chaque
     223composant dispose d'une adresse unique I2C chacun et de plusieurs adresses internes dont le mode d'accès spécifique est présenté
     224dans la spécification du composant.
     225
     226== Pour finir ==
     227
     228Nous venons de voir l'écriture et la lecture d'un octet unique. En fait, le nombre d'octets échangés n'est pas limité. Un
     229maître peut décider d'écrire autant d'octets qu'il veut. L'esclave peut refuser une donnée en envoyant un NACK et demander
     230ansi au maître de stopper l'échange. Pour la lecture, l'esclave ne dispose pas de moyen pour indiquer au maître qu'il n'a
     231plus de données à fournir. C'est un protocole de plus haut niveau qui doit régler ce problème.
     232
     233C'est le maître qui envoie les pulses d'horloge, mais l'esclave peut ralentir la transaction en maintenant la ligne SCL  à 0.
     234Le maître est capable de s'apercevoir de ce ralentissement car il lit la valeur de la ligne SCL en permamence et il peut
     235se rendre compte que la valeur lue n'est pas celle attendue. Le maitre peut aussi de lui-même decider de faire disparaitre
     236certains pulses pour, par exemple, se laisser le temps de réagir quand il est récepteur d'envoyer des acquitements. Cette
     237caractéristique permet donc au maître et à l'esclave de prendre le temps nécessaire à chaque étape d'un échange, c'est
     238particulièrement utile si c'est un programme en assembleur qui fait avancer l'échange.
     239
     240Pour les deux figures précédentes, nous avons ajouté une notation des échanges qui simplifie leur description. On ne fait
     241plus apparaitre les chronogrammes, mais juste les conditions et les mots échangés. Cette notation se retouve souvent dans
     242les documentations des circuits à interface I2C, en particulier ceux que vous allez voir aujourd'hui.
     243On n'a pas besoin de faire apparaitre le temps d'attente.
     244
     245== Conclusion hative ==
     246
     247Nous allons arrêter là pour la description de l'I2C car nous n'avons pas besoin de plus pour ce TME. Encore une fois,
     248nous vous invitons à lire la spécification officielle de Philips sur l'I2C. Le pic16f877 offre plus de choses que la simple
     249écriture et lecture d'un octet mais nous ne le verrons pas aujourd'hui.
     250
     251Ce que vous n'avez pas vu, c'est:
     252 * Le mode d'adressage 10 bits.
     253 * La méthode de résolution des conflits
     254
     255= Les circuits I2C de ce TME =
     256
     257Nous allons communiquer avec deux circuits: un convertisseur numérique analogique et un télémètre à US. Nous allons commencer par
     258le convertisseur car il peut être commandé en faisant seulement des écritures i2c. Le télémetre nécessite écritures et lectures et
     259nous allons voir que c'est un peu plus compliqué.
     260
     261= Le module I2C du pic16f877 =
     262
     263Le PIC peut agir comme un maitre ou un esclave. Ici nous le faisons fonctionner en maitre.
     264Vous trouverez les informations dans la documentation technique fournie à partir de la page 24.
     265Le bus I2C permet à plusieurs maitre de se partager les ressources. Ceci entraine des collisions
     266et cela complexifie le contrôle par le PIC. Dans notre cas nous n'avons qu'un seul maitre, en conséquence il y a
     267pas mal d'information inutiles dans la documentation. Pour comprendre la gestion du bus par le PIC, c'est-à-dire
     268comprendre quels sont les registres à consulter et modifier pour réaliser une transaction, vous devez vous reporter
     269aux tableaux pages 25(verso) et 26(recto). Vous pouvez voir qu'une transaction se fait en controlant les bits SEN, PEN et SSPIF.
     270
     271= Le modèle de programme fourni =
     272
     273Nous donnons un programme qui fait une rampe sur le DAC: [attachment:i2c_dac.asm].
     274
     275= Travaux pratiques =
     276
     277=== __Experience n°1__ ===
     278 * A la lecture de la documentation commentez chaque ligne de l'initialisation du module I2C et des envois au DAC.
     279
     280=== __Experience n°2__ ===
     281 * Augmenter la fréquence en faisant des trames i2c plus longue.
     282 * Envoyer une dent de scie sur 2 sorties.
     283
     284=== __Experience n°3__ ===
     285 * Commander le télémetre avec affichage sur le port D de la distance.
     286
     287=== __Experience n°4__ ===
     288 * Pour les plus avancer. Utiliser les interruptions ! attention c'est dur donc un super bonus a ceux qui y arrivent !