Master SIAME | Université Toulouse 3

Internet of things and System on Chip

Master SIAME | Université Toulouse 3

Internet of things and System on Chip

User Tools


Table of Contents

I2C

En ligne de commande

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 :

En C

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 :