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.
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.
Risposte:
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
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();
}
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_bcm2708
per il guidatore di basso livello e i2c-dev
per 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_bcm2708
nella lista nera /etc/modprobe.d/raspi-blacklist.conf
per creare /dev/i2c-0
e /dev/i2c-1
mostrare 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.h
con altri dispositivi, purché esista un driver I²C. WiringPi è associato a rPi.
Saluti
Questa informazione è obsoleta. Controlla questo post per l'uso degli alberi dei dispositivi.
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: