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();
}