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:
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:
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 :
Citation:
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