Regardez le Tutoriel vidéo: Introduction au bus I2C


Le bus I2C (Inter-Integrated Circuit) est un bus populaire développé par la société Philips dans les années 1980 pour l’utilisation dans la communication de périphériques dans un téléviseur et communément écrit comme «I2C» signifie Inter-Integrated Circuit et permet la communication de données entre les dispositifs I2C sur deux fils. I²C est parfois appelé Two Wire Interface.. 

I2C est devenu l’un des protocoles les plus courants de communication série en électronique. I2C permet la communication entre les composants électroniques ou le circuit intégré au circuit intégré. La figure 1 ci-dessous montre combien de dispositifs peuvent être connectés à ce système simple à deux fils en utilisant seulement deux broches du microcontrôleur.  

Les appareils n’ont pas besoin d’être identiques tant qu’ils supportent le protocole I²C. Dans notre illustration, le premier appareil avec l’adresse 1 est un capteur de température numérique, le second est une horloge en temps réel et le troisième est un écran LCD série et le bus peut transporter encore plus d’appareils.
La communication s’effectue du maître (PIC) à l’esclave sélectionné uniquement comme indiqué sur cette illustration, le maître n’envoie des données qu’à l’adresse de l’esclave 2.

Figure 1: des appareils esclaves connectés au bus I²C avec PIC  

Le bus I2C est un bus série synchrone bifilaire:

  • SDA (Serial Data Line) : ligne de données bidirectionnelle
  • SCL (Serial Clock Line) : horloge de synchronisation bidirectionnelle

N.B. Cela fait 3 fils en comptant la masse.

Les lignes SCL et SDA sont sont de type « Collecteur Ouvert ». Cela veut dire tout simplement que la puce peut conduire sa sortie faible, mais il ne peut pas le conduire haut. Pour que la ligne puisse s’élever, vous devez fournir des résistances pull-up à l’alimentation 5V. 
Une résistance de la ligne SCL à la ligne de 5 V et un autre de la ligne SDA à la ligne 5V. Vous n’avez besoin que d’un jeu de résistances de pull-up pour l’ensemble du bus I2C, pas pour chaque périphérique, comme illustré ci-dessus.
La valeur des résistances n’est pas vraiment critique, n’importe quelle valeur de 1k8 à 47k peut être utilisée, leurs valeurs dépendent de la longueur de la ligne de bus. Si les résistances sont manquantes, les lignes SCL et SDA seront toujours près de 0 volts et le bus I2C ne fonctionnera pas. La figure 2 ci-dessous montre comment les deux résistances pull-up (Rp) sont connectées.

résistances pull-up connectés au bus I²CFigure 2: résistances pull-up reliée au bus I²C

Le bus I²C est approprié lorsque le microcontrôleur et un dispositif avec lequel le microcontrôleur doit échanger des données sont à proximité immédiate, de préférence sur le même circuit imprimé. ces dispositifs (généralement des dispositifs intelligents) peuvent être des modules de mémoire comme 24AA01 1Kb EEPROM série, des capteurs de température comme le TC74, des horloges temps réel comme le DS1307, DAC, ADC, expandeurs d’entrée / sortie, etc.
Similaire à la communication série en mode SPI, le transfert de données en mode I2C est synchrone et bidirectionnel.
Cette fois, seules deux broches sont utilisées pour la transmission de données, une pour les données: la SDA (Serial Data) et l’autre pour l’horloge: les broches SCL (Serial Clock). 

Cette communication peut prendre en charge un maximum de 112 périphériques sur le bus (la spécification déclare que 128 périphériques peuvent être connectés au bus I2C, mais elle définit également 16 adresses réservées) connectés de manière simple en utilisant seulement deux broches d’entrée / sortie.  Mais en pratique le nombre de composants qu’il est ainsi possible de relier est essentiellement limité par la charge capacitive des lignes SDA et SCL : 400 pF

