Le bus I²C


Introduction

Il s'agit de décrire, ici, très sommairement le bus I²C, et surtout l'utilisation faite dans le robot. La doc est très abondante sur le sujet (sur le Net entre autre).

Documentations

Le Net.
Les spécif de l'I²C pour ceux qui ont vraiment envie d'approfondir: Spécifs

Le vif du sujet

L'I²C, dévellopé au début des années 80 par Philips notamment pour l'audio/vidéo (relier les différents composants dans une TV).

Le bus I²C est composé de 3 fils :

  • masse (GND)
  • horloge (SCL : Serial Clock)
  • données (SDA : Serial Data)

Les vitesses de transmissions étaient à l'origine de 100Kbits/s et 400KBits/s. On trouve (en particulier sur les PIC), tout et n'importe quoi comme vitesse.Sur un PIC@4MHz on peut monter jusqu'à 1Mhz ...

Le fonctionnement électrique :

Fonctionnement électrique.

Les périphériques sont tous branchés sur le bus. Un périphérique ne peut QUE :

  • imposer 0V sur le bus (sur SDA ou SCL ou les 2)
  • ne pas influer sur la ligne (haute impédance)

Il s'agit de sorties 'collecteur ouvert'

Il y a 2 pull-up, permettant, lorsqu'aucun périphérique n'impose quelquechose sur le bus, que le bus soit à 1 (5V).

Il n'est donc pas possible d'endommager le bus même en ayant des emetteur/recepteur faisant n'importe quoi (tant qu'aucun d'entre eux n'impose 5V directement).

La valeur des pull-up est un débat à lui tout seul.

Plus le pull-up est élevé et moins la ligne est 'fortement' ramenée au +5V. Les périphériques, pour imposer 0V auront besoin d'écouler moins de courant. Par contre le bus sera beaucoup plus sensible aux parasites.

Plus le pull-up est faible, et plus la ligne est 'fortrment' ramenée au +5V. Les périphériques doivent écouler plus de courant pour imposer 0V (dans l'hypothèse ou ça ne dépasse pas leur limite max de courant qu'une E/S peut écouler). Par contre le bus est moins sensible aux parasites. Plus une E/S doit écouler de courant et plus son temps de commutation (entre 0 et 5V) sera long.

On peut aussi voir ça comme ceci :

Ligne du BUS à 1 ou 0.

Lorsque la ligne du BUS est à 1 (5V), aucun périphérique n'impose 0V dessus. L'impédance de sortie est égale à la résistance de rappel (pull-up). On peut dire que l'ordre de grandeur est de quelques kohms. Un parasite même peu élevé peut faire changer suffisamment la tension sur le bus pour que le signal soit interprété comme un 0, même brièvement.

Lorsque la ligne du BUS est à 0(0V), c'est un périphérique qui impose 0V (en général par l'intermédiaire d'un transistor). Il va y avoir un courant qui va s'écouler du +5V vers la masse en passant dans le transistor (ce courant ne doit pas être trop élevé). A ce moment l'impédance de sortie du système va être beaucoup plus faible (ex : qques ohms). Bien moins sensible aux parasites. Par contre il passe pour ce signal à 0V, un courant. Si ce fil passe assez près et sur une longue distance à côté d'un autre fil à 1 (ex ici : ligne SCL à 0, ligne SDA à 1), il risque encore plus d'y avoir induction de l'un dans l'autre.

Donc quel valeur de pullup ? On peut dire entre 10k et 1k, au pire un peu en dessous.

  • 10k demande pour imposer 0, d'écouler un courant de 0.5mA, ce qui reste faible
  • 4.7k, demande 1mA ce qui est 'dans la moyenne'.
  • 2.7k doit être la recommendation de la spécif (2mA), il me semble
  • 1k demande un courant de 5mA. Cela réduit le risque de parasites.

Diminuer les résistances et augmenter le courant peut poser les problèmes suivants :

  • Impossibilité pour le composant interface I²C d'écouler le courant nécessaire pour imposer 0. Pour un PIC la limite pour une sortie est de 25mA grand MAX. 10mA commence déjà a être conséquent.
  • Temps de réaction augmenté avec le courant demandé pour le passage d'une sortie de haute impédance à 0V (charge capacitive des lignes SDA et SCL). Le nombre de périphérique influe aussi sur ce temps. Evidamment ce temps doit être inférieur au débit, même très inférieur pour avoir un fonctionnement correct et des états franc (0V franc, 5V franc)
  • Courant véhiculé plus grand pouvant entrainer des inductions dans les cables vosins, donc d'autres problèmes.

 

Le protocole I²C - Electronique:

Il définit la succession des états logiques sur SDA et SCL.

Ici on ne prend en compte que la cas où il y a un seul maitre I2C (carte principale) et un certain nombre d'esclaves. C'est le maitre qui gère tout le transfert.

Lorsque le maitre veut commencer un transfert, il va effectuer un START : SDA passe à '0' alors que SCL reste à '1'
Lorsqu'il souhaite le terminer, il effectue un STOP : SDA passe à '1' alors que SCL reste à '1'

Départ : START, Arrêt : STOP

Après avoir effectué un start, le maitre va transmettre des octets. Les octets sont transférés bits par bits :

Le maître applique sur SDA le bit de poids fort D7.
Il passe SCL à '1'.
Le front montant de SCL valide la donnée.
Il remet SCL à '0', à ce moment, il peut changer SDA;
Il y place le bit suivant et recommence pour les 8 bits.
Lors du 9ème bit, le maître n'impose rien sur SDA (il laisse SDA à 1), et passe l'horloge à 0. L'esclave doit acquitter (ACK) ce qu'il vient de recevoir, c'est à dire qu'il doit passer SDA à 0. Le maitre peut alors savoir si le transfert s'est bien passé.

Transmission Réussie

SCL est la ligne de données.
SDAM est ce que le maitre a imposé sur le bus (il ne peut imposer que 0, 1 consiste à laisser le bus flottant)
SDAE est ce que l'esclave a imposé sur le bus.
SDAR est ce qu'il y a eu physiquement sur le bus.

Le protocole I²C - Logique:

Maintenant qu'on peut envoyer un octet sur le bus, on peut voir comment en envoyer plusieurs et indiquer QUI doit les recevoir.

Pour sélectionner le destinataire, on va indiquer une valeur que le destinataire connaitra : son adresse. L'adresse est formé d'un nombre entre 0 et 127 (7 bits)auqels on ajoute un bit de Read/Write qui indique si le maître va encoyer des données vers l'esclave (Write : 0), ou l'esclave envoyer des données vers le maître (Read : 1)

@ bit 6 @ bit 5 @ bit 4 @ bit 3 @ bit 2 @ bit 1 @ bit 0 R/W ACK

Chaque esclave, regarde après chaque START, l'adresse qui est transmise. Si cette adresse correspond à la sienne, c'est lui qui va lire des données.

Un WRITE par le maître va ressembler à :

Ecriture par le maître

Lorsqu'il s'agit d'un READ, le maître va, après avoir écrit l'adresse, générer l'horloge sans rien imposer sur SDA. C'est l'esclave qui va fournir la donnée.

Lecture par la maître

 

L'ACK se fait dans le cas d'une lecture, par le maître (c'est à dire que le maîtrel passe SDA à 0 et SCL à 0) pour le bit d'ACK. En fonction des systèmes, les ACK peuvent avoir des significations particulières. Il peut y avoir aussi des NACK (Not ACK), c'est à dire que par exemple, le slave ne va pas générer d'ACK, volontairement pour indiquer de terminer le transfert par exemple.