Existe-t-il une bibliothèque I2C

12

Existe-t-il une bibliothèque simple pour parler à I2C pour C ++? J'ai trouvé des trucs pour python et Java, mais je voulais C ++. J'espérais que quelqu'un a porté la bibliothèque Arduino Wire afin que je puisse utiliser le code que j'ai déjà écrit pour l'Arduino.

Kevin
la source
1
Pas d'accord ... Je demande vraiment si la bibliothèque de câblage Arduino a été portée sur Pi afin que je puisse utiliser facilement du code écrit pour Arduino sur le Pi. Cela ne semble pas être le cas, donc toute bibliothèque équivalente et facile à utiliser serait bien. Cependant, cela ne semble pas non plus exister, donc il me reste à utiliser le code i2c-dev.
Kevin

Réponses:

7

Il y a un en-tête i2c-dev dans l'espace utilisateur Linux. Je ne me souviens pas si cet en-tête est livré avec le paquet lm-sensor, ou s'il devra être installé depuis la source. Je vérifierais le référentiel de packages de votre distribution. xGoat a un bel article couvrant la préparation et l'utilisation.

#include <linux/i2c-dev.h>
/*
  Including i2c-dev header will allow the following I2C SMBus functions
  - i2c_smbus_access
  - i2c_smbus_write_quick
  - i2c_smbus_read_byte
  - i2c_smbus_write_byte
  - i2c_smbus_read_byte_data
  - i2c_smbus_write_byte_data
  - i2c_smbus_read_word_data
  - i2c_smbus_write_word_data
  - i2c_smbus_process_call
  - i2c_smbus_read_block_data
  - i2c_smbus_write_block_data
  - i2c_smbus_read_i2c_block_data
  - i2c_smbus_write_i2c_block_data
  - i2c_smbus_block_process_call
*/

Le code source des outils i2c ( téléchargement ) en est de bons exemples C. J'ai vu quelques C++bibliothèques simples encapsuler ces fonctions. Je recommanderais de créer votre propre bibliothèque en fonction de vos besoins. D'autres grands exemples peuvent être trouvés sur Github, comme cette bibliothèque I2CBus

emcconville
la source
5

Je viens de commencer à utiliser la bibliothèque pigpio et je suis très impressionné. J'aime particulièrement le mode bit bang, car il vous permet d'utiliser deux broches GPIO comme interface I2C, tant qu'elles ont des résistances de rappel. Si vous utilisez un PI2, il n'y a pas beaucoup d'inconvénient à frapper des bits, car vous avez 4 processeurs. La bonne chose à propos des commandes bit bang est qu'elles prennent une liste d'octets de commande "adresse, écriture, données, lecture, démarrage, arrêt" afin que vous puissiez exécuter plusieurs E / S avec un seul appel. C'est la seule chose que j'ai trouvée qui exécute de manière fiable des transactions de démarrage répétées, qui sont requises par de nombreux appareils qui prennent un numéro de registre au début d'une commande de lecture. La bibliothèque est bien documentée et facile à utiliser.

Ci-dessous, un programme de test qui lit les registres de température sur un MAX31785. 4 définit l'adresse avec l'octet suivant, 2 = début, 7 = écriture qui est suivie d'un nombre d'octets et d'octets de données, 3 = arrêt, 6 = lecture qui est suivie d'un nombre d'octets. L'appel renvoie tous les octets de données lus avec le nombre d'octets.

#include <stdio.h>
#include <stdlib.h>
#include <pigpio.h>

#define MAX31785_TEMP_REG 0x8D
#define MAX31785_TEMP0 6
#define MAX31785_TEMP_INT 12
#define PAGE_REG_OFFSET 6  // Offset in CmdBuf of the page register write value


