====== I2C ====== ===== En ligne de commande ===== Pour obtenir la liste des ports I2C disponible: i2cdetect -y -l Pour liste les périphériques disponibles sur le bus (//PORT// est le numéro du port I2C) : i2cdetect -y -r PORT Pour écrire dans un registre I2C //REG// la valeur //VAL// du périphérique PER (//REG//, //VAL// et //PER// en hexadécimal) : i2cset -y PORT PER REG VAL Pour lire un registre //REG// de 8-bits: i2cget -y PORT PER REG Pour lire un registre //REG// de 16-bits: i2cget -y PORT PER REG w Références : * [[http://elinux.org/Interfacing_with_I2C_Devices|périphériques /dev]] * [[https://i2c.wiki.kernel.org/index.php/Main_Page|documentation du noyau]]. ===== En C ===== Bien qu'il existe une API spécifique pour accéder à l'I2C, (1) elle n'est pas disponible sur notre version de Linux et (2) l'I2C étant basé sur des flux, il est pratiquement aussi rapide de passer par le système de fichier. Notre micro-contrôleur possède plusieurs bus I2C et nous utiliserons le bus 1 qui est correspond au fichier ''/dev/i2c-3'' (logique, non ;)). Avant tout, il faut inclure les en-têtes nécessaires : #include #include #include #define MPU6050_ADDR 0x68 Pour y accéder, il faut l'ouvrir : int fd = open(PATH, O_RDWR); if(fd < 0) error(); Sélectionner le périphérique avec lequel on veut communiquer : if(ioctl(fd, I2C_SLAVE, MPU6050_ADDR) < 0) error(); Puis utiliser ''write'' pour envoyer des commandes : uint8_t buf[] = { REGISTER_ADDR, SET_VALUE }; if(write(fd, buf, sizeof(buf)) != sizeof(buf)) error(); Et ''read'' pour lire les réponses : char buf[2]; if(read(fd, ptr, sizeof(buf)) != sizeof(buf)) error(); **ATTENTION** Les valeurs 16-bits lues sur l'IMU-6050 sont en big-endian alors que notre processeur fonctionne en little-endian. Références : * http://www.unixgarden.com/index.php/gnu-linux-magazine-hs/un-capteur-de-temperature-sur-bus-i2c|article général]] * https://www.kernel.org/doc/htmldocs/device-drivers/i2c.html