Avantages du bus I²C:

  • Il est plus rapide que le port série asynchrone, ce qui permet de transférer de grandes quantités de données rapidement, mais plus lentement que le SPI. Le bus peut fonctionner à différentes vitesses qui sont généralement dictées par le dispositif le plus lent sur le bus. Les vitesses de bus communes sont de 100Kbs (kilobits par seconde) en mode standard, 400Kbs en mode rapide et 1Mbs en mode haute vitesse, mais une nouvelle révision de la spécification permet un débit maximal de 3,4Mbps en mode haute vitesse.
  • Un autre avantage de l’utilisation de I2C sur SPI est le nombre de broches requises. La connexion d’un seul maître à un seul esclave avec un bus SPI nécessite quatre lignes. Chaque esclave supplémentaire nécessite une broche d’entrée / sortie de sélection de puce supplémentaire sur le maître. Cela peut devenir très lourd dans les situations où beaucoup d’appareils doivent être asservis à un maître.
    I2C ne nécessite que deux fils, comme un port série asynchrone, mais ces deux fils peuvent prendre en charge jusqu’à 112 périphériques esclaves.
  • En outre, contrairement à SPI, I2C peut prendre en charge un système multi-maître, permettant à plusieurs maîtres de communiquer avec tous les périphériques du bus (bien que les périphériques maîtres ne puissent pas communiquer entre eux via le bus).
  • I2C prend en charge plusieurs esclaves jusqu’à 112 périphériques esclaves. Les périphériques I²C peuvent avoir des broches d’adresse externes, ce qui vous permet d’attribuer une adresse unique à chaque périphérique et donc de permettre à plusieurs périphériques du même modèle de fonctionner sur un même bus.
  • I2C prend en charge la reconnaissance des esclaves, ce qui signifie que vous pouvez être absolument certain que vous communiquez réellement avec quelque chose. Avec SPI, un maître peut envoyer des données à rien du tout et n’a aucun moyen de savoir.

Inconvénients du bus I²C:

  • La communication via I2C est plus complexe qu’avec une communication USART ou SPI. La signalisation doit respecter un certain protocole pour que les dispositifs sur le bus le reconnaissent comme des communications I2C valides.
  • I2C consomme plus de courant que les autres bus de communication série en raison de la topologie à drain ouvert des lignes de communication.
  • Étant donné que les périphériques peuvent définir leur vitesse de communication, les périphériques opérationnels plus lents peuvent retarder le fonctionnement des périphériques à vitesse plus rapide.
  • La nature partagée du bus I2C peut entraîner la suspension de l’ensemble du bus lorsqu’un seul périphérique sur le bus cesse de fonctionner. La mise sous tension du bus peut être utilisée pour redémarrer le bus et rétablir le bon fonctionnement.
  • I2C est conçu pour une portée relativement courte, c’est-à-dire sur le même circuit imprimé que le maître ou via un câble relativement court par rapport à un bus RS-232, RS-485 ou CAN-Bus.

Opération

Figure 3: fonctionnement du bus I²C

Comme il s’agit d’une communication série synchrone, un signal d’horloge est nécessaire pour synchroniser le fonctionnement des deux appareils, est toujours généré par un appareil maître (un microcontrôleur) et sa fréquence affecte directement le débit en bauds. Lorsque les composants maître et esclave sont synchronisés par l’horloge, chaque échange de données est toujours initié par le maître. Une fois le module MSSP activé, il attend une condition de démarrage. Le dispositif maître envoie d’abord le bit START (zéro logique) à travers la broche SDA, puis une adresse à 7 ou 10 bits du dispositif esclave sélectionné, et enfin, le bit qui nécessite l’écriture de données (0) ou la lecture (1) sur le dispositif. 
À ce stade, si l’adresse de l’esclave existe sur le bus, l’esclave enverra un bit d’acquittement au maître. Les données sont ensuite transférées sur la ligne SDA dans la direction spécifiée par le maître. Un bit d’accusé de réception est envoyé à la fin de chaque octet transféré par la fin de réception de la transmission. La seule exception est que lorsque le maître est en mode de réception et l’esclave en mode de transmission, le maître n’enverra pas de bit d’accusé de réception après le dernier bit reçu.

Enfin, la communication est arrêtée avec le maître envoyant une commande d’arrêt. Les commandes START et STOP sont simplement une transition de haut en bas (Start) sur la ligne SDA avec SCL haut ou bas à haut (Stop) sur la ligne SDA avec SCL haut. Les transitions pour les bits de données sont toujours effectuées lorsque SCL est faible. L’état haut est seulement pour les commandes start / stop.

Configuration du bus I2C avec MPLAB® Code Configurator

