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 | |
| 20 | Nous 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 |
| 21 | avec un terminal (un PC ou un palm). Il est aussi parfois utilisé pour accéder à des périphériques intelligents comme un |
| 22 | afficheur 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 |
| 23 | les ports et les cables si on veux connecter plusieurs capteurs. |
| 24 | |
| 25 | Aujourd'hui nous allons expérimenter l'I2C, un bus d'entrée-sortie qui permet de faire des échanges de données entre plusieurs |
| 26 | interlocuteurs (on parle d'abonnés). Ce document contient une présentation succinte du protocole I2C limitée (ou peu s'en |
| 27 | faut) aux seules spécifications offertes par le PIC réduites encore à ce dont nous avons besoin pour ce TME. De plus, sur |
| 28 | l'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 |
| 29 | intéressés pourront se reporter à la spécification officielle du protocole I2C présente sur le site du module microcontrôleur. |
| 30 | |
| 31 | Au niveau des expériences, nous allons tenter de communiquer avec deux composants I2C : un télémètre à ultra-sons et un |
| 32 | convertisseur numérique-analogique à 8 sorties. Nous allons aussi en profiter pour voir une méthode de programmation très utile |
| 33 | en assembleur: les automates d'états finis. |
| 34 | |
| 35 | = Protocole I2C = |
| 36 | |
| 37 | Cette 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, |
| 39 | merci à eux. |
| 40 | |
| 41 | == caractéristiques principales du bus I2C == |
| 42 | |
| 43 | Ce 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 |
| 44 | matériel que logiciel. Il est très diffusé et il existe un très grand nombre de composants proposant directement une interface I2C. |
| 45 | |
| 46 | I2C ou plutôt IIC signifie Inter-Integrated-Circuit. Comme son nom l'indique, il est destiné à faire communiquer des circuits intégrés |
| 47 | sur 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 |
| 48 | signaux et pas mal de précautions, d'atteindre des distances de 100 mètres avec un débit de 100 kbits/s. |
| 49 | |
| 50 | La 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 |
| 52 | ne 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 |
| 54 | masse (GND) et la tension d'alimentation (VDD). Cette dernière n'est pas indispensable mais elle permet généralement d'alimenter |
| 55 | le 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 | |
| 88 | Le protocole du bus I2C est particulièrement rusé, au sens où il offre beaucoup d'avantages tout en restant simple à mettre en |
| 89 | oeuvre, 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 | |
| 109 | Le 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 |
| 110 | figure 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 |
| 111 | différences électriques entre un maître et un esclave. Les résistances de rappel (une par ligne) ne sont pas dupliquées. |
| 112 | La ligne VDD est en pointillés pour signifier qu'elle est optionnelle. Il existe d'autres connexions plus complexes |
| 113 | utilisé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 |
| 114 | mètres et pour 10 à 20 abonnés. |
| 115 | |
| 116 | [[Image(i2c_elec1.png,nolink)]] |
| 117 | |
| 118 | Pour 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 | |
| 142 | Le bus ne dispose que de deux lignes SCL et SDA. Les différents états que vont pouvoir prendre ces lignes vont permettre |
| 143 | d'exprimer les étapes d'un échange. On parle de conditions car il s'agit en fait de changements d'état. Pour prendre un exemple, |
| 144 | un 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 | |
| 160 | Les 4 figures ci-dessous illustrent les 4 conditions du bus. Il ne manque que l'acquitement, mais en fait l'acquitement est un bit |
| 161 | comme 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 |
| 162 | celui 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 | |
| 168 | Pour pouvoir communiquer avec les différents composants raccordés au bus, nous allons détailler le protocole de communication |
| 169 | qui permet d'orchestrer les échanges. Dans un premier temps, et après avoir émis une condition de départ, le maitre indique |
| 170 | avec quel esclave il souhaite se connecter, pour cela il envoie sur le bus l'adresse de l'esclave composé de 7 bits (donc |
| 171 | 128 adresses différentes), puis un dernier bit indiquant le sens du transfert : Lecture (1) ou Écriture (0). Tous les esclaves |
| 172 | scrutent 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 | |
| 180 | La 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 |
| 181 | contente d'envoyer des acquitements après chaque réception. |
| 182 | |
| 183 | == Lecture d'un octet == |
| 184 | |
| 185 | [[Image(i2c_trame_r.png,nolink)]] |
| 186 | |
| 187 | La 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 |
| 188 | maî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 |
| 189 | s'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 |
| 190 | donné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 |
| 191 | pouvez 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 |
| 192 | imposerait 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 | |
| 196 | La version standard du protocole utilise des adresses sur 7 bits. L'usage de ces adresses est réglementé. Les esclaves doivent se |
| 197 | reconnaitre et il n'est pas possible d'avoir deux esclaves à la même adresse. C'est pour cette raison que certains composants |
| 198 | permettent de choisir en partie ou totalement l'adresse. Le bus I2C permet le branchement à chaud (hotplug) mais pas |
| 199 | l'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 | |
| 217 | En plus de ces adresses I2C, il y a souvent un second système d'adressage propre au composant accédé. |
| 218 | Par exemple si le composant accédé est une ram. Ce composant ram a une adresse I2C et des adresses de cases internes. |
| 219 | Du 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 |
| 220 | composant. |
| 221 | |
| 222 | Nous allons pouvoir expérimenter ces deux niveaux de protocole dans les expériences de ce TME. Nous verrons en effet que chaque |
| 223 | composant dispose d'une adresse unique I2C chacun et de plusieurs adresses internes dont le mode d'accès spécifique est présenté |
| 224 | dans la spécification du composant. |
| 225 | |
| 226 | == Pour finir == |
| 227 | |
| 228 | Nous 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 |
| 229 | maî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 |
| 230 | ansi 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 |
| 231 | plus de données à fournir. C'est un protocole de plus haut niveau qui doit régler ce problème. |
| 232 | |
| 233 | C'est le maître qui envoie les pulses d'horloge, mais l'esclave peut ralentir la transaction en maintenant la ligne SCL à 0. |
| 234 | Le maître est capable de s'apercevoir de ce ralentissement car il lit la valeur de la ligne SCL en permamence et il peut |
| 235 | se rendre compte que la valeur lue n'est pas celle attendue. Le maitre peut aussi de lui-même decider de faire disparaitre |
| 236 | certains pulses pour, par exemple, se laisser le temps de réagir quand il est récepteur d'envoyer des acquitements. Cette |
| 237 | caractéristique permet donc au maître et à l'esclave de prendre le temps nécessaire à chaque étape d'un échange, c'est |
| 238 | particulièrement utile si c'est un programme en assembleur qui fait avancer l'échange. |
| 239 | |
| 240 | Pour les deux figures précédentes, nous avons ajouté une notation des échanges qui simplifie leur description. On ne fait |
| 241 | plus apparaitre les chronogrammes, mais juste les conditions et les mots échangés. Cette notation se retouve souvent dans |
| 242 | les documentations des circuits à interface I2C, en particulier ceux que vous allez voir aujourd'hui. |
| 243 | On n'a pas besoin de faire apparaitre le temps d'attente. |
| 244 | |
| 245 | == Conclusion hative == |
| 246 | |
| 247 | Nous allons arrêter là pour la description de l'I2C car nous n'avons pas besoin de plus pour ce TME. Encore une fois, |
| 248 | nous 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 | |
| 251 | Ce 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 | |
| 257 | Nous allons communiquer avec deux circuits: un convertisseur numérique analogique et un télémètre à US. Nous allons commencer par |
| 258 | le convertisseur car il peut être commandé en faisant seulement des écritures i2c. Le télémetre nécessite écritures et lectures et |
| 259 | nous allons voir que c'est un peu plus compliqué. |
| 260 | |
| 261 | = Le module I2C du pic16f877 = |
| 262 | |
| 263 | Le PIC peut agir comme un maitre ou un esclave. Ici nous le faisons fonctionner en maitre. |
| 264 | Vous trouverez les informations dans la documentation technique fournie à partir de la page 24. |
| 265 | Le bus I2C permet à plusieurs maitre de se partager les ressources. Ceci entraine des collisions |
| 266 | et cela complexifie le contrôle par le PIC. Dans notre cas nous n'avons qu'un seul maitre, en conséquence il y a |
| 267 | pas mal d'information inutiles dans la documentation. Pour comprendre la gestion du bus par le PIC, c'est-à-dire |
| 268 | comprendre quels sont les registres à consulter et modifier pour réaliser une transaction, vous devez vous reporter |
| 269 | aux 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 | |
| 273 | Nous 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 ! |