Esiste una libreria I2C


12

Esiste una semplice libreria per parlare con I2C per C ++? Ho trovato alcune cose per Python e Java, ma volevo C ++. Speravo che qualcuno avesse portato la libreria di Arduino Wire in modo da poter usare il codice che ho già scritto per Arduino.



1
Non sono d'accordo ... Sto davvero chiedendo se la libreria di collegamenti Arduino è stata trasferita su Pi in modo da poter usare facilmente il codice scritto per Arduino sul Pi. Questo non sembra essere il caso, quindi qualsiasi libreria equivalente e facile da usare sarebbe piacevole. Tuttavia, anche quello sembra non esistere, quindi mi rimane con l'uso del codice i2c-dev.
Kevin

Risposte:


7

C'è un'intestazione i2c-dev nello spazio utente di Linux. Non riesco a ricordare se questa intestazione viene fornita con il pacchetto lm-sensori o se dovrà essere installata dalla fonte. Controllerei il repository dei pacchetti della tua distro. xGoat ha un bell'articolo sulla preparazione e l'uso.

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

Il codice sorgente per i2c-tools ( download ) sono buoni esempi in C. Ho visto alcune semplici C++librerie che avvolgono queste funzioni. Consiglierei di creare la tua biblioteca in base alle tue esigenze. Altri grandi esempi possono essere trovati su Github, come questa libreria I2CBus


5

Ho appena iniziato a utilizzare la libreria pigpio e sono rimasto molto colpito. Mi piace soprattutto la modalità bit bang, poiché consente di utilizzare due pin GPIO come interfaccia I2C, purché abbiano resistori pullup. Se stai usando un PI2, non ci sono molti svantaggi nel bit bang, dato che hai 4 CPU. La cosa bella dei comandi bit bang è che prendono un elenco di byte di comando "indirizzo, scrittura, dati, lettura, avvio, arresto" in modo da poter eseguire più I / O con una sola chiamata. È l'unica cosa che ho scoperto che esegue in modo affidabile transazioni di avvio ripetute, richieste da molti dispositivi che accettano un numero di registro all'inizio di un comando di lettura. La biblioteca è ben documentata e facile da usare.

Di seguito è riportato un programma di test che legge i registri di temperatura su un MAX31785. 4 imposta l'indirizzo con il byte successivo, 2 = start, 7 = write, seguito da un conteggio byte e byte di dati, 3 = stop, 6 = read seguito da un conteggio byte. La chiamata restituisce tutti i byte di dati letti insieme al numero di byte.

#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, grazie per aver pubblicato il tuo esempio di codice. È stato l'esempio migliore che sono stato in grado di trovare e mettermi sulla buona strada. L'unico problema che ho riscontrato è stato l'utilizzo della libreria pigpiod_if.h che richiede l'esecuzione del codice come sudo, il che non era accettabile per il mio progetto. Sono stato in grado di passare alla libreria pigpiod_if2.h e fare alcune modifiche e ha funzionato come un campione.
Richard Teel,

2

Come accennato da emcconville c'è un'intestazione i2c-dev nello spazio utente di Linux ( #include <linux/i2c-dev.h>). Inoltre è necessario un dispositivo a caratteri da cui leggere. Questo può essere fatto caricando i moduli corretti. i2c_bcm2708per il guidatore di basso livello e i2c-devper generare i caratteri decimali per gli autobus. Applicare ...

sudo modprobe -r i2c_bcm2708
sudo modprobe i2c_bcm2708 baudrate=32000

per caricarli al volo. Applicare ...

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

e i2c_bcm2708nella lista nera /etc/modprobe.d/raspi-blacklist.confper creare /dev/i2c-0e /dev/i2c-1mostrare in modo permanente.

Da ora in poi puoi seguire i suggerimenti su come usare I²C del maestro stesso.

Preferisco questo metodo perché è platformagnostico. Puoi usarlo anche linux/i2c-dev.hcon altri dispositivi, purché esista un driver I²C. WiringPi è associato a rPi.

Saluti

AGGIORNARE:

Questa informazione è obsoleta. Controlla questo post per l'uso degli alberi dei dispositivi.


0

C'è un WiringPi che penso faccia esattamente quello che vuoi. Ci sono anche wrapper per Pascal, Java, Python, Perl, TCL e Ruby. Inoltre, qualcuno potrebbe voler esplorare collegamenti simili:

  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

No ... guarda ancora, non fa i2c, solo funzioni pin di base. Il progetto ha un nome un po 'fuorviante. Il tuo primo link ha un bel codice c, ma non un semplice wrapper per fare i2c come con Arduino. Probabilmente dovrò scriverlo da solo.
Kevin

3
Libreria WiringPi I2C: cablaggiopi.com/reference/i2c-library
avra
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.