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