L'interface I2C sur ESP32

publication: 9 février 2022 / mis à jour 9 février 2022

Read this page in english

 

Appel à collaboration

Vous développez des montages, simples ou complexes avec ESP32 et ESP32forth.

Partagez-les ici sur ce site.

ESP32forth ne pourra se développer qu'avec la collaboration active de toutes les bonnes volontés.

Vos montages peuvent aider d'autres développeurs.

Les montages des autres développeurs peuvent vous aider.

Pour proposer un article ou un montage, cliquez ici


 

Listing complet: Scan I2C bus to determine peripherials adresses


Introduction

I2C (signifie: Inter-Integrated Circuit, en anglais) est un bus informatique qui a émergé de la « guerre des standards » lancée par les acteurs du monde électronique. Conçu par Philips pour les applications de domotique et d’électronique domestique, il permet de relier facilement un microprocesseur et différents circuits, notamment ceux d’un téléviseur moderne : récepteur de la télécommande, réglages des amplificateurs basses fréquences, tuner, horloge, gestion de la prise péritel, etc.

Il existe d’innombrables périphériques exploitant ce bus, il est même implémentable par logiciel dans n’importe quel microcontrôleur. Le poids de l’industrie de l’électronique grand public a permis des prix très bas grâce à ces nombreux composants.

Ce bus porte parfois le nom de TWI (Two Wire Interface) ou TWSI (Two Wire Serial Interface) chez certains constructeurs.

Les échanges ont toujours lieu entre un seul maître et un (ou tous les) esclave(s), toujours à l'initiative du maître (jamais de maître à maître ou d'esclave à esclave). Cependant, rien n'empêche un composant de passer du statut de maître à esclave et réciproquement.

principe d'un bus I2C

La connexion est réalisée par l'intermédiaire de deux lignes:

Il ne faut pas oublier la masse qui doit être commune aux équipements.

Les 2 lignes sont tirées au niveau de tension VDD à travers des résistances de pull-up (RP).

Afficheur OLED connecté au bus I2C

Échange maître esclave

Le message peut être décomposé en deux parties:

Condition de démarrage: la ligne SDA passe d'un niveau de tension élevé à un niveau de tension bas avant que la ligne SCL ne passe de haut en bas.

Condition d'arrêt: la ligne SDA passe d'un niveau de basse tension à un niveau de tension élevé après le passage de la ligne SCL de bas à haut.

Cadre d'adresse: une séquence de 7 ou 10 bits unique pour chaque esclave qui identifie l'esclave lorsque le maître veut lui parler.

Bit de lecture/écriture: un seul bit spécifiant si le maître envoie des données à l'esclave (niveau bas de tension) ou en lui demandant des données (niveau haut de tension).

Bit ACK/NACK: chaque trame d'un message est suivie d'un acquittement/non-acquittement bit. Si une trame d'adresse ou une trame de données a été reçue avec succès, un bit ACK est renvoyé à l(expéditeur.

Adressage

I2C n'a pas de lignes de sélection d'esclaves comme SPI, il a donc besoin d'un autre moyen de laisser l'esclave savoir que des données lui sont envoyées, et non un autre esclave. Il le fait par adressage. La trame d'adresse est toujours la première trame après le bit de départ dans un nouveau message.

Le maître envoie l'adresse de l'esclave avec lequel il veut communiquer à chaque esclave connecté à celui-ci. Chaque esclave compare alors l'adresse envoyée par le maître à la sienne. Si l'adresse correspond, il renvoie un bit ACK basse tension au maître. Si l'adresse ne correspond pas, l'esclave ne fait rien et la ligne SDA reste haute.

C'est ainsi que le mot Wire.detect (fin de l'article) détecte les périphériques connectés au bus i2c.

On peut connecter plusieurs périphériques différents sur le bus i2c. On ne peut pas connecter un même périphérique en plusieurs exemplaires sur le même bus i2c.

Définition des ports GPIO pour I2C

Le paramétrage des ports GPIO pour le bus I2C est très simple:

\ activate the wire vocabulary 
wire 
\ start the I2C interface using pin 21 and 22 on ESP32 DEVKIT V1 
\ with 21 used as sda and 22 as scl. 
21 22 wire.begin 

Protocoles du bus I2C

Le dialogue se fait uniquement entre un maître et un esclave.

Le dialogue est toujours initié par le maître (condition Start): le maître envoie sur le bus I2C l'adresse de l'esclave avec qui il veut communiquer.

Le dialogue est toujours terminé par le maître (condition Stop).

Le signal d'horloge (SCL) est généré par le maître.

Détection d'un périphérique I2C

Cette partie sert à détecter la présence d'un périphérique connecté au bus I2C.

Vous pouvez compiler ce code pour tester la présence de modules connectés et actifs sur le bus I2C.

\ activate the wire vocabulary 
wire 
\ start the I2C interface using pin 21 and 22 on ESP32 DEVKIT V1 
\ with 21 used as sda and 22 as scl. 
21 22 wire.begin 
 
: spaces ( n -- ) 
    for 
        space 
    next 
  ; 
 
: .## ( n -- ) 
    <# # # #> type 
  ; 
 
\ not all bitpatterns are valid 7bit i2c addresses 
: Wire.7bitaddr? ( a -- f ) 
    dup $07 >= 
    swap $77 <=  and 
  ; 
 
: Wire.detect   ( -- ) 
    base @ >r hex 
    cr 
    ."      00 01 02 03 04 05 06 07 08 09 0a 0b 0c 0d 0e 0f" 
    $80 $00 do 
        i $0f and 0= 
        if 
             cr i .##  ."  : " 
        then 
        i Wire.7bitaddr? if 
            i  Wire.beginTransmission 
            -1 Wire.endTransmission 0 = 
            if 
                i .## space 
            else 
                ." -- " 
            then 
        else 
            2 spaces 
        then 
    loop 
    cr r> base ! 
  ; 

Ici, l'exécution du mot Wire.detect indique la présence du périphérique d'affichage OLED à l'adresse hexadécimale 3C:

Wire.detect
     00 01 02 03 04 05 06 07 08 09 0a 0b 0c 0d 0e 0f
00 :                      -- -- -- -- -- -- -- -- --
10 : -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- --
20 : -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- --
30 : -- -- -- -- -- -- -- -- -- -- -- -- 3c -- -- --
40 : -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- --
50 : -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- --
60 : -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- --
70 : -- -- -- -- -- -- -- --

Ici, nous avons détecté un module à l'adresse hexadécimale 3c. C'est cette adresse que nous utiliserons pour nous adresser à ce module:


Legal: site web personnel sans commerce / personal site without seling