Gibt es eine I2C-Bibliothek?

12

Gibt es eine einfache Bibliothek, um mit I2C für C ++ zu sprechen? Ich habe ein paar Sachen für Python und Java gefunden, aber ich wollte C ++. Ich hatte gehofft, dass jemand die Arduino Wire-Bibliothek portiert hat, damit ich Code verwenden kann, den ich bereits für das Arduino geschrieben habe.

Kevin
quelle
2
Mögliches Duplikat von Wie kann ich mit I2C mit Sensoren sprechen?
Alex L
1
Nicht einverstanden ... Ich frage wirklich, ob die Arduino-Verdrahtungsbibliothek auf Pi portiert wurde, damit ich einfach auf dem Pi für Arduino geschriebenen Code verwenden kann. Das scheint nicht der Fall zu sein, daher wäre jede gleichwertige, einfach zu verwendende Bibliothek nett. Das scheint aber auch nicht zu existieren, so dass ich mit dem i2c-dev-Code belassen werde.
Kevin

Antworten:

7

Es gibt einen i2c-dev-Header im Linux-Benutzerbereich. Ich kann mich nicht erinnern, ob dieser Header im Lieferumfang von lm-sensors enthalten ist oder von der Quelle installiert werden muss. Ich würde das Paket-Repository Ihrer Distribution überprüfen. xGoat hat einen schönen Artikel über die Vorbereitung und Verwendung.

#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
*/

Der Quellcode für i2c-tools ( Download ) ist ein gutes Beispiel in C. Ich habe einige einfache C++Bibliotheken gesehen, die diese Funktionen umschließen. Ich würde empfehlen, eine eigene Bibliothek zu erstellen, die Ihren Anforderungen entspricht. Andere großartige Beispiele finden Sie auf Github, wie diese I2CBus- Bibliothek

Emcconville
quelle
5

Ich habe gerade angefangen, die Pigpio-Bibliothek zu benutzen und bin sehr beeindruckt. Besonders gut gefällt mir der Bit-Bang-Modus, da hier zwei beliebige GPIO-Pins als I2C-Schnittstelle verwendet werden können, sofern sie Pullup-Widerstände haben. Wenn Sie einen PI2 verwenden, ist Bit Banging nicht sehr nachteilig, da Sie 4 CPUs haben. Das Schöne an den Bit-Bang-Befehlen ist, dass sie eine Liste der Befehlsbytes "Adresse, Schreiben, Daten, Lesen, Starten, Stoppen" aufnehmen, damit Sie mehrere E / As mit einem einzigen Aufruf ausführen können. Es ist das einzige, was ich gefunden habe, das zuverlässig wiederholte Starttransaktionen ausführt, die von vielen Geräten benötigt werden, die zu Beginn eines Lesebefehls eine Registernummer erhalten. Die Bibliothek ist gut dokumentiert und einfach zu bedienen.

Unten finden Sie ein Testprogramm, das die Temperaturregister eines MAX31785 liest. 4 setzt die Adresse mit dem nächsten Byte, 2 = Start, 7 = Schreiben, gefolgt von einer Byteanzahl und Datenbytes, 3 = Stopp, 6 = Lesen, gefolgt von einer Byteanzahl. Der Aufruf gibt alle gelesenen Datenbytes zusammen mit der Anzahl der Bytes zurück.

#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
quelle
crj11, vielen Dank für das Posten Ihres Codebeispiels. Es war das beste Beispiel, das ich finden und auf den richtigen Weg bringen konnte. Das einzige Problem, das ich damit hatte, war die Verwendung der Bibliothek pigpiod_if.h, für die der Code als sudo ausgeführt werden muss, was für mein Projekt nicht akzeptabel war. Ich konnte auf die Bibliothek pigpiod_if2.h wechseln und ein paar Änderungen vornehmen, und es lief wie ein Champion.
Richard Teel
2

Wie von emcconville erwähnt, gibt es im Linux-Userspace ( #include <linux/i2c-dev.h>) einen i2c-dev-Header . Außerdem benötigen Sie ein Zeichengerät, von dem Sie lesen können. Dies kann durch Laden der richtigen Module erfolgen. i2c_bcm2708für den Low-Level-Fahrer und i2c-devzur Erzeugung des Charakters für die Busse. Anwenden ...

sudo modprobe -r i2c_bcm2708
sudo modprobe i2c_bcm2708 baudrate=32000

zum Laden im laufenden Betrieb. Anwenden ...

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

und Unblacklist i2c_bcm2708in /etc/modprobe.d/raspi-blacklist.confzu machen /dev/i2c-0und/dev/i2c-1 dauerhaft auftauchen.

Ab sofort können Sie den Hinweisen zur Verwendung von I²C folgen del maestro selbst .

Ich bevorzuge diese Methode, weil sie plattformunabhängig ist. Sie können verwendenlinux/i2c-dev.h mit anderen Geräten verwenden, sofern ein I²C-Treiber vorhanden ist. WiringPi ist an das rPi gebunden.

Grüße

AKTUALISIEREN:

Diese Informationen sind veraltet. Überprüfen Sie diesen Beitrag für die Verwendung von Gerätebäumen.

ManuelSchneid3r
quelle
0

Es gibt einen WiringPi der meiner Meinung nach genau das macht was du willst. Es gibt auch Wrapper für Pascal, Java, Python, Perl, TCL und Ruby. Darüber hinaus möchte möglicherweise jemand ähnliche Links untersuchen:

  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
quelle
Nö ... schau nochmal, es funktioniert nicht mit i2c, sondern nur mit grundlegenden Stiftfunktionen. Das Projekt ist etwas irreführend benannt. Ihr erster Link hat einen netten C-Code, aber keinen einfachen Wrapper, um i2c wie bei Arduino auszuführen. Ich werde es wahrscheinlich selbst schreiben müssen.
Kevin
3
WiringPi I2C-Bibliothek: wiringpi.com/reference/i2c-library
avra