Quand on parle réseau au niveau des microcontroleurs, on parle surtout des bus utilisés
pour interconnecter des composants supplémentaires ou pour permettre la communication entre plusieurs
microcontroleurs. Il existe une grande variété de standards (Microwire, SPI, CAN,...) qui peuvent mener à une grande confusion de ce qu'est ou
n'est pas un réseau au niveau microcontroleur. On peut définir un réseau de microntroleur comme étant un moyen de communication avec l'ensemble de composants
connectés à ce moyen de communication communiquant entre eux via un protocole de message établi.
Dans ce type de
réseau, un Master est un composant intelligent qui peut initier un transfert de données. Les composants qui ne peuvent que répondre à des demandes sont appelés Slaves.
Les réseaux de microntroleurs peuvent comporter plusieurs Masters et donc le protocole d'échange de données doit comporter un moyen d'arbitrage pour éviter les conflits
éventuels.
Typiquement, les réseaux de microcontroleurs
ne transmettent que peu de données comparé au tonnes de bits que peut charrier un réseau de PC par exemple. On a donc pas besoin d'une bande passante de 352 GigaBytes/sec.
I2C est l'un des bus les plus populaires pour
les réseaux de microcontroleurs. Il permet d'établir une interface entre microcontroleurs et composants périphériques sans devoir installer des kilomètres de bus de données, de bus
d'adressage et de bus de contrôle. I2C permet de plus de partager les resources du réseau entre plusieurs microcontroleurs (multimaster possible).
Le bus I2C est constitué de
deux lignes : Une ligne d'horloge (SCL) est utilisée pour synchroniser les données venant ou partant d'un Master et véhiculées par la ligne des données (SDA). On installe un système
pull-up sur les deux lignes afin quelles puissent être utilisées par plusieurs Masters. Les deux lignes sont nécessaires pour transmettre les informations mais aussi pour
indiquer que le transfert de données à débuté.
Pour débuter un transfert de données, on met
sur le bus une Start Condition. Normalement, quand le bus est inactif, les deux lignes sont à l'état haut (pull-up). Pour initier un transfert, le Master demandant le bus met la ligne SDA
à l'état bas puis juste après, il fait de même avec la ligne SCL. Pendant le transfert de données, c'est une combinaison invalide. En effet, on change la valeur de la ligne SDA pendant
que la ligne SCL est à l'état haut.
Pour terminer un transfert de données, on fait
l'inverse : on met la ligne SCL à l'état haut et un instant après, on fait de même avec la ligne SDA. C'est une Stop Condition. Les données, une fois la transmission établie, sont
transmises de manière synchrone avec le bit de poids fort en premier. L'émetteur du byte (qui peut être ou ne pas être le Master) quand il a fini d'envoyer son byte (8 bits) laisse "flotter"
la ligne SDA afin que le récepteur de la donnée puisse la mettre au niveau bas quand il a recu le byte (c'est ce qu'on appelle le acknowledge bit). Après ce bit, on laisse les deux lignes
à l'état bas pour accueillir le prochain byte ou la prochaine Start/Stop Condition.
Les vitesses maximum atteintes pour le bus
I2C sont de 100kbps en "standard mode" et 400 kbps en "fast mode".
| Start Condition | Adresse Recepteur | R/W | Ack | Data RX/TX | Ack | .....données additionnelles ou commande start.... | Stop Condition |
L'adresse du récepteur est composée de 7bits et est l'adresse "bus" du recepteur. Il y a une convention qui identifie les 4 bits de poids fort de l'adresse comme étant le type de composant utilisé pour le récepteur. (Voir les datasheets !!!) Les trois bits restants sont utilisés pour déterminer à quel composant du même type l'on s'adresse (s'il y a deux afficheurs LCD, on les distingue avec ces trois bits). Ce système d'adressage est dépendant des composants utilisés certains fonctionnent avec une adresse sur 10 bits... Vérifiez les datasheets !!!
Voilà, c'est tout pour aujourd'hui mais c'est un bon début pour commencer à comprendre comment ça marche...