main( int argc, char *argv[])
{
    int  rcnt;
    char ReadBuf[256];
    char CmdBuf[] = {4, 0x52,  // Chip address
                       2, 7, 2, 0x00, MAX31785_TEMP0, 3,    // Write page register to select temperature sensor
                       2, 7, 1, MAX31785_TEMP_REG, 2, 6, 2, 3, // Read temperature register
                       0 // EOL
                       };

  if (gpioInitialise() < 0) return 1;

  // Open bit banging I2C on standard I2C pins
  if (bbI2COpen(2, 3, 100000)) return 1;

  while(1)
  {
    // Loop over the 7 temp sensors
      for(CmdBuf[PAGE_REG_OFFSET] = MAX31785_TEMP0; CmdBuf[PAGE_REG_OFFSET] <= MAX31785_TEMP_INT; CmdBuf[PAGE_REG_OFFSET]++)  
      {     
    // Read the temp reg for the current page
          rcnt = bbI2CZip(2, CmdBuf, sizeof(CmdBuf), ReadBuf, sizeof(ReadBuf));

          if(rcnt == 2)
            // Print out degrees C
            printf("%2.1f ", (short)(((ReadBuf[1] << 8) | ReadBuf[0]) + 50)/100.0 );
          else
            printf("Error: %d\n", rcnt);
      }

    printf("\n");
    fflush(stdout);
    sleep(1);
  }

  bbI2CClose(2);

  gpioTerminate();
}
crj11
la source
crj11, Merci d'avoir publié votre exemple de code. C'était le meilleur exemple que j'ai pu trouver et me mettre sur la bonne voie. Le seul problème que j'ai eu avec elle était en utilisant la bibliothèque pigpiod_if.h nécessite que le code s'exécute en tant que sudo, ce qui n'était pas acceptable pour mon projet. J'ai pu passer à la bibliothèque pigpiod_if2.h et faire quelques réglages et cela a fonctionné comme un champion.
Richard Teel
2

Comme mentionné par emcconville, il existe un en-tête i2c-dev dans l'espace utilisateur Linux ( #include <linux/i2c-dev.h>). De plus, vous avez besoin d'un périphérique de caractères pour lire. Cela peut être fait en chargeant les modules appropriés. i2c_bcm2708pour le pilote de bas niveau et i2c-devpour générer les décives de caractères pour les bus. Appliquer ...

sudo modprobe -r i2c_bcm2708
sudo modprobe i2c_bcm2708 baudrate=32000

pour les charger à la volée. Appliquer ...

sudo sh -c 'echo "i2c-dev" >> /etc/modules'
sudo sh -c 'echo "options i2c_bcm2708 baudrate=<your preferred baudrate>\n" > /etc/modprobe.d/custom.conf

et retirer de la liste i2c_bcm2708en /etc/modprobe.d/raspi-blacklist.confpour faire /dev/i2c-0et /dev/i2c-1montrer en permanence.

Vous pouvez désormais suivre les conseils d'utilisation de I²C del maestro lui-même.

Je préfère cette méthode car elle est plateformeagnostique. Vous pouvez également l'utiliser linux/i2c-dev.havec d'autres appareils, tant qu'il existe un pilote I²C. WiringPi est lié au rPi.

Cordialement

MISE À JOUR:

Ces informations sont obsolètes. Consultez cet article pour l'utilisation des arborescences d'appareils.

ManuelSchneid3r
la source
0

Il y a un WiringPi qui, je pense, fait exactement ce que vous voulez. Il existe également des wrappers pour Pascal, Java, Python, Perl, TCL et Ruby. De plus, quelqu'un pourrait vouloir explorer des liens similaires:

  1. http://www.susa.net/wordpress/2012/06/raspberry-pi-pcf8563-real-time-clock-rtc/
  2. http://binerry.de/post/26685647322/raspberry-pi-and-i2c
  3. http://www.lazarus.freepascal.org/index.php?topic=17404.0
avra
la source
Non ... regardez à nouveau, il ne fait pas i2c, juste des fonctions de base de broche. Le projet porte un nom quelque peu trompeur. Votre premier lien a un joli code c, mais pas un simple wrapper pour faire i2c comme avec Arduino. Je devrai probablement l'écrire moi-même.
Kevin
3
Bibliothèque WiringPi I2C: câblagepi.com
reference