¿Hay una biblioteca simple para hablar con I2C para C ++? He encontrado algunas cosas para Python y Java, pero quería C ++. Esperaba que alguien haya portado la biblioteca Arduino Wire para poder usar el código que ya he escrito para Arduino.
¿Hay una biblioteca simple para hablar con I2C para C ++? He encontrado algunas cosas para Python y Java, pero quería C ++. Esperaba que alguien haya portado la biblioteca Arduino Wire para poder usar el código que ya he escrito para Arduino.
Respuestas:
Hay un encabezado i2c-dev en el espacio de usuario de Linux. No recuerdo si este encabezado se envía con el paquete lm-sensores, o si será necesario instalarlo desde la fuente. Verificaría el repositorio de paquetes de su distribución. xGoat tiene un buen artículo sobre preparación y 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
*/
El código fuente de las herramientas i2c ( descarga ) son buenos ejemplos en C
. He visto algunas C++
bibliotecas simples que envuelven estas funciones. Recomiendo crear su propia biblioteca para satisfacer sus necesidades. Se pueden encontrar otros excelentes ejemplos en Github, como esta biblioteca I2CBus
Acabo de comenzar a usar la biblioteca pigpio y estoy muy impresionado. Me gusta especialmente el modo bit bang, ya que le permite usar dos pines GPIO como interfaz I2C, siempre que tengan resistencias pullup. Si está utilizando un PI2, no hay mucha desventaja en el bit bitging, ya que tiene 4 CPU. Lo bueno de los comandos bit bang es que toman una lista de bytes de comando "dirección, escritura, datos, lectura, inicio, detención" para que pueda ejecutar múltiples E / S con una sola llamada. Es lo único que he encontrado que ejecuta de manera confiable transacciones de inicio repetidas, que son requeridas por muchos dispositivos que toman un número de registro al comienzo de un comando de lectura. La biblioteca está bien documentada y es fácil de usar.
A continuación se muestra el programa de prueba que lee los registros de temperatura en un MAX31785. 4 establece la dirección con el siguiente byte, 2 = inicio, 7 = escritura que es seguida por un conteo de bytes y bytes de datos, 3 = parada, 6 = lectura que es seguida por un conteo de bytes. La llamada devuelve los bytes de datos leídos junto con el 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();
}
Como mencionó emcconville, hay un encabezado i2c-dev en el espacio de usuario de Linux ( #include <linux/i2c-dev.h>
). Además, necesita un dispositivo de caracteres para leer. Esto se puede hacer cargando los módulos correctos.
i2c_bcm2708
para el conductor de bajo nivel y i2c-dev
para generar el personaje desciende para los autobuses. Aplicar ...
sudo modprobe -r i2c_bcm2708
sudo modprobe i2c_bcm2708 baudrate=32000
para cargarlos sobre la marcha. Aplicar ...
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
y no incluir i2c_bcm2708
en la lista negra /etc/modprobe.d/raspi-blacklist.conf
para hacer /dev/i2c-0
y /dev/i2c-1
mostrar permanentemente.
A partir de ahora puedes seguir las sugerencias sobre cómo usar el propio I²C del maestro.
Prefiero este método porque es platformagnóstico. linux/i2c-dev.h
También puede usarlo con otros dispositivos, siempre que exista un controlador I²C. WiringPi está vinculado a la rPi.
Saludos
Esta información está en desuso. Consulte esta publicación para el uso de árboles de dispositivos.
Hay un WiringPi que creo que hace exactamente lo que quieres. También hay envoltorios para Pascal, Java, Python, Perl, TCL y Ruby. Además, alguien podría querer explorar enlaces similares: