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. 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 :
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 :
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.
Diminuer les résistances et augmenter le courant peut poser les problèmes suivants :
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' 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. Transmission Réussie SCL est la ligne de données. 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)
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.
|