Dans l'écosystème Linux embarqué, notamment sur les architectures ARM, la suite logicielle i2c-tools est indispensable pour déboguer et interagir avec les périphériques connectés au bus I2C. Cet article détaille l'usage des principales commandes : i2cdetect, i2cdump, i2cget, i2cset et la commande plus récente i2ctransfer.
1. i2cdetect : Identificasion du bus et des périphériques
Cette commande permet de lister les bus I2C disponibles sur le système et de scanner les adresses des esclaves connectés.
Lister les adaptateurs I2C
# Lister tous les bus I2C actifs
i2cdetect -l
Exemple de sortie :
i2c-1 i2c bcm2835 I2C adapter I2C adapter
i2c-2 i2c i2c-gpio I2C adapter
Scanner un bus spécifique
Pour scanner le bus numéro 1 et identifier les adresses occupées (l'option -y désactive la confirmation interactive) :
i2cdetect -y 1
Dans la matrice résultante, UU indique qu'un pilote noyau utilise déjà ce périphérique, tandis qu'une valeur hexadécimale (ex: 48) indique un périphérique détecté mais libre d'accès manuel.
2. i2cdump : Lecture complète des registres
i2cdump est utilisé pour obtenir une vue d'ensemble de l'état d'un composant en affichant l'intégralité de sa carte des registres.
# Syntaxe : i2cdump [-f] [-y] BUS ADRESSE [MODE]
# Exemple : Dump du périphérique à l'adresse 0x50 sur le bus 1
i2cdump -y 1 0x50
L'affichage présente les données sous forme de tableau hexadécimal, ce qui facilite la vérification des configurations globales d'un capteur ou d'une EEPROM.
3. i2cget : Lecture ponctuelle d'un reigstre
Pour lire la valeur d'un registre spécifique, on utilise i2cget. C'est l'outil idéal pour vérifier l'état d'un flag ou la valeur d'une mesure.
# Lire le registre 0x05 du périphérique 0x48 sur le bus 1
i2cget -y 1 0x48 0x05
Il est possible de spécifier le mode de lecture (octet par défaut b, ou mot de 16 bits w) :
# Lecture d'un mot (16 bits)
i2cget -y 1 0x48 0x10 w
4. i2cset : Modification d'un registre
i2cset permet d'écrire une valeur dans un registre cible. Attention, une mauvaise manipulation peut perturber le fonctionnement du matériel.
# Écrire la valeur 0x01 dans le registre 0x0A du périphérique 0x48
i2cset -y 1 0x48 0x0A 0x01
Pour vérifier l'écriture, on enchaîne généralement avec une lecture :
# Vérification immédiate
i2cset -y 1 0x48 0x12 0xFF && i2cget -y 1 0x48 0x12
5. i2ctransfer : Transactions complexes et adressage 16 bits
Les commandes classiques (get/set) sont souvent limitées à des adresses de registres sur 8 bits. Pour les composants modernes comme certaines EEPROM ou capteurs complexes nécessitant des adresses sur 16 bits, i2ctransfer est requis.
Lecture avec adressage 16 bits
Pour lire 4 octets à partir de l'adresse de registre 0x2001 sur un composant d'adresse I2C 0x50 :
# w2 : écrire 2 octets (l'adresse du registre)
# r4 : lire 4 octets
i2ctransfer -y 1 w2@0x50 0x20 0x01 r4
Écriture multiple
Pour envoyer une séquence de données à un périphérique :
# Écrire 0xAA 0xBB à l'adresse mémoire 0x0010
i2ctransfer -y 1 w4@0x50 0x00 0x10 0xAA 0xBB
i2ctransfer est extrêmement puissant car il permet de combiner plusieurs messsages (lecture et écriture) au sein d'une même transaction I2C, garantissant ainsi l'atomicité de l'opération sur le bus.