Le MPLAB® Code Configurator (MCC) est un plug-in d’interface utilisateur graphique (GUI) convivial pour MPLAB® X IDE qui génère un code C facile à comprendre qui est inséré dans un projet MPLAB® X, en fonction des configurations des périphériques de configuration et les sélections effectuées dans l’interface utilisateur graphique (GUI). L’avantage de MCC, il peut générer des codes non seulement pour PIC18F mais pour une large gamme de PIC, y compris les séries PIC16F et PIC24.

Pour en savoir plus, lire l’article:

 MPLAB® code Configurator

Regardez le Tutoriel vidéo: Configuration du bus I²C


Voici la configuration du maître I²C. L’I²C est sous le MSSP dans les ressources de périphérique du configurateur de code MPLAB.

  • Fréquence d’horloge I²C: une fréquence d’horloge de 100 kHz est sélectionnée. En changeant la valeur dans le générateur de vitesse de transmission, la fréquence d’horloge change en fonction de votre valeur souhaitée.
  • Le contrôle de Slew: Slew rate est essentiellement la vitesse des changements de signal de bas en haut, ou vice versa. En limitant cette transition soudaine, vous pouvez réduire la sonnerie des réflexions de signal, et limiter la diaphonie entre les lignes de signaux. A 100kHz, les taux de signal sont si lents que slew rate ne compte pas vraiment , mais à 400kHz vous pouvez rencontrer des problèmes, vous devrez l’ activer. Comme nous fixons notre fréquence d’horloge à 100 kHz, nous allons mettre l’option de slew rate control à vitesse standard.
  • Adresses esclaves : Ici , vous pouvez spécifier le format de l’adresse esclave si vous allez utiliser un 7 bits ou un numéro d’adresse de 10 bits pour vos périphériques esclaves.
  • Registers: Dans cet onglet, vous avez accès aux registres I²C pour la configuration avancée.

Figure 4: Configuration maître I²C

MPLAB code configurateur génère les fonctions que vous pouvez utiliser pour accéder au périphérique I²C. Voici la description de quelques fonctions. La description complète peut être lue à partir du fichier i2c.h généré par le MPLAB Code Configurator

  • I2C_Initialize (): Cette routine initialise l’instance du pilote i2c pour la rendre prête à être ouverte et utilisée par les clients. Cette routine doit être appelée avant toute autre routine I2C appelée. Cette routine ne doit être appelée qu’une seule fois lors de l’initialisation du système.
  • I2C_MasterWrite (): Cette fonction gère une transaction d’écriture maître I2C avec les paramètres fournis. Il envoie des données à la file d’attente i2c, attend que la transaction complète et renvoie le résultat. Les paramètres sont les suivants :
    • Adresse : L’adresse du périphérique esclave I2C pour y accéder
    • longueur : la longueur du bloc de données à envoyer
    • * pdata : Un pointeur sur le bloc de données à envoyer
    • * pstatus : Un pointeur sur la variable d’état
  • I2C_MasterRead ():  Cette fonction gère une transaction de lecture maître I2C avec les paramètres fournis. Il envoie des données à la file d’attente i2c, attend que la transaction complète et renvoie le résultat. Les paramètres sont les suivants :
    • Adresse : L’adresse du périphérique esclave I2C pour y accéder
    • longueur : la longueur du bloc de données à envoyer
    • * pdata : Un pointeur sur le bloc de données à envoyer
    • * pstatus : Un pointeur sur la variable d’état
  • I2C_MasterQueueIsEmpty ():  Cette fonction retourne l’état vide de la file d’attente principale. Vous pouvez utiliser cette fonction pour vérifier si la file d’attente est vide. Cela peut vérifier si le maitre est actuellement inactif. Cette fonction retourne Vrai si la file d’attente est vide et fausse si la file d’attente n’est pas vide.

Dans l’article Interfacer l’horloge temps réel DS1307 avec microcontrôleur PIC, un exemple de lecture et d’écriture de données vers ou depuis une horloge temps réel I2C avec le compilateur MPLAB XC8 et le configurateur de code MPLAB est expliqué.

Fonctions I²C avec la bibliothèque périphérique PIC18F

