¿Hay una biblioteca I2C?

12

¿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.

Kevin
fuente
1
No estoy de acuerdo ... Realmente estoy preguntando si la biblioteca de cableado de Arduino se transfirió a Pi para poder usar el código escrito para Arduino fácilmente en el Pi. Ese no parece ser el caso, por lo que cualquier biblioteca equivalente y fácil de usar sería buena. Sin embargo, eso también parece no existir, por lo que me queda usar el código i2c-dev.
Kevin

Respuestas:

7

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

Emcconville
fuente
5

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();
}
crj11
fuente
crj11, gracias por publicar su ejemplo de código. Fue el mejor ejemplo que pude encontrar y ponerme en el camino correcto. El único problema que tuve con el uso de la biblioteca pigpiod_if.h requiere que el código se ejecute como sudo, lo que no era aceptable para mi proyecto. Pude cambiar a la biblioteca pigpiod_if2.h y hacer algunos ajustes y funcionó como un campeón.
Richard Teel
2

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_bcm2708para el conductor de bajo nivel y i2c-devpara 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_bcm2708en la lista negra /etc/modprobe.d/raspi-blacklist.confpara hacer /dev/i2c-0y /dev/i2c-1mostrar 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.hTambién puede usarlo con otros dispositivos, siempre que exista un controlador I²C. WiringPi está vinculado a la rPi.

Saludos

ACTUALIZAR:

Esta información está en desuso. Consulte esta publicación para el uso de árboles de dispositivos.

ManuelSchneid3r
fuente
0

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:

  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
avra
fuente
No ... mira de nuevo, no hace i2c, solo funciones básicas de pin. El proyecto tiene un nombre algo engañoso. Su primer enlace tiene un buen código c, pero no un simple contenedor para hacer i2c como con Arduino. Probablemente tendré que escribirlo yo mismo.
Kevin
3
Biblioteca WiringPi I2C: wirepipi.com/reference/i2c-library
avra