Navigation
Internships & Projects
Raspberry Pi
Code Embarqué et Temps Réel
SE et Pilotes
[Protected]
Pour obtenir la liste des ports I2C disponible:
i2cdetect -y -l
Pour liste les périphériques disponibles sur le bus (PORT est le numéro du port I2C) :
i2cdetect -y -r PORT
Pour écrire dans un registre I2C REG la valeur VAL du périphérique PER (REG, VAL et PER en hexadécimal) :
i2cset -y PORT PER REG VAL
Pour lire un registre REG de 8-bits:
i2cget -y PORT PER REG
Pour lire un registre REG de 16-bits:
i2cget -y PORT PER REG w
Références :
Bien qu'il existe une API spécifique pour accéder à l'I2C, (1) elle n'est pas disponible sur notre version de Linux et (2) l'I2C étant basé sur des flux, il est pratiquement aussi rapide de passer par le système de fichier.
Notre micro-contrôleur possède plusieurs bus I2C et nous utiliserons le bus 1 qui est correspond au fichier /dev/i2c-3
(logique, non ;)).
Avant tout, il faut inclure les en-têtes nécessaires :
#include <linux/i2c.h> #include <sys/ioctl.h> #include <linux/i2c-dev.h> #define MPU6050_ADDR 0x68
Pour y accéder, il faut l'ouvrir :
int fd = open(PATH, O_RDWR); if(fd < 0) error();
Sélectionner le périphérique avec lequel on veut communiquer :
if(ioctl(fd, I2C_SLAVE, MPU6050_ADDR) < 0) error();
Puis utiliser write
pour envoyer des commandes :
uint8_t buf[] = { REGISTER_ADDR, SET_VALUE }; if(write(fd, buf, sizeof(buf)) != sizeof(buf)) error();
Et read
pour lire les réponses :
char buf[2]; if(read(fd, ptr, sizeof(buf)) != sizeof(buf)) error();
ATTENTION Les valeurs 16-bits lues sur l'IMU-6050 sont en big-endian alors que notre processeur fonctionne en little-endian.
Références :