La programmation de I²C n’est pas difficile, la plupart des compilateurs fournissent des routines de bibliothèque pour utiliser toutes les fonctions I²C. A partir du document d’aide de la bibliothèque de périphériques PIC18F trouvé dans le répertoire d’installation du compilateur dans: ..Program Files (x86) Microchip xc8 v1.34 docs MPLAB_XC8_Peripheral_Libraries.pdf (en supposant que vous avez installé votre compilateur dans le répertoire Program Files (x86). la version de votre compilateur, cela peut être différent si vous utilisez un compilateur différent).
Recherchez le PIC que vous allez utiliser, cliquez sur: « CLIQUEZ ICI pour les détails de support de la bibliothèque périphérique pour ce périphérique » Pour une famille 18F2620, les fonctions I²C sont à partir de la page 1152 dans le pdf)..

Remarques: 

  • Microchip supprime progressivement la bibliothèque périphérique PIC18F qui n’est plus incluse dans le compilateur XC8 de XC8 v1.35. Vous devez les télécharger et les installer séparément dans votre compilateur et ils s’appellent maintenant Legacy Peripheral Libraries. Il est maintenant conseillé d’utiliser MPLAB® Code Configurator
  • Pour les appareils avec plusieurs périphériques I²C, vous devrez spécifier quel module I²C vous allez utiliser:

Exemple:  

  • Pour les microcontrôleurs PIC qui ne possèdent pas de module I²C ou si des broches d’entrée / sortie autres que les broches I2C dédiées par défaut sont nécessaires, les fonctions du logiciel I²C peuvent être utilisées. 

Voici une description rapide des fonctions et macros:

Les fonctions

OpenI2C : Ceci est la première fonction pour configurer le bus I²C. Ici , vous pouvez choisir l’appareil pour être le maître  ou l’esclave: 
OpenI2C (MASTER, SLEW_OFF);        // Module Initialiser I²C, dispositif de sélection en tant que maître et Slew rate Off.
WriteI2C:  Cette fonction permet d’écrire un octet de données unique au dispositif I²C. 
WriteI2C (données non signé char);  // écrire le contenu de la variable de données au dispositif I2C

ReadI2C:  Cette fonction permet de lire un seul octet de bus I²C 

unsigned char data= ReadI2C (); // Lecture du bus I2C et attribuer cette valeur de lecture à la variable de données

putsI2C: Cette fonction permet d’écrire une chaîne de données sur le bus I²C. 

getsI2C: Cette fonction lit la longueur de chaîne de données prédéterminée du bus I²C.
IdleI2C:  Cette fonction génère Attendre jusqu’à ce que la condition bus I²C est au repos. Il est toujours bon d’utiliser cette fonction entre  deux commandes pour vous assurer une commande est terminée avant de commencer l’autre.
CloseI2C:  Cette fonction désactive le module I²C lorsque vous avez terminé.

Les macros

EnableIntI2C:  permet interuptions de I²C
DisableIntI2C:  désactive interuptions  deI²C 
SetPriorityIntI2C:  définit le niveau de priorité pour interruption I2C. 

I2C_Clear_Intr_Status_Bit: Effacer le bit d’état d’interruption I2C
I2C_Intr_Status StopI2C:  Macro pour retourner le statut d’interruption I2C
StopI2C:  Macro pour lancer l’ état d’arrêt
StartI2C:  Macro pour lancer la condition de démarrage
RestartI2C:  Macro pour lancer la condition de redémarrage
NotAckI2C: 
Cette macro initie une condition d’accusé de réception négatif et attend jusqu’à ce que la séquence d’accusé de réception soit terminée. Cette macro est applicable uniquement au maître.

AckI2C:  Cette macro initie une condition d’accusé de réception positif et attend jusqu’à ce que la séquence d’accusé de réception soit terminée. Cette macro est applicable uniquement au maître.

DataRdyI2C:  Cette macro fournit un statut à l’utilisateur si le registre SSPxBUF contient des données.
putcI2C:  Cette macro est identique à WriteI2C
getcI2C:  Cette macro est identique à ReadI2C

Dans l’article Interfacer l’horloge temps réel DS1307 avec microcontrôleur PIC, un exemple de lecture et d’écriture de données vers ou depuis une horloge temps réel I2C avec le compilateur MPLAB XC8 et le configurateur de code MPLAB est expliqué.