On va accéder aux périphériques I2C via l'interface /dev. Il faut d’abord charger le module i2c-dev.
Chaque périphérique I2C est assigné à un nombre entre 0 et 255 (je l’appellerai n dans la suite). Pour voir la liste des périphériques I2C installer "i2c-tools" et tapez la commande "i2cdetect -l":
debarm:~# apt-get install i2c-tools
debarm:~# i2cdetect -l
i2c-0 i2c i2c-gpio-1 I2C adapter
Les périphériques I2C sont représentés par des fichiers de périphérique en mode caractère avec 89 comme numéro majeur et n comme numéro mineur. On peut les trouver dans /dev.
Ils doivent être nommés "i2c-n". On peut en créer un manuellement :
debarm:~# mknod /dev/i2c-0 c 89 0
Pour travailler avec l'I2C il faut inclure la bibliothèque "linex/i2c-dev.h" distribuée avec i2c-tools.
Voici une classe qui permet d'utiliser facilement l'I2C sur la fox, il faut lui donner l'adresse du périphérique et le numéro du périphérique (n). Si le fichier /dev/i2c-n n’existe pas, il est automatiquement créé.
I2C_Device.h :
/*
* I2C_Device.h
*
* Created on: 14 juin 2011
* Author: Eliott
*/
#ifndef I2C_DEVICE_H_
#define I2C_DEVICE_H_
#include "linux/i2c-dev.h" // a copier de la fox : /usr/include/linux et aussi types.h
#include <sys/ioctl.h>
#include <iostream>
#include <stdlib.h>
#include <fcntl.h>
#include <stdio.h>
using namespace std;
class I2C_Device {
public:
I2C_Device(unsigned char slave_adress,int numero_device);
~I2C_Device();
protected :
void writeNBytes(char bytes[],int n);
void readNBytes( char bytes[],int n);
private :
int device;
};
#endif /* I2C_DEVICE_H_ */
I2C_Device.cpp :
#include "I2C_Device.h"
I2C_Device::I2C_Device(unsigned char slave_adress,int numero_device) {
char filename[20];
sprintf(filename,"/dev/i2c-%d",numero_device);
device = open(filename, O_RDWR);
if (device < 0) { // si le fichier device n'existe pas
cout<<"ERROR : "<<filename<<" n'existe pas, creation..."<<endl;
char commande[40];
sprintf(commande,"mknod /dev/i2c-%d c 89 0",numero_device);
system(commande); // on le creer avec mknod
usleep(1000);
device = open(filename, O_RDWR);
if (device < 0) { // on l'ouvre et c'est bon
cout<<"ERROR : open"<<endl;
exit(1);
}
}
if (ioctl(device, I2C_SLAVE, slave_adress) < 0) {
cout<<"ERROR : ioctl"<<endl;
exit(1);
}
}
//***********************************************************************
I2C_Device::~I2C_Device() {
close(device);
}
//***********************************************************************
void I2C_Device::writeNBytes(char bytes[],int n){
if (write(device, bytes, n) !=n) {
cout<<"ERROR : write"<<endl;
}
}
//***********************************************************************
void I2C_Device::readNBytes(char bytes[],int n){
if ((read(device,bytes,n))!=n) {
cout<<"ERROR : read"<<endl;
}
}
