lundi 14 septembre 2015

interface I2C

Dans cet article je présente le protocole i2C. qui est un bus de communication entre circuits intégrés. Ce type d'interface sérielle est utilisés avec de nombreux capteurs et aussi par certaines mémoires sérielles.

Inter-Integrated Circuit

I2C est l'abréviation pour Inter-Integrated Circuit. Il s'agit d'un protocole de communication sériel et synchrone utilisé pour la communication entre des circuits intégrés. Comme le SPI il s'agit d'un protocole bus, c'est à dire que plusieurs dispositifs peuvent-être connectés sur les même lignes de communication. Contrairement au protocole SPI il peut y avoir plusieurs maître sur le bus, c'est un bus Multi-maîtres, multi-esclaves. Il n'utilise que 2 fils pour la communication SDA et SCL par contre le débit est plus lent que pour un bus SPI. De plus la communication est semi-duplex, c'est à dire que la transmission et la réception se font en alternance.

Puisque les lignes de communication SDA et SCL peuvent-être contrôlées par plus d'un dispositifs il faut qu'elles soient configurées en drain ouvert. Il y a donc une résistance pull-up sur chaque ligne.

Seul un dispositif maître peut initier une communication. Mais puisqu'il peut y avoir plusieurs maître sur le bus, avant de débuter une transaction un maître doit vérifier l'état du bus. Évidemment s'il n'y a qu'un seul maître cette vérification peut être omise.

Dans cet introduction on ne verra que l'utilisation la plus simple soit un MCU utilisant une mémoire EEPROM et deux sondes de température branchés sur le même bus I2C.

Disons que ce dispositif sert à lire deux températures et à enregistrer les données dans la mémoire EEPROM. Les lignes A0-A2 sont branchées soit à Vdd ou Vss pour sélectionner l'adresse du périphérique. Ainsi l'EEPROM est à l'adresse 0 (b000), la sonde 1 à l'adresse 2 (b010) et la sonde 2 à l'adresse 4 (b100). Il s'agit des 3 bits les moins significatifs de l'adresse car en fait l'adresse est de 7 bits. Cette adresse constitue les 7 bits les plus significatifs du premier octet envoyé par le mettre sur le bus. Le bit le moins significatif (b0) indique si le maître veut transmettre (0) ou recevoir (1). Par exemple pour une mémoire EEPROM Microchip 24LC512 il y a 3 broches de sélections pour les 3 bits les moins significatifs de l'adresse pour une plage hexadécimal qui va de 0x50..0x57. Cette adresse étant décalée vers la gauche de 1 bit on a en fait 0xA0,0xA2,0xA4,0xA6,0xA8,0xAA,0xAC,0xAE.

Adressage

Puisqu'il y a plusieurs dispositifs sur le même bus et qu'il n'y a pas de ligne Slave Select il faut une autre méthode pour distinguer les différents périphériques. Le protocole I2C utilise un adressage via le canal de données. Le maître procède de la manière suivante pour communiquer avec un périphérique esclave.

  1. Envoie du START bit.
  2. Envoie de l'octet d'adresse avec le bit 0
  3. Le bit 0 est à écriture(0)/lecture(1)
  4. Si un dispositif sur le bus reconnait l'adresse il répond par un ACK bit.
  5. Si le maître reçoit un ACK bit il peut continuer à transmettre ou recevoir en utilisant la ligne SCL pour cadencer les bits.
  6. Une transmission se termine par un STOP bit.

Lorsque le bus est inactif les 2 lignes sont à 1. Pour signaler un START le maître garde la ligne SCL à 1 et fait passer la ligne SDA de 1 à 0. Pour un STOP c'est l'opposé, la ligne SCL toujours à 1 et la ligne SDA passe de 0 à 1. Toutes les autres transitions de la ligne SDA se font lorsque la ligne SCL est à 0.

Le maître contrôle la ligne SCL et après l'envoie de chaque octet il doit envoyer un cycle supplémentaire sur la ligne SCL pour lire le bit ACK envoyé par l'esclave. Notez que ce bit ACK n'est envoyer pendant la phase d'adressage qu'après le bit WRITE/READ. Le maître doit lire le bit ACK pour s'assurer que l'octet a bien été reçu. On a donc 9 périodes du signal clock par octet envoyé. Lorsque le maître est en mode réception c'est lui qui doit envoyer un bit ACK pour chaque octet reçu. Cependant il ne doit pas envoyer de ACK pour le dernier octet reçu. Dans ce cas l'esclave cesse la transmission et attend le stop bit. Les octets sont transmis en commençant par le bit le plus significatif.

extrait du feuillet de spécification du 24LC512

Dans le cas des dispositifs Microchip utilisés dans le montage ci-haut l'octet d'adressage se compose de 4 bits fixes et de 3 bits programmables par les broches.

extrait du feuillet de spécifications du 24LC512

Pour connaître l'adresse I2C de chaque dispositif il faut consulter le feuille de spécification. Ce n'est pas tous les dispositifs qui offre une plage de 8 adresses. Par exemple certains petits affichages OLED graphique utilisant un controlleur SSD1306 ne permettent que 2 adresses 0x3C ou 0x3D (0x78,0x7A décalée vers la gauche).

Puisqu'un ACK doit-être envoyé à chaque octet transmis le MCU doit reconfiguré la ligne SDA en conséquence. Par exemple lorsqu'il transmet il doit configuré la broche qui sert de SDA en mode entrée pour recevoir le ACK et la remettre en mode sortie autrement. Lorsqu'il reçoit c'est le contraire il doit garder cette broche configurée en entrée et la mettre en sortie pour transmette le ACK.

Mette en application une interface I2C en logiciel es plus complexe que pour une interface SPI à cause du changement continuel de direction de la ligne SDA. Pour un exemple concret d'utilisation vous pouvez consulter le projet sonnette d'entrée sur ce blog.

Conclusion

Le seul avantage de l'interface I2C par rapport au SPI est le nombre réduit de broches requises sur le MCU. Autrement la vitesse de communication est plus lente et la mise en oeuvre plus complexe au niveau logiciel s'il n'y a pas de périphérique I2C intégré au MCU. Les périphériques I2C intégrés au MCU sont plus rares que les périphériques SPI. Donc plus souvent qu'autrement on doit le faire en bit bang.

Aucun commentaire:

Publier un commentaire

Remarque : Seuls les membres de ce blogue sont autorisés à publier des commentaires.