Comecei a usar a biblioteca pigpio e estou muito impressionado. Eu gosto especialmente do modo bit bang, pois permite que você use dois pinos GPIO como interface I2C, desde que tenham resistores de pullup. Se você estiver usando um PI2, não há muita desvantagem em bit bang, pois você tem 4 CPUs. O bom dos comandos bit bang é que eles recebem uma lista de bytes de comando "endereço, gravação, dados, leitura, início, parada" de comando, para que você possa executar várias E / Ss com uma única chamada. Foi a única coisa que descobri que executa transações de início repetidas de maneira confiável, exigidas por muitos dispositivos que recebem um número de registro no início de um comando de leitura. A biblioteca está bem documentada e fácil de usar.
Abaixo está o programa de teste que lê os registros de temperatura no MAX31785. 4 define o endereço com o próximo byte, 2 = início, 7 = gravação, que é seguido por uma contagem de bytes e bytes de dados, 3 = parada, 6 = leitura, que é seguido por uma contagem de bytes. A chamada retorna todos os bytes de dados lidos junto com o número de bytes.
#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();
}