L'I2C de Damien Mercier

De Site à Mans
Aller à la navigation Aller à la recherche
Bonjour,

Cette page est une simple copie du travail qu'avait effectué Damien Mercier avant de mettre son projet au repos.


Le Bus I2C Fichier:I2c.gif

C'est un bus série à deux fils (SDA pour serial data et SCL pour serial clock) créé par Philips qui est conçu pour interfacer des périphériques lents à un microcontrôleur (I2C signifie Inter-Integrated Circuit). Les spécifications d'origine sont un débit de 100kbit/s et des adresses de composant sur 7 bits (le 8éme bit servant à indiquer une lecture ou une écriture). De très nombreux composants bon marché existent pour ce bus, convertisseur A/D, générateur DTMF, capteurs de température, récepteur de télécommande, entrées/sorties numériques ... pour ne citer que quelques exemples.


Les solutions sous Linux

Bien que créé au départ pour simplifier la conception d'équipements électroménager (hifi/video surtout), l'I2C est utilisé depuis longtemps dans le monde informatique. Il sert généralement en interne dans les cartes, c'est le cas par exemple des cartes à base de BT848 et BT878 qui utilisent un bus I2C pour piloter le tuner TV et les autres composants. Le système d'identification des paramètres des moniteurs VGA est aussi un bus I2C. Les cartes mères récentes ont également des capteurs de tension, de température et de rotation des ventilateurs qui sont basés sur un dérivé de l'I2C : le SMBUS. Il faut aussi citer l'ACCESS-BUS qui a servi comme bus clavier-souris sur certaines stations de travail.
Yail-I2C est un ensemble de bibliothèques et un driver permettant l'accès à un bus I2C sur une machine Linux. Yail-I2C est beaucoup plus simple et dispose de moins de fonctionnalités que les drivers I2C du noyau Linux. Si ce sont ces derniers qui vous intéressent, ils se trouvent là avec le projet lm_sensors : http://www.national.com/ds/LM/LM78.pdf. D'autres informations sur les drivers à la source du projet se trouvent ici.
Sous FreeBSD et sous Windows existent aussi des outils pour l'I2C, voir les liens à la fin de ce document.

Fonctionnalités de Yail-I2C

Les techniques pour relier une machine au bus I2C sont nombreuses. Yail-I2C en supporte deux grandes catégories : l'interface ISA basée sur le composant PCF8584 (c'est une carte décrite dans Elektor de janvier 1992), et les interfaces dites bit-banging, c'est-à-dire où le bus est géré entièrement par logiciel.
Du point de vue d'un programme utilisateur, Yail-I2C est une bibliothèque qui fourni quelques appels de base permettant de communiquer avec le bus I2C. Il suffit de changer de bibliothèque pour changer d'interface physique !

Interfaces simples (bit-banging)

La bibliothèque est en deux morceaux, une partie qui se charge de la gestion du protocole I2C, et une autre partie qui effectue les commandes de lecture/écriture des signaux qui pilotent SDA et SCL. La version 1.6 utilise uniquement les lignes de contrôle du port série à cet effet. Il est facile de la modifier pour utiliser d'autres ports néanmoins, et une technique plus standard pour cet interfaçage est prévue pour une future version.

Carte ISA à PCF8584
Deux versions seront disponibles (fonctionnent sur ma machine, mais non-intégrées dans la version 1.6) : une version utilisant des entrées-sorties directes sur les adresses de la carte ISA depuis la bibliothèque, et une autre version où l'accès à la carte est fait dans un nodule chargé dans le noyau Linux.

Avantage/inconvéninets des deux solutions :

  • La solution à base de driver permet la gestion du PCF8584 en mode polling ou en mode interruptible, la version en bibliothèque ne permet que le polling ;
  • la solution à base de driver permet grâce à un mécanisme de verrouillage l'accès concurrent au bus I2C depuis plusieurs processus ou depuis plusieurs threads d'un même processus :
  • l'utilisation de ioports() et des entrées-sorties directes depuis une bibliothèque oblige à exécuter le programme avec les droits root (éventuellement en le mettant suid root), ceci n'est pas nécessaire lorsque le driver effectue l'accès au matériel ;
  • le driver n'existera dans un premier temps que pour les noyaux 2.2.x, la bibliothèque quand à elle fonctionne sans problème en 2.2.x et en 2.4.x.


Remarque : du fait de la relative lenteur du bus I2C, les performances des deux solutions sont voisines. La solution bit-banging est bien sûr plus consommatrice de temps processeur.

Tableau des interface I2C pour port serie RS232C



Interfaces simples
(bit-banging)
Damien Merci bitbanding serial.gif
Schéma de principe
Z1/Z2 Diodes Zenner 5v1
R1/R2 Résistances de 4K7 ohms 5%
1 Connecteur DB9
Interfaces simples
à base de Transistors
Damien Merci level inverter.gif
Schéma de principe
Q1/Q2 Transistor 2N2222
R3/R4/R6/R7 Résistances de 1k5 ohms
R8/R5 Résistances de 10K ohms.
Carte ISA
avec PCF8584
Damien Merci elektor sch.gif
Schéma de principe







Connecteur DB9
Damien Merci schema serial db9.gif
Schéma





Exemples de programmes basés sur Yail-I2C

Des exemples de codes sont fournis avec les bibliothèques. Deux outils indispensables sont aussi présents, permettant de tester l'ensemble des adresses sur le bus pour obtenir la liste des composants (scani2c) pour l'un, et autorisant l'exécution de séquences quelconques en une simple ligne de commande sur le bus pour le second (i2csh).
Un exemple de réalisation d'un thermomètre basé sur un Dallas DS1621 branché et alimenté sur le port série est aussi fourni (showtemp), ainsi que plusieurs autres exemples à venir dans la version 1.7.

Le DS1621 au bout de l'anneau, et l'interface port série/I2C
Le thermomètre complet


Téléchargement


Lien

  • Drapeau anglais.jpg Spécifications officielle I2C 3.0
  • Drapeau anglais.jpg Le site de l'inventeur
  • Drapeau francais La page de Marc BOUGET (en français) ou on trouve beaucoup d'informations, et des outils, principalement sous Windows.
  • Drapeau francais Christophe Grosse. (en français) propose plusieurs circuits venant se raccorder à l'I2C, ainsi qu'un source permettant de faire un composant I2C avec un PIC !
  • Drapeau francais La page de Zorglup sur laquelle il y a des montages pour l'I2C (en français)