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; } }
Aucun commentaire:
Enregistrer un commentaire