IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

Linux Discussion :

comment établir une communication I2C?


Sujet :

Linux

  1. #1
    Futur Membre du Club
    Profil pro
    Inscrit en
    Mars 2012
    Messages
    9
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mars 2012
    Messages : 9
    Points : 8
    Points
    8
    Par défaut comment établir une communication I2C?
    bonsoir,

    dans le cadre d'un projet, je doit établir une communication I2C entre mon PC et une centrale inertiel.

    mon pc détecte bien l' IMU :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    :~# i2cdetect -y -r 3
         0  1  2  3  4  5  6  7  8  9  a  b  c  d  e  f
    00:          -- -- -- -- -- -- -- -- -- -- -- -- -- 
    10: -- -- -- -- -- -- -- -- 18 -- -- -- -- -- 1e -- 
    20: -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- 
    30: -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- 
    40: -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- 
    50: -- -- -- -- UU UU UU UU -- -- -- -- -- -- -- -- 
    60: -- -- -- -- -- -- -- -- -- 69 -- -- -- -- -- -- 
    70: -- -- -- -- -- -- -- --
    mais, mon problème ce situe plutôt au niveaux du code. j'ai peu de connaissance en programmation système, et je ne sais pas à quoi correspond les valeurs d'adresse et de registre . ces valeurs sont-ils spécifique à l'architecture? au matériel détecter ?

    de plus, le code si dessous me renvoi l'erreur 'undefined reference to `i2c_smbus_read_word_data' qui semble être une fonction issue du noyaux, elle n'est donc probablement pas utilisable en espace utilisateur ...

    comment pourrais je gérer la communication sans cette fonctions ?

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    #include <stdio.h>
    #include <stdlib.h>
     
    #include <sys/ioctl.h>
    #include <linux/i2c-dev.h>
     
     
    int main()
    {
     
            int file;
            int adapter_nr = 3; /* probably dynamically determined */
            int addr = 0x40; /* The I2C address */
            __u8 registers = 0x10; /* Device register to access */
            __s32 res;
            char filename[20];
            char buf[10];
     
            sprintf(filename,"/dev/i2c-%d",adapter_nr);
     
            if ((file = open(filename,"r")) < 0)
            {
                    printf("ERROR: /dev/i2c-%d cannot open",adapter_nr );
                    return(-1);
            }
     
     
            if (ioctl(file,I2C_SLAVE,addr) < 0)
            {
                    printf("error");
                    return(-1);
            }
     
            /* Using SMBus commands */ 
            res = i2c_smbus_read_word_data(file,registers);
            if (res < 0)
            {
                    printf("ERROR HANDLING: i2c transaction failed");
            }
     
             else
            {
             printf("%d", (int) res);         //     res contains the read word 
            }
     
     
    return 0;
    }
    de plus, il est dit dans la doc :
    setting the gyro’s slave address to 1101001b and the accelerometer’s slave address to 0011000b by default
    mais à quoi celà coorespond ?à la variable "int addr" ?
    j'espère que vous pourrez m'aiguiller parce que , pour le moment, tout est très floue pour moi ...

    merci
    à bientôt

  2. #2
    Modérateur
    Avatar de Obsidian
    Homme Profil pro
    Développeur en systèmes embarqués
    Inscrit en
    Septembre 2007
    Messages
    7 368
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 47
    Localisation : France, Essonne (Île de France)

    Informations professionnelles :
    Activité : Développeur en systèmes embarqués
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Septembre 2007
    Messages : 7 368
    Points : 23 620
    Points
    23 620
    Par défaut
    Bonjour,

    Citation Envoyé par silesio Voir le message
    de plus, le code si dessous me renvoi l'erreur 'undefined reference to `i2c_smbus_read_word_data' qui semble être une fonction issue du noyaux, elle n'est donc probablement pas utilisable en espace utilisateur ...
    Essaie d'inclure <linux/i2c.h> juste avant <linux/i2c-dev.h>.

    mais à quoi celà coorespond ?à la variable "int addr" ?
    j'espère que vous pourrez m'aiguiller parce que , pour le moment, tout est très floue pour moi ...
    Le bus I²C signifie « Inter Integrated Circuits ». Il s'agit en fait d'un bus série à trois fils accompagné d'un protocole de communication très simple, et qui permet donc de produire à bas coût des circuits intégrés capables de communiquer entre eux ou, à tout le moins, de respecter le même langage, ce qui leur permet d'être interrogé par un petit dispositif maître, comme un micro-processeur.

    C'est un standard défini par Philips au début des années 1980. À défaut d'être très puissant comme USB, c'est un protocole qui est donc compatible même avec de très anciennes générations d'appareils et qui a été porté par l'industrie. Et comme il ne réclame que trois fils et quelques résistances de pull-up, on le retrouve partout : dans le DDC des moniteurs vidéos (le moniteur d'un PC est capable de t'envoyer une petite somme d'octets pour te renvoyer ses caractéristiques (l'EDID)), dans le SMBus des cartes-mères, ce qui permet de faire l'auto-inventaire des équipements présents, etc.

    Le principe est simple : le bus est commun à tous les périphériques, c'est-à-dire que chaque circuit est monté sur le même fil, et chacun de ces périphérique est doté d'un numéro unique : son adresse. Quand le maître veut causer à un périph' en particulier, il envoie un message commençant par cette adresse.

    C'est la même chose que dans un ordinateur d'une manière générale, sauf que les micro-processeurs utilisent des bus parallèles qui véhiculent directement l'information sans avoir à la transmettre bit à bit.

    Du coup, « int addr », c'est simplement la variable qui contiendra à un moment donné le numéro du périphérique auquel tu t'adresses. Et, oui, ça correspond au motif binaire donné par la doc fournie en lien.

Discussions similaires

  1. Comment établir une connection oracle 10g
    Par michouhayoo dans le forum Connexions aux bases de données
    Réponses: 5
    Dernier message: 16/05/2008, 14h42
  2. comment établir une connection de VB avec MYSQL
    Par hhafid dans le forum VB 6 et antérieur
    Réponses: 2
    Dernier message: 23/08/2006, 15h57
  3. [C#] établir une communication entre UsersControl ??
    Par Nycos62 dans le forum Windows Forms
    Réponses: 2
    Dernier message: 16/12/2005, 13h54
  4. Comment établir une connexion internet ?
    Par sigmar_avenger dans le forum Réseau/Web
    Réponses: 3
    Dernier message: 01/09/2005, 13h23
  5. comment établir une liaison usb sous visual c++ ?
    Par Baby_Chou dans le forum MFC
    Réponses: 2
    Dernier message: 03/02/2005, 08h31

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo